你如何等待 jQuery Ajax 调用在 Selenium 2 中完成

软件测试 硒2
2022-01-19 21:16:48

我在 C# 中使用 Selenium 2 来自动测试我们的网站。在构建非 Ajax 功能时,使用 webDriver.FindElement(By.Id("element-id")) 在页面上查找元素可以正常工作,但是在执行 jQuery Ajax 调用时这不起作用,因为它会尝试查找元素在 ajax 请求完成之前。

我如何告诉 Selenium 等到 jQuery Ajax 完成?

4个回答

您要查找的类是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 可能需要处理一下