programing

브라우저에서 보류 중인 요청(Ajax 및 그 변형)이 있는지 확인하는 방법

skycolor 2023. 10. 24. 21:09
반응형

브라우저에서 보류 중인 요청(Ajax 및 그 변형)이 있는지 확인하는 방법

제가 거래하는 사이트 중에는 아약스 요청이 많은 곳도 있습니다.요소에 대한 주장을 클릭하기 전에 Ajax 요청이 완료될 때까지 기다릴 계획입니다.현재 사용중입니다.

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 라이브러리의 변형을 가진 유사한 요청에는 작동하지 않습니다.

참고:

document.readyState == 'complete'

Ajax 요청이나 다른 유사한 대안에는 적용되지 않습니다.

테스트는 제가 작성한 것도 아니고 하나의 웹앱에 속하지도 않습니다.그래서 웹앱을 편집할 수 없습니다.

답을 찾았는데 몇 개의 Ajax 사이트와 non-ajax 사이트에서 확인했습니다.이 패치 이후로 저는 더 이상 암묵적인 웨이팅을 할 필요가 없습니다. 심지어 ajax high page에 대해서도 말입니다. LeGac은 질문에 대한 그의 의견 중 하나에서 다음 코드를 지적했습니다.

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);
    }
}

모든 단계가 끝나면 전화를 해야 합니다.

checkPendingRequests(driver);

이거 안 돼요?http://api.jquery.com/ajaxstop/

$(document).ajaxStop(function() {
    // Do stuff here...    
});

JSONP 요청을 사용하는 경우 다음 처리를 활성화해야 합니다.

jQuery.ajaxPrefilter(function( options ) {
    options.global = true;
});

제 생각에는 우리가 생각하는.active맞지만, 아마도 당신이 사용한 방식은 거짓을 반환할 수 있습니다.instanceof조건들.

또는 테스트에서 다음을 사용하여 jQuery ajax 호출을 기다리는 다른 방법을 확인합니다.

browser.wait_for_condition("selenium.browserbot.getCurrentWindow().jQuery.active === 0;", '30000')

댓글에 대한 저희의 논의를 토대로 생각해보면, 이것이 당신에게 도움이 될 것 같습니다.

프로토타입으로.js:

var ACTIVE_REQUESTS = 0; // GLOBAL

ACTIVE_REQUESTS++
new Ajax.Request('/your/url', {
  onSuccess: function(response) {
    ACTIVE_REQUESTS--;
    // Handle the response content...
  }
}));

console.log("there are " + ACTIVE_REQUESTS + " open AJAX requests pending");

일반 스크립트 사용 시:

interValRef = 0;

interValRef = setInterval("checkState();",100)

function checkState(){
    if(document.readyState == 'complete'){
        clearInterval(interValRef);
        myFunc();
    }
}

출처: AJAX 요청 보류 또는 HTTP GET/POST 요청 확인

언급URL : https://stackoverflow.com/questions/24298925/how-to-checkif-there-are-pending-requests-ajax-and-its-variants-from-browser

반응형