当元素不显示时,为什么我的while循环不消失?

时间:2019-06-14 10:58:01

标签: c# selenium-webdriver while-loop

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

  

NoSuchElementException:没有这样的元素:无法找到元素:   {“方法”:“ xpath”,“选择器”:“ // 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;

}

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

1 个答案:

答案 0 :(得分:2)

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

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'"));
}

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

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