首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何检查浏览器是否有挂起的请求(Ajax及其变体

如何检查浏览器是否有挂起的请求(Ajax及其变体
EN

Stack Overflow用户
提问于 2014-06-19 12:42:36
回答 2查看 13.5K关注 0票数 20

我处理的一些站点有繁重的ajax请求。我计划在单击断言for元素之前等待Ajax请求完成。目前我使用的是

代码语言:javascript
复制
try {
    if (driver instanceof JavascriptExecutor) {
        JavascriptExecutor jsDriver = (JavascriptExecutor)driver;

        for (int i = 0; i< timeoutInSeconds; i++) 
        {
            Object numberOfAjaxConnections = jsDriver.executeScript("return jQuery.active");
            // return should be a number
            if (numberOfAjaxConnections instanceof Long) {
                Long n = (Long)numberOfAjaxConnections;
                System.out.println("Number of active jquery ajax calls: " + n);
                if (n.longValue() == 0L)  break;
            }
            Thread.sleep(1000);
        }
    }
    else {
       System.out.println("Web driver: " + driver + " cannot execute javascript");
    }
}
catch (InterruptedException e) {
    System.out.println(e);
}

但是对于Ajax请求,它工作得很好,但对于任何使用jQuery库变体的类似请求,它都不能很好地工作。

注意:

代码语言:javascript
复制
document.readyState == 'complete'

它不适用于Ajax请求或任何其他类似的替代方案。

这两个测试都不是我写的,也不属于单一的webapp。所以我不能编辑网络应用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-26 18:49:38

我找到了答案,它适用于我检查过的少数Ajax和非ajax站点。在这个补丁之后,我不再需要做隐式等待,即使是ajax繁重的页面,LeGac在他对这个问题的一条评论中指出了以下代码。

代码语言:javascript
复制
public static void checkPendingRequests(FirefoxDriver driver) {
    int timeoutInSeconds = 5;
    try {
        if (driver instanceof JavascriptExecutor) {
            JavascriptExecutor jsDriver = (JavascriptExecutor)driver;

            for (int i = 0; i< timeoutInSeconds; i++) 
            {
                Object numberOfAjaxConnections = jsDriver.executeScript("return window.openHTTPs");
                // return should be a number
                if (numberOfAjaxConnections instanceof Long) {
                    Long n = (Long)numberOfAjaxConnections;
                    System.out.println("Number of active calls: " + n);
                    if (n.longValue() == 0L)  break;
                } else{
                    // If it's not a number, the page might have been freshly loaded indicating the monkey
                    // patch is replaced or we haven't yet done the patch.
                    monkeyPatchXMLHttpRequest(driver);
                }
                Thread.sleep(1000);
            }
        }
        else {
           System.out.println("Web driver: " + driver + " cannot execute javascript");
        }
    }
    catch (InterruptedException e) {
        System.out.println(e);
    }    
}



public static void monkeyPatchXMLHttpRequest(FirefoxDriver driver) {
    try {
        if (driver instanceof JavascriptExecutor) {
            JavascriptExecutor jsDriver = (JavascriptExecutor)driver;
            Object numberOfAjaxConnections = jsDriver.executeScript("return window.openHTTPs");
            if (numberOfAjaxConnections instanceof Long) {
                return;
            }
            String script = "  (function() {" +
                "var oldOpen = XMLHttpRequest.prototype.open;" +
                "window.openHTTPs = 0;" +
                "XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {" +
                "window.openHTTPs++;" +
                "this.addEventListener('readystatechange', function() {" +
                "if(this.readyState == 4) {" +
                "window.openHTTPs--;" +
                "}" +
                "}, false);" +
                "oldOpen.call(this, method, url, async, user, pass);" +
                "}" +
                "})();";
            jsDriver.executeScript(script);
        }
        else {
           System.out.println("Web driver: " + driver + " cannot execute javascript");
        }
    }
    catch (Exception e) {
        System.out.println(e);
    }
}

在每一步之后,您都需要调用

代码语言:javascript
复制
checkPendingRequests(driver);
票数 12
EN

Stack Overflow用户

发布于 2014-06-26 04:34:21

这不起作用?http://api.jquery.com/ajaxstop/

代码语言:javascript
复制
$(document).ajaxStop(function() {
    // Do stuff here...    
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24298925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档