【问题标题】:Selenium sees textbox as hidden even if I can see it in the browserSelenium 将文本框视为隐藏,即使我可以在浏览器中看到它
【发布时间】:2015-05-28 12:16:47
【问题描述】:

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

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

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

但是,当我使用 selenium 测试此 ui 时,虽然它正确找到了元素,但是当它尝试单击该元素时,它会抛出错误 “org.openqa.selenium.ElementNotVisibleException:元素当前不可见,因此可能无法与之交互”

我使用

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

isDisplayed 出现了 falseisEnabled 出现了 true。添加了 15 秒的延迟以使页面有足够的时间加载(页面立即加载)。所以添加延迟并不能解决问题。

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

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

我正在使用 Java 版本 2.45.0 的 selenium 驱动程序

【问题讨论】:

  • 需要更多信息在这里。共享页面的 URL,或者尽可能多的 HTML 在这里有意义。有一些想法,但首先需要这个。谢谢。
  • 它不是一个可公开访问的网址。该页面是使用 asp.net 生成的,因此其中包含大量垃圾。 (旧代码)
  • 谢谢,你能至少显示几个密码输入的父母吗?或者,完整的表格。
  • 我敢打赌,密码字段有一个嵌套输入。我不得不处理同样的垃圾。最后,不得不通过JavaScriptExecutor设置密码
  • 在信息太少的情况下盲目射击,但我有时会看到 Selenium 认为对象是 scrolled off of the screen 的问题。

标签: java javascript css selenium selenium-webdriver


【解决方案1】:

可能,Selenium 在您的 DOM 中运行得太快了。发生在我身上好几次了,你的元素还没有完全加载到 DOM 中。

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

另外,如果您可以控制代码,您是否也可以为您的输入字段添加一个“名称”属性?这样做不会有什么坏处。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 是的,直接父母有显示:无;
    【解决方案3】:

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

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

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

    driver.findElements(By.cssSelector("the css")).size(); 看看它返回了多少计数。

    【讨论】:

    • 当你说“css”是指文本框的css吗?请注意,它嵌套在许多父元素中,其中许多元素都有自己的 CSS,此文本框继承。
    • 对不起,你可以用 id 代替。这只是一个例子。或将[type='password'] 用作cssSelector
    【解决方案4】:

    问题是所需的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');");
    

    【讨论】:

    • 这行得通。 JavascriptExecutor jse = (JavascriptExecutor)驱动程序; jse.executeScript("document.getElementById('ctl00_ctl00_MasterContent_MainContentPlaceHolder_ViewCredentials_TopicPanel1_credentialGrid_editnew_4_txtPassword_P_PB_I').setAttribute('value', 'MyPassword');");
    猜你喜欢
    • 2023-04-10
    • 2019-10-05
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 2021-03-23
    • 2019-02-22
    相关资源
    最近更新 更多