java - 在 Selenium GhostDriver 中使用 JavascriptExecutor 处理警报/确认

标签 java javascript selenium-webdriver phantomjs ghostdriver

我越来越绝望了。我在 Eclipse 中使用带有 Java 的 phantomjsDriver 1.1.0 的 Selenium 2.42.2。对于我的测试,当我打开一个页面时,我必须识别并存储警报和确认消息,也许还有提示消息。 phantomjsDriver 还没有实现它,所以我需要一个 JavascriptExecutor 的解决方法。但是我是js菜鸟,一个人搞不定。这是我的代码和我尝试过的:

DesiredCapabilities dcaps = new DesiredCapabilities();
String[] phantomArgs = new  String[] {
        "--webdriver-loglevel=NONE"};
dcaps.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
dcaps.setCapability(CapabilityType.SUPPORTS_ALERTS, true);
dcaps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, 
        phantomjs.getAbsolutePath());
dcaps.setCapability(PhantomJSDriverService.PHANTOMJS_CLI_ARGS, phantomArgs);
dcaps.setJavascriptEnabled(true);
WebDriver driver = new PhantomJSDriver(dcaps);

JavascriptExecutor js=(JavascriptExecutor) driver;
String script = "window.confirm = function(message) {"+
        "document.lastConfirmationMessage = message; return true; }";
js.executeScript(script);
driver.get("http://www.mysiteWithConfirm.de"); 
Object message = js.executeScript("return document.lastConfirmationMessage");

当我打开我的网站时,它会立即打开确认提示,所以我知道有一个确认。但我只是得到异常(exception)

Error Message => 'Can't find variable: lastConfirmationMessage'

最佳答案

我认为没有办法按照您尝试的方式解决它。 PhantomJDrvier (GhostDriver) API 目前还不支持警报处理 (here is the open issue for in GitHub)

可能的解决方案是重写 window.alert 以便将日志输出到控制台。 使用 ALERT 标签,您可以将控制台中的警报消息日志与其他日志区分开来。

page.evaluate(function() {
    window.alert = function(str) {
        console.log("ALERT:" + str);
    }
});

page.onConsoleMessage(function(message, lineNumber, sourceId) {
    if(/^ALERT:/.test(message)) {
       //do something with message
    }
});

我的回答基于这个 discussion .

关于java - 在 Selenium GhostDriver 中使用 JavascriptExecutor 处理警报/确认,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24954125/

相关文章:

java - Selenium 等到可点击但仍然不可点击

c#-4.0 - 无法按名称和 XPath 在 Selenium WebDriver 中找到元素

java web应用程序在第二次登录后销毁第一次登录 session

java - 在Java中使用SNMP查找网络中计算机的登录名

Java 到 Objective c

javascript - 使用 odata 和 jquery 从 Dynamics Crm 中的实体检索记录

javascript - 无法使用 selenium webdriver js 单击或提交按钮

java - 按位移位运算符还是 ByteBuffer.wrap?

javascript - 在 js 模态窗口中向下一步添加操作

javascript - 如果小时数小于 10,如何从 d3.time.format ("%I %p"中删除零)