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

时间:2014-06-06 06:46:31

标签: java javascript selenium selenium-webdriver webdriver

我在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代码中也接受了警告框。

另外一个替代解决方案将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

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的答案和等待Alert handling in Selenium WebDriver (selenium 2) with Java的答案。