我们在我们的应用程序中使用Selenium2.0即WebDriver运行Webrat。
WebDriver非常好地处理页面重新加载,如果浏览器正在重新加载整个页面,则不会启动后续步骤。问题是这种机制不适用于Ajax请求。当有一些click()或更改()之后,WebDriver不会空闲。
有人可以建议如何让webdriver闲置,直到页面上所有ajax请求结束?
答案 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(包装器)应该有所帮助。