我已经在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;
}
当下一个按钮不可见时,它应该退出循环。
答案 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()
仍然有效。