【问题标题】:Selenium+Ruby issue because of page reload由于页面重新加载而导致的 Selenium+Ruby 问题
【发布时间】:2016-10-11 09:00:09
【问题描述】:

我有以下代码:

wait.until {driver.find_element(:xpath, "//input[@class='btn btn-success Testserver']")}
element = driver.find_element(:xpath, "//input[@class='btn btn-success Testserver']")
element.click
wait.until {driver.find_element(:xpath, "//input[@class='btn btn-success Testserver2']")}
element = driver.find_element(:xpath, "//input[@class='btn btn-success Testserver2']")
element.click

我的问题是第 3 行和第 4 行。当 selenium 单击第一个元素时,会导致页面重新加载。问题是第 4 行(wait.until)在执行重新加载之前找到了元素。那么会发生什么? Selenium 认为元素已经加载,它会尝试继续,然后页面重新加载,selenium 抛出错误,导致找不到元素。

Selenium::WebDriver::Error::StaleElementReferenceError: The element reference is stale. Either the element is no longer attached to the DOM or the page has been refreshed.

我能做什么?当我在这行之间设置睡眠时,代码工作正常,但我不想使用睡眠错误的做法。还有其他方法吗?

感谢您的帮助!

【问题讨论】:

  • 也许您还需要在第二个wait.until 块中检查文档是否准备就绪。

标签: ruby-on-rails ruby selenium selenium-webdriver


【解决方案1】:

显然这是 Selenium 的一个众所周知的问题。如果旧页面和新页面都有您要测试的元素,则很难等待新页面加载。

有一些变通方法,包括从StaleElementReferenceError 显式救援,并将其用作检查条件,以便您知道页面何时完成重新加载。见How to get Selenium to wait for page load after a click

在 ruby​​ 中,它看起来像这样(未经测试):

def wait_until_reload(&block)
  old_element = driver.find_element(:tag_name, 'html')
  yield
  wait.until do
    begin
      old_element.first(id: 'doesnt-matter')
      false
    rescue Selenium::WebDriver::Error::StaleElementReferenceError
      true
    end
  end
end

wait_until_reload { element.click }

【讨论】:

  • 谢谢,我会阅读文章并尝试一下。认为我的 ruby​​ 知识应该足以让您的代码正常工作,如果他还没有(直到现在还没有测试)。解决问题后,我会发布我的源代码。
猜你喜欢
  • 1970-01-01
  • 2019-07-27
  • 2019-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
相关资源
最近更新 更多