当没有元素

时间:2018-05-25 10:54:20

标签: java selenium selenium-webdriver

如何更改此方法以使用不同数量的元素? 有时可能有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());
    }

2 个答案:

答案 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());
}