【问题标题】:Python Selenium WebDriverWait and Click inconsistently giving StaleElementReferenceException()Python Selenium WebDriverWait 和 Click 不一致地给出 StaleElementReferenceException()
【发布时间】:2014-04-09 19:53:30
【问题描述】:

好的,我尝试解释这个我自己还没有弄清楚的问题。我正在将 Selenium 与 python 绑定一起使用,并且在使用 WebDriverWait 后跟 click() 事件时似乎随机找不到页面元素的问题。这是我的代码:

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()

这个命令集在一个 for 循环中,并且会在 .click() 事件上随机失败,产生错误:StaleElementReferenceException() 在打印 yearOption.text 之后。这对我来说完全很奇怪,因为WebDriverWait 行显然找到了该元素,并且在单击该元素之前我没有重新加载或更改浏览器状态...

任何想法为什么我会收到此错误?请记住,它不会始终如一地发生,事实上——有时,我的整个脚本会成功执行而没有错误。

【问题讨论】:

  • 你说这是一个for循环,所以我假设Click正在执行一些javascript?如果是这种情况,我会确保所有 javascript 在循环的下一次迭代之前完成执行。如果动态地从 DOM 中添加/删除元素,这可能会导致 StaleElementException,即使它不是正在添加/删除的元素
  • @SteveCrawford 不,没有被点击的 javascript。单击是从选择(下拉)框中单击一个选项;如果你认为 javascript 那么这将是循环中唯一的 javascript 执行......没有其他东西是重定向页面或更改浏览器对象......
  • 您找到解决方案了吗?

标签: python selenium selenium-webdriver


【解决方案1】:

我之前也遇到过类似的问题,我 99% 确定你的问题是一样的。

如果你检查你的循环是:

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

通常在单击后,某些页面会重新加载或发生更改。这可能会影响您正在搜索的元素。如果你不小心,你可能会在重新加载之前寻找元素,当你点击它时,元素 ID 已经改变,因此给你一个 Stale 异常。

让我们一一来:

  1. 页面加载并且您的元素的 ID=1
  2. 你找到了。
  3. 您点击它并重新加载/更改开始发生
  4. 您进入另一个循环并找到该元素。请注意,这甚至 可以发生得非常快,因为点击后没有等待,因此 find 可以退出给你 ID=1 元素。您尝试单击 元素 ID=1,但由于它被重新加载,它不再存在。

您可以通过不同的方式解决此问题:

  1. 如果速度不是问题,您可以在单击后添加显式等待 几秒钟,给 javascript 足够的时间来完成。
  2. 可以保存元素的ID,每次查找时, 你检查它是否不同,如果不是,你等待并重试。

鉴于此,如果这不是您的问题,您可以随时分享更多代码和测试目标,我很乐意提供帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 2016-02-14
    • 2018-09-14
    • 1970-01-01
    • 2015-02-17
    • 2022-01-16
    • 2014-11-15
    相关资源
    最近更新 更多