WebRat + Selenium WebDriver:等待ajax完成

时间:2010-02-03 10:58:07

标签: ajax selenium webrat webdriver

我们在我们的应用程序中使用Selenium2.0即WebDriver运行Webrat。

WebDriver非常好地处理页面重新加载,如果浏览器正在重新加载整个页面,则不会启动后续步骤。问题是这种机制不适用于Ajax请求。当有一些click()或更改()之后,WebDriver不会空闲。

有人可以建议如何让webdriver闲置,直到页面上所有ajax请求结束?

3 个答案:

答案 0 :(得分:3)

我们最终在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

包装器也做了其他的事情,比如允许通过按钮/输入标签等进行搜索(因此包装器不仅存在时间问题,这只是我们放在那里的东西之一。)< / p>

答案 1 :(得分:1)

请原谅我的Ruby,但你需要做的是尝试找到对象,如果它不存在就等待它回来。下面的代码应该做的是每秒等待循环一分钟,试图查看驱动程序是否可以找到ID为idOfElement的元素,然后如果不能,则应该抛出错误

assert !60.times{ break if (driver.find_element(:id, "idOfElement) rescue false); sleep 1 }

答案 2 :(得分:0)

用于检查具有等待的元素的单独mtd(包装器)应该有所帮助。