我正在尝试切换到iframe,但是,在切换之前,我必须等待脚本完成。
就像我在这里问的那样:Selenium switch to the wrong iframe when closing another one并回答了这个问题,我可以强制切换到父框架,并使用相同的想法切换到有或没有任何脚本的框架。
问题在于,强制开关不是实现此目的的好方法。这类似于使用Thread.sleep(500)
,因为我知道执行脚本大约需要500毫秒。
所以我正在尝试等待jQuery和JavaScript通过使用完成:
// Wait for JS
public static ExpectedCondition<Boolean> waitForJSToLoad() {
return new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(final WebDriver driver) {
return ((JavascriptExecutor) driver).executeScript("return document.readyState").toString().equals("complete");
}
};
}
// Wait for jQuery
public static ExpectedCondition<Boolean> waitForAjaxResponse() {
return new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(final WebDriver driver) {
try {
final JavascriptExecutor js = (JavascriptExecutor) driver;
return js.executeScript(
"return((window.jQuery == null )||(window.jQuery != null && jQuery.active === 0))").equals(true);
} catch (final WebDriverException e) {
LOG.info("Error while waiting for jQuery");
return false;
}
}
};
}
但是所有return语句都是正确的,所以我得到一个TimeOutException
,因为当我切换到框架时JS和jQuery已经完成,但这是错误的。
脚本如下所示:
function _optimizeSize() {
var $popin = $('#iframePopin'),
// Some var init
$dialog.transition({top: optimizeTop});
$popin.transition({height: contentHeight + actionBarHeight + popinPaddingHeight});
$iFrame.transition({height: contentHeight});
}
我看过类似的案例,但是找不到解决我问题的答案。