Это исключение возникает когда ссылка на элемент, который вы пытаетесь использовать, больше не действительна.
Вы получите StaleElementReferenceException в одном из следующих случаев, первый из которых наиболее распространенный:
Элемент был полностью удален со страницы
Наиболее частой причиной этого является то, что страница с искомым элементом, была обновлена, или пользователь перешел на другую страницу. Реже, но все также достаточно распространен случай, когда библиотека JavaScript удалила элемент и заменила его элементом с таким же ID или атрибутами. В этом случае, несмотря на то, что замененные элементы могут выглядеть похожими на оригиналы, они отличаются. Selenium Driver не имеет возможности определить, что замененный элемент на самом деле тотже, что и ожидался. Если вы уверены, что элемент заменен идентичным и присутствует на странице, то нужно выполнить поиск элемента снова и получить актуальную ссылку на него.
Элемент больше не подключен к DOM-модели
Общей техникой, используемой для имитации вкладок интерфейса в веб-приложениях, является подготовка нескольких элементов div
для каждой вкладки, но прикреплен к DOM в один момент времени только один из них, остальные же сохранены в переменные. В этом случае, вполне возможно, что ваш код может иметь ссылку на элемент, который больше не прикреплен к DOM (то есть предком которого является «document.documentElement»).
WedDriver вызывает исключение StaleElementReferenceException в этом случае, не смотря на то, что элемент существует, потому, что ссылка на элемент все равно потеряна. Вам придется заменять ее, выполняя поиск элемента каждый раз, после того как он будет прикреплен к DOM.
Элемент меняет свой тип, но сохраняет тот же локатор поиска(JQuery и др.)
Это крайне редкий случай, происходит он когда, например, поле input
при нажатии или получении фокуса меняет значение type
c text
на password
.
Спасибо за статью, столкнулся с этим эксепшином при хранении коллекции web-элементов и при прохождении циклом по этим элементам получал эксепшин, решил проблему сделав коллекцию нужных x-path элементов и уже непосредственно находил их на странице.