我们在应用程序中将Webrat与Selenium2.0 aka WebDriver一起运行。

WebDriver很好地处理了页面重新加载,如果浏览器正在重新加载整个页面,则不启动下一步。问题在于该机制不适用于Ajax请求。当click()或change()之后有一些空闲时,WebDriver不会空闲。

谁能建议在页面上所有ajax请求结束之前如何使webdriver闲置?

最佳答案

我们最终在selenium上编写了一层,通过将调用包装在可选循环中来处理这种情况。因此,当您执行以下操作时:

@browser.click "#my_button_id"

它将执行类似于上面的AutomatedTester建议的操作:
class Browser
  def click(locator)
    wait_for_element(locator, :timeout => PAGE_EVENT_TIMEOUT)
    @selenium.click(locator)
  end

  def wait_for_element(locator, options)
    timeout = options[:timeout] || PAGE_LOAD_TIMEOUT
    selenium_locator = locator.clone
    expression = <<EOF
      var element;
      try {
        element = selenium.browserbot.findElement('#{selenium_locator}');
      } catch(e) {
        element = null;
      };
      element != null;
EOF
    begin
      selenium.wait_for_condition(expression, timeout)
    rescue ::Selenium::SeleniumException
      raise "Couldn't find element with locator '#{locator}' on the page: #{$!}.\nThe locator passed to selenium was '#{selenium_locator}'"
    end
  end
end

包装器还执行其他操作,例如允许按按钮/输入标签等进行搜索(因此包装器不仅存在计时问题,这只是我们放在其中的一件事。)

10-08 19:04