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

时间:2014-03-06 22:03:15

标签: python selenium selenium-webdriver

好的,这是我试图解释这个问题,我还没有想到自己。我正在使用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行显然找到了元素,并且在点击元素之前我没有重新加载或更改浏览器状态...

为什么我会收到此错误的任何想法?请记住,它并不是一致的,事实上 - 有时候,我的整个脚本将成功执行而没有错误。

1 个答案:

答案 0 :(得分:0)

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

如果检查你的循环是:

  1. 寻找此元素
  2. 点击
  3. 寻找相同的元素
  4. 点击
  5. 点击后的Normaly,会发生一些页面重新加载或更改。这可能会影响您要搜索的元素。如果你不小心,你可能最终在重新加载之前寻找元素,当你点击它时,元素ID已经改变,因此给你一个陈旧的例外。

    让我们一一去:

    1. 页面加载,您的元素ID = 1
    2. 你找到了。
    3. 您点击它并重新加载/更改开始发生
    4. 您输入另一个循环并找到该元素。请注意,这甚至 由于点击后没有等待,因此可以非常快速地发生 find可以退出再次给你ID = 1元素。你试着点击 元素ID = 1,但由于它已重新加载,因此不再存在。
    5. 您可以通过不同方式解决此问题:

      1. 如果速度不是问题,您可以在点击后添加明确的等待 几秒钟,给javascript足够的时间来完成。
      2. 您可以保存元素的ID,每次查找时, 检查是否有所不同,如果不是,则等待并重试。
      3. 如果这不是您的问题,您可以随时分享更多代码和测试目标,我很乐意为您提供帮助。