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

时间:2015-03-25 00:12:24

标签: java javascript css selenium selenium-webdriver

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

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

我可以在浏览器中看到此文本框,并且可以手动插入密码。

然而,当我使用selenium测试这个ui时,虽然它正确地找到了元素,但是当它试图单击该元素时,它会抛出一个错误 &#34; org.openqa.selenium.ElementNotVisibleException:元素当前不可见,因此可能无法与&#34;

进行交互

我使用

检查了代码
Boolean isDisplayed=el.isDisplayed();//false
Boolean isEnabled=el.isEnabled();//true

isDisplayed出现falseisEnabled出现true。添加了15秒的延迟以使页面有足够的时间加载(页面立即加载)。因此,添加延迟无法解决问题。

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

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

我正在使用selenium驱动程序用于java版本2.45.0

4 个答案:

答案 0 :(得分:3)

问题在于,由于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">

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

但是,您也可以通过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');");

答案 1 :(得分:1)

可能,Selenium通过你的DOM过快了。和我发生了好几次,你的元素还没有完全加载到DOM中。

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

此外,如果您可以控制代码,是否也可以为输入字段指定“名称”属性?这样做不会有任何伤害。

答案 2 :(得分:1)

看看DOM元素并验证没有带有display:none等的父元素,当我遇到这样的问题时就是问题。

您是否能够通过XPath从元素中获取信息?这是我的工作。

答案 3 :(得分:1)

我多次遇到过这种问题。我想到的第一件事可能是您使用的选择器不是唯一的或者没有返回您正在寻找的 元素。从那以后,

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

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

driver.findElements(By.cssSelector("the css")).size();并查看它返回的计数。