#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
Все еще присутствует и заполняется, поскольку я все еще могу просмотреть его непосредственно из браузера. Кроме того, когда происходит сбой, это происходит немедленно, а не во время цикла. Но вы заставляете меня думать, что каким-то образом мне нужно изолировать это, сократив шаги теста и сложность страницы, пока я не смогу заставить ее работать!