我如何告诉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页面上的元素
评论
我发现与此有关的问题是“等待”不适用于我正在测试的特定页面。您有没有为此找到可行的解决方案?我在页面上进行了多次等待和现场检查,但仍无任何效果。