Python Selenium execute_script( "return window.dataLayer" ) 返回过时的引用?什么是陈旧的?一切都还在那里



我可以在我正在测试的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和其他请求的较大交互之后,它突然说它过时了。非常令人困惑。

我希望这些信息足以让人们认识到原因。

非常感谢!

当您在元素上执行某些操作时循环元素。看起来你的页面正在刷新。因此,先前存储的元素要么被重新加载,要么全部丢失。克服循环中陈旧元素的一种技术是,对于每次迭代,为元素使用一个新的定位器,并在循环的迭代次数的帮助下访问它。

相关内容

  • 没有找到相关文章

最新更新