0

execute_script()我可以在我正在测试的 AngularJS 路由单页中多次观看运行,因为似乎有很多代码用于execute_script()与浏览器对话。

具体调用如下:

driver.execute_script("return window.dataLayer")

成功多次。

但是在某些时候,相同的命令会从 Selenium 收到 404。我深入研究了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(虽然仍然存在并在浏览器开发控制台中完成)是“陈旧的”。它是否缓存在某个地方?在网络驱动程序中?有没有办法阻止它?

我可以建立的唯一联系是,当我只使用 dataLayer 对象进行一次评估时,它似乎没有中断。但是我增强了代码以循环查看 dataLayer(在获取一次之后)。它不会立即变得陈旧。但是在触发 XHR 和其他请求的更大交互之后,它突然说它已经过时了。非常混乱。

我希望这是足以让某人认识到可能是什么原因的信息。

非常感谢!

4

1 回答 1

0

当您在对元素执行某些操作时循环遍历元素。看起来您的页面正在刷新。结果,您之前存储的任一元素要么被重新加载,要么完全丢失。克服陈旧元素的技术之一是循环,每次迭代都为您的元素使用一个新的定位器,并在循环的迭代次数的帮助下访问它。

于 2020-08-22T07:00:23.690 回答