【问题标题】:WebDriver's executeScript returns text of alert instead of value returned from JavaScript methodWebDriver 的 executeScript 返回警报文本而不是 JavaScript 方法返回的值
【发布时间】:2014-07-27 08:50:29
【问题描述】:

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

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

【问题讨论】:

  • 我不确定,但不应该只是result = executor.executeScript("CallMe(5,4)");吗?
  • 如果我们去掉executeScript方法的“return”语句,在上面提到的Java程序中会抛出一个空指针异常,因为“result”变量没有得到任何值。

标签: java javascript selenium selenium-webdriver webdriver


【解决方案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 的答案中所示的说明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多