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');");
我有一个类似这样的密码文本框
<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');");