即使在等待之后,Python 中的 Selenium 也无法识别 DOM 中的变化

Posted

技术标签:

【中文标题】即使在等待之后,Python 中的 Selenium 也无法识别 DOM 中的变化【英文标题】:Selenium in Python doesn't recognise changes in the DOM even after waiting 【发布时间】:2018-10-09 11:48:49 【问题描述】:

我在 Python 脚本上使用 selenium 来获取一些数据并在 javascript/ajax 呈现的网站上执行一些脚本,这意味着一些按钮或脚本会在不加载新页面的情况下更改 DOM或更改网址。

情况是:页面一加载,我就执行下面的脚本:

driver1.execute_script("javascript:changeOption('a', 'b','otherPage.html');")

changeOption 是直接写在 HTML 的 script 标签内的脚本。它可以工作,并且脚本会导致 DOM 发生变化。

现在,DOM 发生了变化,并且有直接在 HTML 上编写的新脚本,我可以在 Chrome 的检查器“元素”选项卡中清楚地看到这些脚本。我等了几秒钟,然后尝试运行其中一个新脚本:

driver1.execute_script("javascript:filterOption(0);")

我得到一个错误!它说这个脚本'filterOption'不存在。

经过一番调查,我注意到 selenium 没有识别出 DOM 发生了变化,并且页面内有新的元素和脚本!这就是为什么它说新脚本不存在。

到目前为止我所做的尝试:

隐式和显式等待。两者都不起作用。 time.sleep(),等待几秒钟,然后执行第二个脚本。也没有用。 在 while 循环中强制尝试使用“try...except”语句执行脚本。从不工作,总是去例外。 通过再次执行第一个脚本,检查某些元素,等待新元素出现等,检查页面 selenium 是否“看到”是更新的页面。不,它不是:selenium 真的没有注意到DOM 已更新,这是肯定的

我在这里和文档上做了一些研究,寻找某种方法来强制 selenium 在不刷新页面的情况下再次读取 DOM,因为刷新会导致它返回到第一页并丢失所有更改。看起来没有办法做到这一点,而且我找到的每个答案都不一样,而且没有用。

你有什么建议可以让 Selenium 注意到 DOM 上有新的脚本吗?

谢谢!

P.S:我在 Python 3 和 Chrome 中使用最新的 selenium。

【问题讨论】:

'changeOption' 和 'filterOption' 都是在按下按钮时由 HTML 调用的函数(不是方法),因此除非被调用,否则它们不会运行。此外,Selenium 能够调用第一个,但它无法调用后者,因为 Selenium 没有注意到页面已更改并且脚本现在在那里。它也不能识别新的按钮、元素和其他东西。 我将此与当前的窗口处理程序问题相关联。查看print(driver.window_handles)changeOption 调用前后的输出。如果输出不同,您可以使用driver.switch_to_window(driver.window_handles[1]),其中假定 1 是列表中的最后一个元素。 (只是一个建议) @slackmart,它返回包含前后相同单个元素的相同列表。 【参考方案1】:

已解决!

原来新代码是在 iFrame 中呈现的,这就是 selenium 以前看不到它的原因。

【讨论】:

以上是关于即使在等待之后,Python 中的 Selenium 也无法识别 DOM 中的变化的主要内容,如果未能解决你的问题,请参考以下文章

python thread模块 锁 同步锁

Python全栈开发——进程与线程

Python Turtle.Terminator 即使在使用 exitonclick() 之后

即使在安装 cors-headers 之后,Django cors 也会出错

简单爬取《小丑》电影豆瓣短评生成词云

python 如何封装在某带参数函数之后等待时间?