如何解决Python Selenium execute_script“ return window.dataLayer”返回陈旧的引用?什么陈旧?都还在那里
我可以看到execute_script()
在我正在测试的AngularJS路由的单个页面中运行很多次,因为似乎很多代码都使用execute_script()
与浏览器对话。
具体呼叫是:
driver.execute_script("return window.dataLayer")
成功工作了多次
但是在某些时候,该命令从Selenium接收到404。我挖了python硒:
深入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>)
与页面及其上的所有内容进行交互。而且网址没有改变,页面也没有刷新。
似乎特定的window.dataLayer
(虽然在浏览器开发者控制台中仍然存在并完整)在某种程度上是“陈旧的”。它缓存在某个地方吗?在网络驱动程序中?有办法阻止这种情况吗?
我唯一可以建立的连接是,当我仅将dataLayer对象用于一个评估时,它似乎没有中断。但是我增强了代码以循环查看dataLayer(在获取一次之后)。它不会立即过时。但是,在更大的交互触发XHR和其他请求之后,突然它说这是陈旧的。非常令人困惑。
我希望这对于某些人来说是足够的信息,以找出可能的原因。
非常感谢!
解决方法
当您循环浏览元素时,对它们执行一些操作。看起来您的页面正在刷新。结果,您先前存储的任何一个元素都将被重新加载或完全丢失。克服陈旧元素的一种技术是循环,对于每次迭代,请为您的元素使用一个新的定位器,并借助循环的迭代次数对其进行访问。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。