Selenium 将文本框视为隐藏,即使我可以在浏览器中看到它

Selenium sees textbox as hidden even if I can see it in the browser

我有一个类似这样的密码文本框

<input class="blahblah" id="someId"  type="password"></input>

我能够在浏览器中看到这个文本框,并且能够手动输入密码。

然而,当我使用 selenium 测试这个 ui 时,虽然它找到了正确的元素,但是当它试图点击该元素时,它会抛出一个错误 "org.openqa.selenium.ElementNotVisibleException: Element is not currently visible and so may not be interacted with"

我使用

进行了代码签入
Boolean isDisplayed=el.isDisplayed();//false
Boolean isEnabled=el.isEnabled();//true

isDisplayed 出现了 false 并且 isEnabled 出现了 true。添加了 15 秒的延迟,以便为页面提供足够的加载时间(页面立即加载)。所以增加延迟并不能解决问题。

我使用 firefox 开发者工具验证它找到的 id 是正确的元素。

为什么selenium 认为它是不可见的,即使我能够在浏览器中看到它?可能是其中一个父元素具有硒不喜欢的某些样式属性吗?或者它是 selenium 驱动程序中的错误?

我正在使用 java 版本 2.45.0

的 selenium 驱动程序

可能是 Selenium 在您的 DOM 中运行得太快了。我遇到过好几次,你的元素还没有完全加载到 DOM.

我更熟悉可用于 Selenium 的 PHP/PHPUnit 库,但也许您可以使用类似于 waitForElementPresent 的命令引入临时等待。

此外,如果您可以控制代码,是否也可以为您的输入字段提供 'name' 属性?这样做不会有任何伤害。

查看 DOM 元素并确认不存在带有显示的父元素:none 等,当我遇到这样的问题时就是问题所在。

你能用XPath从元素中获取信息吗?这是我的解决方法。

我遇到过很多次这样的问题。我想到的第一件事可能是您使用的选择器不是唯一的或者不是 returning THE 您正在寻找的元素。因为,

Boolean isDisplayed=el.isDisplayed();//false Boolean isEnabled=el.isEnabled();//true

没有 return NoSuchElement 异常 我认为这不是元素加载问题。快速检查可以告诉您发生了什么

driver.findElements(By.cssSelector("the css")).size(); 看看有多少人算 returns.

问题是所需的 input 实际上是不可见的,因为 display: none 设置在它的父级 table:

<table title="Type a password."
       class="dxeTextBoxSys dxeTextBox_MyCompany  "
       id="ctl00_ctl00_MasterContent_MainContentPlaceHolder_ViewCredentials_TopicPanel1_credentialGrid_editnew_4_txtPassword_P_PB"
       style="width: 100%; border-collapse: collapse; display: none;"
       border="0" cellpadding="0" cellspacing="0">

最有可能的是,table 在您需要确定的特定用户操作中变得可见。

但是,您也可以通过 javascript:

使 table 可见
WebElement table = driver.findElement(By.id("ctl00_ctl00_MasterContent_MainContentPlaceHolder_ViewCredentials_TopicPanel1_credentialGrid_editnew_4_txtPassword_P_PB")); 
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("arguments[0].style.display = 'block';", table);

如果以上没有任何区别。

还有一个重要的隐藏密码input

<input value=""
       name="ctl00$ctl00$MasterContent$MainContentPlaceHolder$ViewCredentials$TopicPanel1$credentialGrid$editnew_4$txtPassword$P$PB$CVS"
       type="hidden"> 

您可以尝试使其可见并向其发送密钥:

WebElement password = driver.findElement(By.name("ctl00$ctl00$MasterContent$MainContentPlaceHolder$ViewCredentials$TopicPanel1$credentialGrid$editnew_4$txtPassword$P$PB$CVS")); 

JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("arguments[0].setAttribute('type', 'text');", password);

password.sendKeys("MyPassword");

如果上面的方法不起作用。

您可以通过javascript设置输入值:

JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("document.getElementById('ctl00_ctl00_MasterContent_MainContentPlaceHolder_ViewCredentials_TopicPanel1_credentialGrid_editnew_4_txtPassword_P_PB_I').setAttribute('value', 'MyPassword');");