Как выполнить рефакторинг для метода цикла, чтобы разорвать, когда нет элементов - PullRequest
0 голосов
/ 25 мая 2018

Как я могу изменить этот метод для работы с разным количеством элементов?Иногда может быть, например, 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 голосов
/ 25 мая 2018

Это не относится к Selenium (в этом случае кажется, что есть лучшее решение ), но иногда 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());
}
0 голосов
/ 25 мая 2018

Вы можете использовать метод 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()); 
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...