How to avoid "StaleElementReferenceException" in Selenium?
Как избежать "StaleElementReferenceException" в Selenium?
Я реализую множество тестов Selenium с использованием Java - иногда мои тесты завершаются неудачей из-за StaleElementReferenceException.
Не могли бы вы предложить несколько подходов к повышению стабильности тестов?
Переведено автоматически
Ответ 1
Это может произойти, если операция DOM, выполняемая на странице, временно делает элемент недоступным. Чтобы учесть эти случаи, вы можете попытаться получить доступ к элементу несколько раз в цикле, прежде чем окончательно выдать исключение.
У меня периодически возникала эта проблема. Без моего ведома BackboneJS запускался на странице и заменял элемент, на который я пытался щелкнуть. Мой код выглядел следующим образом.
Что справедливо привело к StaleElementReferenceException при попытке перейти по ссылке. Я не смог найти никакого надежного способа сообщить webdriverу подождать, пока javascript не завершит работу, поэтому вот как я в конечном итоге решил это.
Этот код будет постоянно пытаться щелкнуть ссылку, игнорируя StaleElementReferenceExceptions, пока щелчок не завершится успешно или не истечет время ожидания. Мне нравится это решение, потому что оно избавляет вас от необходимости писать какую-либо логику повторных попыток и использует только встроенные конструкции WebDriver.
Ответ 3
Решение Кенни хорошее, однако его можно написать более элегантным способом
Но в любом случае, лучшее решение - полагаться на библиотеку Selenide, она обрабатывает такого рода вещи и многое другое. (вместо ссылок на элементы он обрабатывает прокси, поэтому вам никогда не придется иметь дело с устаревшими элементами, что может быть довольно сложно). Selenide
Ответ 4
Обычно это происходит из-за обновления DOM, и вы пытаетесь получить доступ к обновленному / новому элементу - но DOM обновлен, поэтому у вас недействительная ссылка..
Обойдите это, сначала используя явное ожидание элемента, чтобы убедиться в завершении обновления, затем снова создайте новую ссылку на элемент.
Вот некоторый псевдокод для иллюстрации (адаптирован из некоторого кода C #, который я использую для ИМЕННО этой проблемы):