我处理的某些网站有大量的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);