如何更改此方法以使用不同数量的元素? 有时可能有3个元素,另一个时间5。 我希望这个循环能够找到元素,只要它能找到它,如果没有,就可以打破。 现在,当只有3个元素时,会出现“无法定位元素”的错误,并且测试失败。
public void checkProductsInOrder() {
for (int i = 1; i <= 5; i++) {
WebElement element = driver.findElement(By.xpath("(//td[@data-id=\"product_name\"])[" + i + "]"));
wait.until(ExpectedConditions.visibilityOf(element));
productsInOrder.add(element.getText());
}
答案 0 :(得分:5)
您可以使用findElements
方法查找所有匹配的元素,然后仅针对匹配的元素迭代循环。 findElements
方法将根据定位器找到所有匹配的元素。
请检查修改后的代码
//It will match all the product name based on the xpath (index alone needs to be removed from your index)
List<WebElement> element = driver.findElements(By.xpath("(//td[@data-id='product_name'])"));
int size=element.size();
for(int i=0;i<size;i++){
productsInOrder.add(element.get(i).getText());
}
答案 1 :(得分:2)
这不是特定于Selenium(在这种情况下,it seems there's a better solution),但有时API不会为您提供多个选项,因此值得知道:
从Java中的文件中读取行时,这是一种常见的模式。在while循环之前声明一个变量,并在条件内分配和比较它。我还将findElement
重构为自己的方法以提高可读性。
private WebElement findElement(final int num)
{
return driver.findElement(
By.xpath("(//td[@data-id=\"product_name\"])[" + num + "]")
);
}
您的方法如下:
WebElement element;
int count = 0;
while ((element = findElement(count++)) != null)
{
wait.until(ExpectedConditions.visibilityOf(element));
productsInOrder.add(element.getText());
}