如何检查浏览器中是否有待处理的请求(Ajax及其变体)

我处理的某些网站有大量的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请求或任何其他类似的选择。

测试不是由我编写的,也不属于单个webapp。因此,我无法编辑Webapp。

回答:

我找到了答案,并且对我检查过的一些Ajax和非Ajax网站都有效。在这个补丁之后,我不再需要隐式等待,甚至不需要等待大量的ajax页面,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);

以上是 如何检查浏览器中是否有待处理的请求(Ajax及其变体) 的全部内容, 来源链接: utcz.com/qa/407004.html

回到顶部