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

[Solved] Нестабильно выполняются тесты

В общем вам надо вдуматся, что есть StaleElementReferenceException.
И почему его можно схватить, даже на такой безобидной, с виду, строке как эта:

wd.findElement(By.id("setup")).click();

На этом я ловлю NoSuchElementException

Да, так и есть, только вот он не обновляется автоматически. Так делать нельзя?

Ок, пойду гуглить…

А как вы поняли, что он не обновляется динамически? Net monitor что говорит, когда ручками очищаете инпут? Запросы идут?

При ручном очищении сетевой монитор молчит (сразу оговорюсь что смотрел встроенным в браузер).

Если кому-то ещё поможет:
Проблема найдена, таймауты решают.

Суть следующая. Веб приложение полностью построено на JAVA и JavaScripts, при загрузке страницы происходит такая штука: Элемент присутствует на странице, но ещё не успел полностью прогрузиться и попасть в дом. В этот момент идёт обращение к нему и валится исключение.

Помогла вот такая конструкция на подобных элементах:

WebDriverWait wdWait = new WebDriverWait(driver, 10);
wdWait.ignoring(InvalidSelectorException.class, StaleElementReferenceException.class);
wdWait.until(ExpectedConditions.visibilityOf(weErrorMsg));

По сути сработал совет товарища @KoNaN с использованием explicit waits. Если чей-то пост вам помог, не забываем ставить лайки.

Решение настораживает, потому что:

  1. во время проверки visibility исключение InvalidSelectorException не может возникнуть ни при каких обстоятельствах, оно вылетает только при использовании поиска по невалидному локатору
  2. если вылетело исключение StaleElementReferenceException, то есть элемент исчез из DOM – игнорировать его и продолжать ожидание бессмысленно, он обратно не появится,
    надо повторно выполнять поиск.

Ну и вообще в самом начале утверждение про то, что “элемент ещё не успел попасть в DOM” – не отражает ситуацию. Пока элемент не находится в DOM – его нет, он не может быть найден методом findElement, и поэтому проверять видимость просто не у чего. А если уж элемент вернулся из метода findElement – значит он в DOM, и тогда можно проверять видимость, но см. выше про непонятно что делающий “тюнинг” ожиданий.

Райт. А PageFactory хендлит стейлы?
Насколько я вижу из кода - идет попеременное обращение к разным PageObject без повторной инициализации.

Нет

Таки нет:
org.openqa.selenium.TimeoutException: Timed out after 180 seconds waiting for text "Update Your User Profile". Got:null Caused by: org.openqa.selenium.InvalidSelectorException: The xpath expression '//BODY' cannot be evaluated or does notresult in a WebElement (WARNING: The server did not provide any stacktrace information) Command duration or timeout: 92 milliseconds

Фейлы рандомны - разные страницы, разные места. Не только на //body а практически везде - фреймы/прочие элементы. “Странностей” в браузере не обнаружено - на скринах “тишь да гладь”.
Пытаюсь понять что там происходит - пока безрезультатно.

Мы же говорим о возможных исключениях, которые могут возникать при проверки видимости элемента?
В этом контексте исключение InvalidSelectorException никогда не выбрасывается.

И, кстати, это какой браузер считает, что //body это невалидный селектор? Баг же :slight_smile:

Ну тема вроде про ИЕ.
И пояснение к экшепшену как бы говорит нам: “Фиг его знает, что случилось, но у меня не получилось - нате вам ивалидселектор на всякий случай” :slight_smile:

Баг - это то, что проинвестигированно и воспроизведено. И рандомность тут сильно усложняет дело. Логи думаю тоже много чего не дадут, я на 99% уверен, что увижу там какой-нибудь [Access denied].