Python Selenium execute_script («return window.dataLayer») возвращает устаревшую ссылку? Что устарело? Все по-прежнему там

#python #selenium #selenium-chromedriver #staleelementreferenceexception

#python #selenium #selenium-chromedriver #исключение staleelementreferenceexception

Вопрос:

Я могу наблюдать, как execute_script() выполняется много-много раз на одной странице с маршрутизацией AngularJS, которую я тестирую, поскольку, похоже, большая часть кода используется execute_script() для взаимодействия с браузером.

Конкретный вызов:

 driver.execute_script("return window.dataLayer")
  

Который работает много раз успешно.

Но в какой-то момент та же команда получает 404 от Selenium. Я покопался в python selenium:

Глубоко в urllib3 он публикует это так же, как и в любой другой раз:

 ipdb> urlopen_kw                                                                                                
{'body': '{"script": "return window.dataLayer", "args": []}', 'request_url': 'http://127.0.0.1:51673/session/<sessionidxxx>/execute/sync'} 
  

Но в том же месте теста внезапно ответ от запроса:

 ipdb> data
'{"value":{"error":"stale element reference","message":"stale element reference: stale element not found\n  (Session info: chrome=84.0.4147.105)","stacktrace":"#0 0x561877802d99 \u003C
unknown>\n"}}'
  

Я на Ubuntu:

 /usr/bin❯ chromium-browser --version
Using PPAPI flash.
Chromium 84.0.4147.105 Built on Ubuntu , running on Ubuntu 18.04

/usr/bin❯ chromedriver --version    
ChromeDriver 84.0.4147.30
  

Этот ChromeDriver был найден через: https://chromedriver.chromium.org/downloads/version-selection

Используя pdb, я по-прежнему прекрасно могу использовать execute_script(<command>) для взаимодействия со страницей и всем, что на ней. И URL-адрес не меняется, и страница не обновляется.

Просто кажется, что каким-то образом конкретное window.dataLayer (хотя оно все еще присутствует и завершено в консоли разработчика браузера) является «устаревшим». Это где-то в кэше? В webdriver? Есть ли способ остановить это?

Единственное соединение, которое я могу установить, это то, что когда я использовал объект dataLayer только для одной оценки, кажется, что он НЕ ломается. Но я улучшил код, чтобы просматривать слой данных в цикле (после его получения один раз). Это не сразу устарело бы. Но после более масштабного взаимодействия, запускающего XHR и другие запросы, внезапно он сообщает, что он устарел. Очень запутанно.

Я надеюсь, что этой информации достаточно, чтобы кто-нибудь понял, что может быть причиной.

Большое спасибо!

Ответ №1:

Поскольку вы перебираете элементы, выполняя с ними некоторые действия. Похоже, что ваша страница обновляется. В результате либо элементы, которые вы сохранили ранее, либо перезагружаются, либо вообще теряются. Один из способов преодоления устаревшего элемента is loop заключается в том, что для каждой итерации используйте новый локатор для вашего элемента и обращайтесь к нему с помощью номера итерации вашего цикла.

Комментарии:

1. Поделитесь HTML DOM ваших элементов, чтобы я мог попробовать в моем локальном.

2. Спасибо! В данном случае это не элемент DOM, это свойство самого объекта window. Если я приостановлю выполнение. window.dataLayer Все еще присутствует и заполняется, поскольку я все еще могу просмотреть его непосредственно из браузера. Кроме того, когда происходит сбой, это происходит немедленно, а не во время цикла. Но вы заставляете меня думать, что каким-то образом мне нужно изолировать это, сократив шаги теста и сложность страницы, пока я не смогу заставить ее работать!