我在 C# 中使用 Selenium 2 来自动测试我们的网站。在构建非 Ajax 功能时,使用 webDriver.FindElement(By.Id("element-id")) 在页面上查找元素可以正常工作,但是在执行 jQuery Ajax 调用时这不起作用,因为它会尝试查找元素在 ajax 请求完成之前。
我如何告诉 Selenium 等到 jQuery Ajax 完成?
我在 C# 中使用 Selenium 2 来自动测试我们的网站。在构建非 Ajax 功能时,使用 webDriver.FindElement(By.Id("element-id")) 在页面上查找元素可以正常工作,但是在执行 jQuery Ajax 调用时这不起作用,因为它会尝试查找元素在 ajax 请求完成之前。
我如何告诉 Selenium 等到 jQuery Ajax 完成?
您要查找的类是WebDriverWait类,您可以在此处找到 ( C# ): http ://code.google.com/p/selenium/source/browse/trunk/dotnet/src/WebDriver.Support/UI/WebDriverWait 。CS
我创建了一个扩展方法以使其更易于使用,如下所示:
public static class BrowserExtensions
{
public static T WaitUntil<T>(this IWebDriver browser, Func<IWebDriver, T> condition, int timeout = 5)
{
var wait = new WebDriverWait(browser, new TimeSpan(0, 0, timeout));
return wait.Until(condition);
}
}
然后你可以像这样使用它:
var element = webDriver.WaitUntil(x => x.FindElement(By.Id("element-id")));
请注意,这并不能保证当您取回该元素时它是可见的!
另外我可能应该提到我在使用 WebDriverWait 类时遇到了问题,我认为它可以使用一些工作来使其更稳定。
这个问题的一个可能更通用的解决方案是等待 jquery 完成。您可以使用如下函数执行此操作:
public void WaitForAjax()
{
while (true) // Handle timeout somewhere
{
var ajaxIsComplete = (bool)(driver as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0");
if (ajaxIsComplete)
break;
Thread.Sleep(100);
}
}
可以肯定的是,您可以访问一个 Wait 类。从文档:
公共抽象类等待扩展 java.lang.Object
一个实用程序类,旨在帮助用户自动等待条件变为真。像这样使用它:
new Wait("找不到关闭按钮!") { boolean until() { return selenium.isElementPresent("button_Close"); } };
实际上,我在页面对象上为我的硒测试编写了自己的 wait_for_element 方法。你会需要:
返回元素.isVisible()
webDriver.FindElement(By.Id("element-id"))
这都是在将 Wait 类添加到 selenium 2/webdriver 之前编写的。我还没有机会使用 Wait 类,有谁知道它是否有好处?我注意到一个答案说 selenium2 可能需要处理一下