ИСКЛЮЧЕНИЕ: ссылка на устаревший элемент: элемент не прикреплен к документу страницы
Моя HTML-страница содержит (среди прочего) этот бит:
<ol id="links">
<li id="links_1"><a href="http://stackru.com">stackru</a></li>
</ol>
В моем коде для проверки страницы я делаю:
el←FindElementById'links_1'
(ACTIONS.MoveToElement el).Build.Perform
и это вылетает с
EXCEPTION: stale element reference: element is not attached to the page document
(Session info: chrome=81.0.4044.129)
Однако эта ошибка не кажется оправданной, поскольку элемент все еще жив:
el.Displayed
1
el.Text
stackru
el.Location
{X=56,Y=282}
Как я могу исправить эту проблему?
(Среда - APL. Я опустил здесь несколько деталей APL, потому что боялся, что их можно избежать "отвлечения" от основной проблемы)
Во время моего исследования перед публикацией я увидел ссылку на устаревший элемент вопроса : элемент не прикреплен к документу страницы, но, похоже, он не применяется:
- как показано, я делаю
FindElementById
и получить к нему доступ сразу после его обнаружения. DOM не меняется, страница статична. - объяснения того, что он больше не является частью DOM, неприменимы: он найден и, как я попытался показать, я могу получить доступ к таким свойствам, как
Displayed
илиText
.
Я тоже просмотрел ссылку, но это объяснение не помогло.
Кроме того, не происходит зацикливания и ничего не меняет страницу. Это действительно просто: GoToUrl * Find * MoveToElement.
Я удалил тег chromedriver-tag, так как могу воспроизвести его с помощью Firefox и geckodriver. Однако с geckodriver я получаю "ИСКЛЮЧЕНИЕ: ссылка на веб-элемент, не встречавшаяся ранее:", когда яMoveToElement
- но я могу el.Click
и получить доступ к его свойствам точно так же, как и в Chrome.
Обновление: коллега исследовал это немного глубже (за пределами моей зоны комфорта) и обнаружил, что перед тем, как выбросить это "устаревшее исключение", существует (я не уверен, как правильно сформулировать это и где именно это произошло) исключение 404. Я просто знаю 404 как код состояния HTTP - это все, что для меня значит. Но очевидно, что браузер не просил никуда перемещаться, поэтому я не могу иметь отношения к HTTP404. Может быть, это звонит кому-нибудь, более знакомому с внутренним устройством WebDriver?
1 ответ
Это была сложная и многослойная проблема, но когда я наконец удалил все слои - все заработало! Ключевой фактор, вызвавший эту проблему:
- из-за ошибки в том, как я написал, тест заставил его выполнить дважды - и второй запуск всегда выявлял проблему.
- Я создал экземпляр
ACTIONS
в тестовом фреймворке и не знал о важной особенности: он непрерывно выстраивает цепочку действий, любые шаги Build.Perform..- к этому просто добавляются. Решение: создавать отдельные экземпляры каждого прогона (возможно, поскольку он довольно легкий) или вызыватьACTIONS.Reset
(требуется WebDriver4). У меня никогда не было проблем с WD4 (хотя он все еще находится в альфа-версии), но это дало основную причину для перехода!