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

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

评论

我发现与此有关的问题是“等待”不适用于我正在测试的特定页面。您有没有为此找到可行的解决方案?我在页面上进行了多次等待和现场检查,但仍无任何效果。

#1 楼

您正在寻找的类是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类时遇到了问题,并且我认为可以使用一些工作来使其更稳定。

评论


我广泛使用WebDriverWait,并且不记得任何稳定性问题。在Selenium2 beta2中,sendKeys肯定存在问题,因此我使用WebDriverWait来防止脚本更改焦点,直到字段内容与sendKeys文本匹配为止。使用beta3,我再也没有遇到FirefoxDriver或InternetExplorerDriver的稳定性问题。

–约翰
2011年5月7日,下午3:37

WebDriverWait类非常简单。就是说,很有趣的是(在另一个更合适的论坛中)知道您所发现的“不稳定”的内容。

– JimEvans
2011年5月19日19:24

我在大多数情况下确实使用等待成功,但是我确实发现某些JQuery页面上的时间安排不太正确,并且我要么在尝试捕获其捕获的字段上遇到错误,要么就不在那里了。我最终未显示Element或Element不再有效。 JQuery肯定会与Web Driver配合使用,以使事情变得正确。

– MichaelF
2011-09-23 15:41

#2 楼

解决此问题的可能更通用的解决方案是等待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);
    }
}




评论


这太棒了。现在,我正在测试我的AJAX繁重的Web应用程序,从测试中剥离所有Thread.Sleep(),这似乎正在起作用。

–亚伦剃须刀
13年11月1日在21:29

谢谢!我用python编写了一个等效项:(注意去除空白)类jquery_to_complete(对象):def __init __(自我):传递def __call __(自我,驱动程序):isjQueryComplete = driver.execute_script(“返回jQuery.active == 0” )返回isjQueryComplete

– KareemElashmawy
18-2-22在20:37



#3 楼

可以肯定的是,您可以访问一个Wait类。来自文档:


公共抽象类等待扩展
java.lang.Object

一种实用程序类,旨在帮助
用户会自动等待,直到
条件变为true。像
这样使用它:

new Wait(“找不到关闭
按钮!”){
布尔直到(){
返回硒.isElementPresent(“ button_Close”);
}};


#4 楼

实际上,我在硒测试的页面对象上编写了自己的wait_for_element方法。您将需要:


成功检查函数
return element.isVisible()


定义您要获取的函数
webDriver.FindElement(By.Id("element-id"))


准备的时间长度等待以及检查的频率

这都是在将Wait类添加到selenium 2 / webdriver中之前编写的。我还没有机会使用Wait类,有人知道它是否有用吗?我注意到一个答案说selenium2可能需要对其进行一些操作

#5 楼

如果您可以考虑使用PageObject模型,则在Stack Overflow上提出了类似的问题,并且给出了很好的答案。

使用PageFactory初始化AJAX页面上的元素