我在写WatiN http://watin.sourceforge.net/测试来测试Ajax http://en.wikipedia.org/wiki/Ajax_%28programming%29Web 应用程序,并遇到了 Ajax 请求的计时问题。
在页面上的操作触发 Ajax 请求后,我希望 WatiN 等待请求完成,然后再验证页面是否已正确更新。
我有一种感觉,解决方案将涉及评估JavaScript http://en.wikipedia.org/wiki/JavaScript注册处理程序$.ajaxStart
and $.ajaxComplete
跟踪请求是否正在进行中。我很快就会深入研究这个问题,但想看看其他人是否已经解决了这个问题。看起来这将是 Ajax 测试的一个常见问题。
我创建了一些 WatiN 浏览器扩展方法来解决这个问题,但我仍然对其他解决方案感兴趣。
The InjectAjaxMonitor
方法创建一个 javascript 全局变量,该变量附加到 ajaxStart 和 ajaxComplete 事件以跟踪正在进行的请求数。
每当您需要等待 AJAX 请求完成后再继续操作时,您可以调用browserInstance.WaitForAjaxRequest();
.
public static class BrowserExtensions
{
public static void WaitForAjaxRequest( this Browser browser )
{
int timeWaitedInMilliseconds = 0;
var maxWaitTimeInMilliseconds = Settings.WaitForCompleteTimeOut*1000;
while ( browser.IsAjaxRequestInProgress()
&& timeWaitedInMilliseconds < maxWaitTimeInMilliseconds )
{
Thread.Sleep( Settings.SleepTime );
timeWaitedInMilliseconds += Settings.SleepTime;
}
}
public static bool IsAjaxRequestInProgress( this Browser browser )
{
var evalResult = browser.Eval( "watinAjaxMonitor.isRequestInProgress()" );
return evalResult == "true";
}
public static void InjectAjaxMonitor( this Browser browser )
{
const string monitorScript =
@"function AjaxMonitor(){"
+ "var ajaxRequestCount = 0;"
+ "$(document).ajaxSend(function(){"
+ " ajaxRequestCount++;"
+ "});"
+ "$(document).ajaxComplete(function(){"
+ " ajaxRequestCount--;"
+ "});"
+ "this.isRequestInProgress = function(){"
+ " return (ajaxRequestCount > 0);"
+ "};"
+ "}"
+ "var watinAjaxMonitor = new AjaxMonitor();";
browser.Eval( monitorScript );
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)