WebDriver's executeScript返回alert文本,而不是JavaScript方法返回的值

WebDriver's executeScript returns text of alert instead of value returned from JavaScript method

本文关键字:返回 JavaScript 方法 文本 alert executeScript WebDriver      更新时间:2023-09-26

我的HTML Javascript代码如下:

function CallMe(a,b){
            alert("Hello");
            var c = a + b;
            return c;
        }

和我的Selenium-WebDriver的Java代码如下

JavascriptExecutor executor = (JavascriptExecutor)driver;
Object result = null;
try{
    result = executor.executeScript("return(CallMe(5,4))");
    driver.switchTo().alert().accept();
}catch(NoAlertPresentException ex){
    System.out.println("Alert not found");
}
driver.manage().timeouts().setScriptTimeout(30,TimeUnit.SECONDS);
System.out.println(result.toString());

现在,下面java程序的输出是"Hello",这是警告框的文本,而如果我删除警告框,那么结果是"9",这是我所期望的。

有人能建议为什么当遇到警告框时JavaScript的其余语句不执行,而且我在Java代码中也接受该警告框。

alert()阻止javascript执行,直到警报被驳回,所以我假设WebDriver的JavascriptExecutor决定短路并在遇到警报框时返回文本,而不是在您试图同步执行整个脚本时无限期挂起。这允许Java继续执行,并允许驱动程序切换到并关闭警告框。此时,javascript将继续,但webdriver不再接收结果。

如果您很好奇,您可以修改您的函数以显示执行暂停,如下所示

function CallMe(a,b){
    console.log('before alert at ' +new Date().toString());
    alert("Hello");
    console.log('after alert at ' +new Date().toString());
    var c = a + b;
    return c;
}

作为一个解决方案,你可能想要使用executeAsyncScript()而不是executeScript()来避免阻塞问题,等待直到警报显示,关闭它,然后检索你的javascript执行的结果。请参阅WebDriver executeAsyncScript vs executeScript,并等待在Java中Selenium WebDriver (Selenium 2)的警报处理的答案中显示的说明。