Python Selenium WebDriverWait 和 Click 不一致地抛出 StaleElementReferenceException()
好吧,我来试着解释一下这个我自己还没搞明白的问题。我在用Selenium和Python的绑定,似乎遇到了一个问题,就是在使用WebDriverWait
之后,有时候找不到页面上的某个元素,然后我想点击它时就会出错。以下是我的代码:
yearOption = WebDriverWait(self.br, 40).until(lambda d: d.find_element_by_xpath("//select[@name='ctl00$holdSection$rptCommissionYears']/option[@value='%s']" % year), self.br)
print yearOption.text
yearOption.click()
这段命令是在一个循环里执行的,但在.click()
这个操作上,有时候会随机失败,出现错误:StaleElementReferenceException()
,这个错误是在打印yearOption.text
之后出现的。对我来说,这实在是太奇怪了,因为WebDriverWait
这一行明显找到了这个元素,而且在点击之前我并没有重新加载页面或改变浏览器的状态……
有没有人知道为什么我会遇到这个错误?记住,这个错误并不是每次都会发生,实际上,有时候我的整个脚本都能顺利执行,没有任何错误。
1 个回答
0
我之前也遇到过类似的问题,我几乎可以肯定你的问题是一样的。
如果你检查一下你的循环,它是这样的:
- 寻找这个元素
- 点击
- 再寻找同样的元素
- 再点击
通常在点击之后,页面会重新加载或者发生一些变化。这可能会影响你正在寻找的元素。如果你不注意,你可能会在元素还没加载完成之前就去找它,而当你点击时,元素的ID已经改变了,这样就会出现一个叫“过时异常”的错误。
我们一步一步来看:
- 页面加载时,你的元素ID=1
- 你找到了它。
- 你点击它,页面开始重新加载或发生变化
- 你进入另一个循环去找元素。注意,这个过程可能会非常快,因为点击后没有等待,所以你可能会再次找到ID=1的元素。你尝试点击ID=1的元素,但由于页面已经重新加载,它已经不存在了。
你可以用不同的方法来解决这个问题:
- 如果速度不是问题,你可以在点击后加一个几秒钟的等待,这样可以给JavaScript足够的时间来完成操作。
- 你可以保存元素的ID,每次寻找时检查它是否不同,如果没有不同,就等待一下再重试。
如果这些都不是你的问题,你可以分享更多的代码和测试目标,我很乐意帮助你。