Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何等待来自WatiN的jQueryAjax请求完成?_Javascript_Jquery_Ajax_Watin - Fatal编程技术网

Javascript 如何等待来自WatiN的jQueryAjax请求完成?

Javascript 如何等待来自WatiN的jQueryAjax请求完成?,javascript,jquery,ajax,watin,Javascript,Jquery,Ajax,Watin,我正在编写测试web应用程序的测试,遇到了Ajax请求的时间问题 在页面上的操作触发Ajax请求之后,我希望WatiN在验证页面是否正确更新之前等待请求完成 我有一种感觉,解决方案将涉及评估注册$.ajaxStart和$.ajaxComplete的处理程序,以跟踪请求是否正在进行。我将很快深入研究,但我想看看是否有其他人已经解决了这个问题。这似乎是Ajax测试的一个常见问题。我创建了一些WatiN浏览器扩展方法来解决这个问题,但我仍然对其他解决方案感兴趣 InjectAjaxMonitor方法创

我正在编写测试web应用程序的测试,遇到了Ajax请求的时间问题

在页面上的操作触发Ajax请求之后,我希望WatiN在验证页面是否正确更新之前等待请求完成


我有一种感觉,解决方案将涉及评估注册
$.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)));