"元素目前不可见,因此可能无法与之交互"但另一个是?

ton*_*ung 8 c# angularjs selenium-webdriver angular-strap

我创建了另一个问题,我认为是导致此错误的原因:为什么Selenium Firefox驱动程序会在父进程溢出时认为我的模态没有显示:隐藏?

Selenium版本2.33.0
Firefox驱动程序

导致错误的代码:

        System.Threading.Thread.Sleep(5000);
        var dimentions = driver.Manage().Window.Size;
        var field = driver.FindElement(By.Id("addEmployees-password")); //displayed is true
        field.Click(); //works fine
        var element = driver.FindElement(By.Id(buttonName)); //displayed is false
        element.Click(); //errors out
Run Code Online (Sandbox Code Playgroud)

它试图点击的按钮:

<div id="addEmployees" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="addEmployeesLabel" aria-hidden="true">

    <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
        <h3>Add Employee</h3>
    </div>

    <div class="modal-body">
        <p class="alert alert-info">
            <input name="addEmployees-username" id="addEmployees-username" />
            <input name="addEmployees-password" id="addEmployees-password" type="password" />
            <input name="addEmployees-employee" id="addEmployees-employee" />
        </p>
    </div>

    <div class="modal-footer">
        <button name="addEmployees-add" id="addEmployees-add" type="button" class="btn" data-ng-click="submit()">Add</button>
    </div>

</div>
Run Code Online (Sandbox Code Playgroud)
  • 如果我将调用更改为FindElements然后我得到一个元素,所以页面上没有任何其他内容.
  • 如果我FindElement在按钮之前发生的字段上addEmployees-employee,那么addEmployees-employee就是displayed
  • 在浏览器本身,它显示正常,我需要做的只是单击按钮并执行所需的行为,但webdriver拒绝考虑显示的元素

如何将一个字段视为显示而另一个字段不显示?

在此输入图像描述

右下方有添加按钮的模式,显示所有其他元素= true

窗口大小为1200x645每driver.Manage().Window.Size;
元素位置为:800x355y每 driver.FindElement(By.Id(buttonName)).Location
元素尺寸为:51x30每个 driver.FindElement(By.Id(buttonName)).Size
密码元素位置为:552x233y每 driver.FindElement(By.Id("addEmployees-password")).Size

Jim*_*mes 5

Brian的回答是正确的:使用明确的等待而不是Thread.Sleep().睡眠()通常是脆弱的,你不必要地失去了五秒钟,而且它只是一个非常糟糕的自动测试练习.(我花了很长时间才知道这一点,所以你并不孤单.)

避免隐式等待.它们通常用于添加到DOM的新项目,而不是用于转换为模式以使其变为活动状态.

显式等待有很多预期条件(详见Javadox),它可以帮助您解决这些问题.使用与您下一步操作所需的状态相匹配的ExpectedCondition.

此外,请参阅Ian Rose关于该主题的精彩博文.


bbb*_*bco 4

Selenium WebDriver 不仅检查当前元素上的 opacity != 0、visibility = true、height > 0 和 display != none,而且还会搜索 DOM 的祖先链以确保没有父元素也存在匹配这些跳棋。(更新查看所有绑定引用的 JSON 线代码后,SWD 还需要溢出!=隐藏以及 其他一些情况。)

按照 @Brian 的建议,在重构代码之前我会做两件事。

  1. 确保“div.modal_footer”元素没有任何理由让 SWD 认为它不可见。

  2. 注入一些 Javascript 以突出显示浏览器中的相关元素,这样您就绝对知道您选择了正确的元素。您可以使用此要点作为起点。如果该按钮以黄色边框突出显示,则表明您选择了正确的元素。如果不是,则意味着所选元素位于 DOM 中的其他位置。如果是这种情况,您可能没有预期的唯一 ID,这使得 DOM 的操作非常混乱。

如果我必须猜测的话,我会说第二个就是你遇到的情况。我也遇到过这种情况,开发人员重复使用了元素 ID,导致您应该查找哪个元素发生争用。