【问题标题】:Handling alerts using HtmlUnitDriver in Java在 Java 中使用 HtmlUnitDriver 处理警报
【发布时间】:2014-05-15 10:30:45
【问题描述】:

我想在 java 中使用 HTMLUnitDriver 处理警报。我正在使用以下代码使用 firefox 驱动程序处理警报,它工作正常。

Alert alert = driver.switchTo().alert();
alert.accept();

但是 HTMLUnitDriver 给出了类似

的错误
java.lang.UnsupportedOperationException: alert() 

如何处理那里的警报框?

【问题讨论】:

    标签: java htmlunit-driver


    【解决方案1】:

    如果您不需要检查警报是否实际出现,我建议您更改 JavaScript alert() 方法的行为以记录消息:

    JavascriptExecutor javascriptExecutor = (JavascriptExecutor) webDriver;
    javascriptExecutor.executeScript("window.alert = function(message){ console.log(message); };" +
        "window.confirm = function(message){ console.log(message); return true; };");
    

    然后你可以在你的代码中跳过HtmlUnitDriver.switchTo().alert().accept()

    注意:如果在初始页面加载时出现警报,此方法将不起作用,因为 Selenium 会在与页面交互之前等待页面加载。所以上面的 JavaScript 会执行得太晚。


    HtmlUnitDriver 版本2.25 开始,HtmlUnitDriver.switchTo().alert().accept() 不再抛出UnsupportedOperationException()。但是,accept() appears to do nothing except confirm that the alert is present。由于无法解除警报,因此使用上述方法关闭警报可能是最好/唯一的解决方案。如果您必须使用HtmlUnitDriver 测试警报,您可能需要两个单独的测试——一个用于检查警报是否出现,另一个用于检查在禁用警报时浏览器是否正常运行。


    如果您迫切需要警报处理并且您可以从源代码构建,alert handling has been implemented in the master branch of HtmlUnitDriver。不过,我不确定它什么时候会发布。

    【讨论】:

      【解决方案2】:

      在 HTMLUnitDriver 中实现警报 API 的请求已在几年前提出。这是链接:

      https://code.google.com/p/selenium/issues/detail?id=1105&q=alert%28%29&colspec=ID%20Stars%20Type%20Status%20Priority%20Milestone%20Owner%20Summary

      由于这似乎很难破解,因此您必须考虑一些技巧来规避 JavaScript 中的模式对话框(警报、确认等)。至少在他们实现 alert-API 之前。

      阻止显示模式对话框的技巧包括向您的 Selenium 脚本添加额外的 JavaScript。例如更改回调函数以避开警告框。

      另外,请注意不可能使用 JavaScript 本身关闭/取消/确认模式对话框。这就是为什么你应该阻止他们展示的原因。这是出于安全原因。

      在实现 alert-API 之前,这是使用 HtmlUnitDriver 处理它的唯一方法。

      【讨论】:

        猜你喜欢
        • 2017-05-14
        • 1970-01-01
        • 2012-01-04
        • 1970-01-01
        • 2015-03-23
        • 1970-01-01
        • 1970-01-01
        • 2017-06-29
        • 1970-01-01
        相关资源
        最近更新 更多