Python Selenium WebDriverWait 和 Click 不一致地抛出 StaleElementReferenceException()

2 投票
1 回答
922 浏览
提问于 2025-04-17 21:12

好吧,我来试着解释一下这个我自己还没搞明白的问题。我在用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

我之前也遇到过类似的问题,我几乎可以肯定你的问题是一样的。

如果你检查一下你的循环,它是这样的:

  1. 寻找这个元素
  2. 点击
  3. 再寻找同样的元素
  4. 再点击

通常在点击之后,页面会重新加载或者发生一些变化。这可能会影响你正在寻找的元素。如果你不注意,你可能会在元素还没加载完成之前就去找它,而当你点击时,元素的ID已经改变了,这样就会出现一个叫“过时异常”的错误。

我们一步一步来看:

  1. 页面加载时,你的元素ID=1
  2. 你找到了它。
  3. 你点击它,页面开始重新加载或发生变化
  4. 你进入另一个循环去找元素。注意,这个过程可能会非常快,因为点击后没有等待,所以你可能会再次找到ID=1的元素。你尝试点击ID=1的元素,但由于页面已经重新加载,它已经不存在了。

你可以用不同的方法来解决这个问题:

  1. 如果速度不是问题,你可以在点击后加一个几秒钟的等待,这样可以给JavaScript足够的时间来完成操作。
  2. 你可以保存元素的ID,每次寻找时检查它是否不同,如果没有不同,就等待一下再重试。

如果这些都不是你的问题,你可以分享更多的代码和测试目标,我很乐意帮助你。

撰写回答