WebDriver's executeScript返回alert文本,而不是JavaScript方法返回的值
WebDriver's executeScript returns text of alert instead of value returned from JavaScript method
我的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)的警报处理的答案中显示的说明。
相关文章:
- 连续两页返回Javascript
- 返回Javascript中字符串的特定部分
- 返回 JavaScript 类值而不是对象引用
- 返回JavaScript函数中的值
- 基本否则如果并返回JavaScript
- 如何让php“json_encode”返回Javascript数组而不是Javascript对象
- 函数内部的函数vs函数返回JavaScript中的函数
- 返回Javascript中给定正则表达式的文本范围数组
- 返回javascript中regex字符串的一部分
- 返回javascript对象中的最大值
- AJAX请求返回Javascript获胜't返回特定函数,但将返回其他函数
- 检测数组的所有函数何时返回:javascript
- 函数,返回javascript中两个字符串数组的差值
- 返回javascript数组中具有最低值的对象
- 返回javascript中最匹配的数组项
- 试图理解返回javascript方法的服务器响应
- 获取 Checked Checbox 的值返回 JavaScript/ASP.NET VB 中未定义的值
- 如何在金字塔/塔中返回 JavaScript
- 返回 javascript 中数组的数字
- 返回 JavaScript 对象警报“未定义”