Javascript 如何等待来自WatiN的jQueryAjax请求完成?
我正在编写测试web应用程序的测试,遇到了Ajax请求的时间问题 在页面上的操作触发Ajax请求之后,我希望WatiN在验证页面是否正确更新之前等待请求完成Javascript 如何等待来自WatiN的jQueryAjax请求完成?,javascript,jquery,ajax,watin,Javascript,Jquery,Ajax,Watin,我正在编写测试web应用程序的测试,遇到了Ajax请求的时间问题 在页面上的操作触发Ajax请求之后,我希望WatiN在验证页面是否正确更新之前等待请求完成 我有一种感觉,解决方案将涉及评估注册$.ajaxStart和$.ajaxComplete的处理程序,以跟踪请求是否正在进行。我将很快深入研究,但我想看看是否有其他人已经解决了这个问题。这似乎是Ajax测试的一个常见问题。我创建了一些WatiN浏览器扩展方法来解决这个问题,但我仍然对其他解决方案感兴趣 InjectAjaxMonitor方法创
我有一种感觉,解决方案将涉及评估注册
$.ajaxStart
和$.ajaxComplete
的处理程序,以跟踪请求是否正在进行。我将很快深入研究,但我想看看是否有其他人已经解决了这个问题。这似乎是Ajax测试的一个常见问题。我创建了一些WatiN浏览器扩展方法来解决这个问题,但我仍然对其他解决方案感兴趣
InjectAjaxMonitor
方法创建一个javascript全局变量,该变量附加到ajaxStart和ajaxComplete事件,以跟踪正在进行的请求数
在继续之前,每当需要等待AJAX请求完成时,都可以调用browserInstance.WaitForAjaxRequest()代码>
公共静态类浏览器扩展
{
公共静态无效等待请求(此浏览器)
{
int timewaitedinms=0;
var maxwaittimeinmillizes=Settings.WaitForCompleteTimeOut*1000;
while(browser.IsAjaxRequestInProgress()
&&timewaitedinmillizes0);”
+ "};"
+ "}"
+“var watinAjaxMonitor=new AjaxMonitor();”;
浏览器.Eval(monitorScript);
}
}
此解决方案效果不太好,因为只有第一个Ajax请求才调用.ajaxStart
,而每次Ajax请求完成时都调用.ajaxComplete
。如果在控制台中运行此简单代码:
$.ajax({url:"/"}); $.ajax({url:"/"})
并在.ajaxStart
和.ajaxComplete
处理程序方法中添加一些日志记录,您可以看到.ajaxStart
处理程序将只被调用一次,而.ajaxComplete
处理程序将被调用两次。因此,ajaxRequestCount
将变为负值,您的所有设计都将失败
如果您想保留您的设计,我建议您使用.ajaxSend
而不是.ajaxStart
另一个解决方案是使用.ajaxStop
而不是.ajaxComplete
,但是这样做,您不需要ajaxRequestCount
,只需要一个布尔值,它可以说明是否有ajax请求在后台运行
可以找到非常有用的信息:
希望这有帮助。我自己在使用WatiN进行一些测试时遇到了这个问题。我发现在(2007年5月2日发布(最新版本从2009年12月20日发布))中,有人声称添加了更好的对测试中处理Ajax的支持:
更好地支持AJAX测试
已启用的网站,此版本添加
工具箱中还有一些选项
添加了一个将等待的新方法
直到某个属性具有特定的
价值这可能会很方便
需要等待的情况
直到元素的值
更新
例如:
// Wait until some textfield is enabled
textfield.WaitUntil("disable", false.ToSting, 10);
// Wait until some textfield is visible and enabled
textfield.WaitUntil(new Attribute("visibile", new BoolComparer(true)) && new Attribute("disabled", new BoolComparer(false)));
有关更多信息,请参阅
我还没有详细研究过它,所以我无法判断它在哪些情况下可能有用。但是,如果其他人遇到这个问题,这一点值得一提。除非在注入监视器javascript之前开始一个或多个ajax请求(此时计数器不再准确),否则此解决方案效果良好。我不知道如何在WatiN的过程中注入监视器。最好的办法可能是在运行测试时包含jquery之后有条件地包含监视器。此外,我只保留了一个语义位而不是计数器:不过,代码有一个问题——如果网站没有jQuery支持(就像我的情况一样)——您可能需要先“注入它”。只需在“监视脚本”之前添加此代码。常量字符串jquery=@“var element1=document.createElement('script');element1.src=';”;浏览器.Eval(jquery);关于@Alex comment,请确保也附加了元素<代码>document.body.appendChild(element1)代码>关于滥用.ajaxStart的良好呼吁。这是我解决方案中的一个错误。使用.ajaxStop也会更简单。谢谢
// Wait until some textfield is enabled
textfield.WaitUntil("disable", false.ToSting, 10);
// Wait until some textfield is visible and enabled
textfield.WaitUntil(new Attribute("visibile", new BoolComparer(true)) && new Attribute("disabled", new BoolComparer(false)));