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

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

Теги: #<Tag:0x00007f748c3b8e10> #<Tag:0x00007f748c3b8d48> #<Tag:0x00007f748c3b8c80> #<Tag:0x00007f748c3b8bb8>

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

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

1 Симпатия

Использовать 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”);
}
2 Симпатий

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

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

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

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

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

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

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

1 Симпатия

Ещё можно одной строчкой wait.until(ExpectedConditions.textToBePresentInElement(WebElement,"String value"));