ИСКЛЮЧЕНИЕ: ссылка на устаревший элемент: элемент не прикреплен к документу страницы

Моя 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 (хотя он все еще находится в альфа-версии), но это дало основную причину для перехода!
Другие вопросы по тегам