【问题标题】:Why does my while loop not go out when the element is not displayed?为什么我的while循环在元素不显示的时候不出去?
【发布时间】:2019-06-15 00:05:35
【问题描述】:

我在 selenium 和 c# 中进行了自动化测试,以循环遍历分页页面,即下一个按钮。当循环开始时,它会捕获第一个正确的下一个按钮,但随后会转到没有下一个按钮但循环继续并引发异常的下一页

NoSuchElementException:没有这样的元素:无法找到元素: {"method":"xpath","selector":"//button[@class='vt-client-paged-list__page-button vt-client-paged-list--button-visible'][text()='Next']"}

现在它当然会抛出异常,因为没有显示下一个按钮,因此它找不到元素。

while (_vechRep.btnNextDriver.Displayed && _vechRep.btnNextDriver.Enabled) {

    System.Threading.Thread.Sleep(2000);
    _vechRep.btnNextDriver.Click();
    System.Threading.Thread.Sleep(2000);
    expectedCount = expectedCount + _vechRep.noDriverRows.Count;

}

当下一个按钮不可见时,它应该退出循环。

【问题讨论】:

  • 嗨 HimBromBeere 我不明白 vechRep.btnNextDriver 是下一个按钮
  • 我认为解决方案是获取元素的数量并运行 while 循环直到 count >0。
  • 但是如何合并下一个按钮,因为行数可能会变得更大,所以计数会更大?你能写一些代码来展示一个例子吗

标签: c# selenium-webdriver while-loop


【解决方案1】:

循环失败,因为为了测试条件,它必须测试条件

while 循环状态:

while(_vechRep.btnNextDriver.Displayed && _vechRep.btnNextDriver.Enabled)

这意味着它每次迭代都会寻找_vechRep.btnNextDriver 的存在。由于您已移至下一页,因此它不再存在;因此你的错误。循环无法检查.Displayed.Enabled,因为它不存在。

相反,您需要更改 while 循环检查按钮(或对象或您拥有的东西)是否存在。 Java 代码是:

List<WebElement> things = getDriver().findElements(By.xpath("//button[@class='vt-client-paged-list__page-button vt-client-paged-list--button-visible'][text()='Next'"));
while(things.size() > 0) {
    // Do stuff
    things = getDriver().findElements(By.xpath("//button[@class='vt-client-paged-list__page-button vt-client-paged-list--button-visible'][text()='Next'"));
}

基本上,在循环之前,分配一个变量来保存 WebElements 数组(即使您只期望一个)。然后对于 while 循环条件,测试是否至少还有一个。如果有,做任何你需要做的事情。然后作为循环中的最后一条语句,重新分配测试变量以重新计算实例数。如果它不再存在,while 循环会安全地说页面上没有,然后继续执行下一段代码。

关键是.findElement()必须至少找到一个元素,否则会失败。即使元素为零,复数 .findElements() 仍然有效。

【讨论】:

  • @Hyper6217 你能更具体一点吗?正如我所说,这个例子是用 Java 编写的。您需要转换为 C#
猜你喜欢
  • 2017-09-18
  • 2018-08-18
  • 2012-11-07
  • 2019-05-10
  • 1970-01-01
  • 2011-11-12
  • 2012-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多