t.me/atinfo_chat Telegram группа по автоматизации тестирования

Стабилизация тестов, как реализовать повторную проверку с получением getText() если assertEquals вернул False?

assert
api
java
webdriver
Теги: #<Tag:0x00007fb2fb40bae0> #<Tag:0x00007fb2fb40b978> #<Tag:0x00007fb2fb40b810> #<Tag:0x00007fb2fb40b6a8>

(Andrey Andrey) #1

Всем привет, нужна помощь.
Как обрабатывать неуспешный результат проверки.
Есть проверка:
assertEquals(driver.findElement(By.xpath("//*[@class='TEST']")).getText(),value)
Так как значение меняется после действий на сайте, API не всегда отрабатывает быстро и метод getText() получает еще старые данные, соответственно тест падает.
Нужна помощь с реализацией повторной проверки, к примеру добавив таймаут? По аналогии метода isDisplayed() таймаут которого выставляется с помощью implicitlyWait


(Vasily) #2

Используйте https://selenium.dev/selenium/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions
Например:
wait.until(ExpectedConditions.textToBePresentInElementLocated(By.xpath("//*[@class=‘TEST’]")), value));


(Vladislav Sobol) #3

Использовать waitUntill

WebElement element = driver.findElement(By.xpath("//*[@class=‘TEST’]"));
wait.until(webDriver -> element.getText().equals(“YOR TEXT”));

Еще так можно. но будет не столь лаконично

WebElement element;
int attempt = 0;
boolean textIsPresent = false;
while (attempt < 3 && !textIsPresent) {
attempt++;
element = driver.findElement(By.xpath("//*[@class=‘TEST’]"));
textIsPresent = element.getText().equals(“YOR TEXT”);
}

(Sergei) #4

Владислав, что-то вы явно лишних переменных наделали, да while тут тоже не к месту, можно проще:

WebElement element;
for (int i = 0; i < 3; i++) {
    element = driver.findElement(By.xpath("//*[@class=‘TEST’]"));
    if (element.getText().equals("YOUR TEXT") break;
}

(Рома Иовлев) #5

Или просто пользуйтесь JDI )

$(".TEST").has().text(value);

Встроенные асерты автоматически ждут результат в течении таймаута (по умолчанию 10 секунд)
https://jdi-docs.github.io/jdi-light/?java#text


(Vladislav Sobol) #6

Согласен, переменных намудрил, ваше исполнение проще и кода меньше,но идея была вобщем показать ТСу что можно через цикл, а уж как он его реализует это на его усмотрение.


(Andrey Andrey) #7

Спасибо, за примеры.
Взял эту реализацию
wait.until(webDriver -> element.getText().equals(“YOR TEXT”));