【问题标题】:How to wait for jQuery Ajax requests to complete from WatiN?如何等待来自 WatiN 的 jQuery Ajax 请求完成?
【发布时间】:2010-03-03 23:07:44
【问题描述】:

我正在编写WatiN 测试来测试Ajax Web 应用程序,并且遇到了Ajax 请求的计时问题。

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

我感觉该解决方案将涉及评估 JavaScript 以注册 $.ajaxStart$.ajaxComplete 的处理程序以跟踪请求是否正在进行中。我很快就会深入研究,但想看看其他人是否已经解决了这个问题。似乎这将是 Ajax 测试的常见问题。

【问题讨论】:

    标签: javascript jquery ajax watin


    【解决方案1】:

    我已经创建了一些 WatiN 浏览器扩展方法来解决这个问题,但我仍然对其他解决方案感兴趣。

    InjectAjaxMonitor 方法创建一个附加到 ajaxStart 和 ajaxComplete 事件的 javascript 全局变量,以跟踪正在进行的请求数。

    当您需要等待 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 );
        }
    }
    

    【讨论】:

    • 此解决方案运行良好,除非在注入监视器 javascript 之前开始一个或多个 ajax 请求(此时计数器不再准确)。我不知道如何在 WatiN 的过程中更早地注入监视器。最好的办法可能是在运行测试时在包含 jquery 之后有条件地包含监视器。
    • 我将全局 ajax 事件处理程序放在应用程序的母版页中。另外我只保留一个信号机位而不是一个计数器:lebobitz.wordpress.com/2011/03/06/…
    • 你的代码有一个问题——如果网站没有 jQuery 支持(如我的例子)——你可能想先“注入”。只需在“监控脚本”之前添加此代码。常量字符串 jquery = @"var element1 = document.createElement('script');element1.src = 'ajax.googleapis.com/ajax/libs/jquery/1.8.0/…;"; browser.eval(jquery);
    • 关于@Alex 评论,请确保您也附加了该元素。 document.body.appendChild(element1);
    【解决方案2】:

    此解决方案效果不佳,因为.ajaxStart 仅在第一个 Ajax 请求时调用,而 .ajaxComplete 则在每次 ajax 请求完成时调用。如果您在控制台中运行这个简单的代码:

    $.ajax({url:"/"}); $.ajax({url:"/"})
    

    并在.ajaxStart.ajaxComplete 处理程序方法中添加一些日志记录,您可以看到.ajaxStart 处理程序将只被调用一次,.ajaxComplete 处理程序将被调用两次。所以ajaxRequestCount 会变成负数,你的设计就完蛋了。

    如果你想保留你的设计,我建议你使用.ajaxSend 而不是.ajaxStart

    另一种解决方案是使用.ajaxStop 而不是.ajaxComplete,但是这样做,您不需要ajaxRequestCount,您只需要一个布尔值来说明是否有ajax 请求在后台运行。

    可以找到非常有用的信息:http://api.jquery.com/category/ajax/global-ajax-event-handlers/

    希望这会有所帮助。

    【讨论】:

    • 很好地呼吁滥用 .ajaxStart。这是我的解决方案中的一个错误。使用 .ajaxStop 也会更简单。谢谢!
    【解决方案3】:

    我自己在使用 WatiN 进行一些测试时遇到了这个问题。我发现在version 1.1.0.4000 of WatiN(2007 年 5 月 2 日发布(最新版本是 2009 年 12 月 20 日的2.0 RC2))中,据称添加了对在测试中处理 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)));
    

    请参阅link to the release notes 了解更多信息。

    我还没有详细研究它,所以我不知道它在哪些情况下可能有用或没有用。但如果其他人遇到这个问题,认为值得一提。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-20
      • 2014-02-19
      • 2013-03-27
      • 1970-01-01
      • 2011-09-26
      • 2012-11-02
      相关资源
      最近更新 更多