我可以在我正在测试的AngularJS路由的单页中多次观看execute_script()
的运行,因为似乎很多代码都使用execute_script()
与浏览器对话。
具体调用是:
driver.execute_script("return window.dataLayer")
它成功地工作了很多次。
但在某个时刻,同一个命令从Selenium接收到一个404。我挖到了蟒蛇硒:
在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
(在浏览器开发控制台中仍然存在并完成(是";陈腐的";。它缓存在什么地方了吗?在网络驱动程序中?有办法阻止这种情况吗?
我唯一能做的连接是,当我只使用dataLayer对象进行一次评估时,它似乎不会中断。但我增强了代码,以便在循环中查看dataLayer(在获得一次之后(。它不会立即变质。但在触发XHR和其他请求的较大交互之后,它突然说它过时了。非常令人困惑。
我希望这些信息足以让人们认识到原因。
非常感谢!
当您在元素上执行某些操作时循环元素。看起来你的页面正在刷新。因此,先前存储的元素要么被重新加载,要么全部丢失。克服循环中陈旧元素的一种技术是,对于每次迭代,为元素使用一个新的定位器,并在循环的迭代次数的帮助下访问它。