브라우저에서 보류 중인 요청(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
'programing' 카테고리의 다른 글
SQL(MariaDB) NULL 값이 무시됩니다. (0) | 2023.10.24 |
---|---|
__m128i 변수 인쇄 (0) | 2023.10.24 |
오픈 스로우를 호출하기 전에 XMLHttpRequestresponseType을 설정하는 이유는 무엇입니까? (0) | 2023.10.24 |
HTML Tidy에서 메타 태그( 스키마 마크업)를 처리하지 못하도록 방지합니다. (0) | 2023.10.24 |
자바스크립트를 사용하여 X초 대기 후 페이지 리디렉션 (0) | 2023.10.24 |