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如何将一个字段视为显示而另一个字段不显示?

右下方有添加按钮的模式,显示所有其他元素= 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
Brian的回答是正确的:使用明确的等待而不是Thread.Sleep().睡眠()通常是脆弱的,你不必要地失去了五秒钟,而且它只是一个非常糟糕的自动测试练习.(我花了很长时间才知道这一点,所以你并不孤单.)
避免隐式等待.它们通常用于添加到DOM的新项目,而不是用于转换为模式以使其变为活动状态.
显式等待有很多预期条件(详见Javadox),它可以帮助您解决这些问题.使用与您下一步操作所需的状态相匹配的ExpectedCondition.
此外,请参阅Ian Rose关于该主题的精彩博文.
Selenium WebDriver 不仅检查当前元素上的 opacity != 0、visibility = true、height > 0 和 display != none,而且还会搜索 DOM 的祖先链以确保没有父元素也存在匹配这些跳棋。(更新查看所有绑定引用的 JSON 线代码后,SWD 还需要溢出!=隐藏,以及 其他一些情况。)
按照 @Brian 的建议,在重构代码之前我会做两件事。
确保“div.modal_footer”元素没有任何理由让 SWD 认为它不可见。
注入一些 Javascript 以突出显示浏览器中的相关元素,这样您就绝对知道您选择了正确的元素。您可以使用此要点作为起点。如果该按钮以黄色边框突出显示,则表明您选择了正确的元素。如果不是,则意味着所选元素位于 DOM 中的其他位置。如果是这种情况,您可能没有预期的唯一 ID,这使得 DOM 的操作非常混乱。
如果我必须猜测的话,我会说第二个就是你遇到的情况。我也遇到过这种情况,开发人员重复使用了元素 ID,导致您应该查找哪个元素发生争用。
| 归档时间: |
|
| 查看次数: |
28393 次 |
| 最近记录: |