使用Java中的HtmlUnitDriver处理警报

时间:2014-05-15 10:30:45

标签: java htmlunit-driver

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

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

但HTMLUnitDriver给出了错误,如

java.lang.UnsupportedOperationException: alert() 

如何处理警报框?

2 个答案:

答案 0 :(得分:0)

如果您不需要检查警报是否实际显示,我建议您更改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。不过,我不确定它什么时候会包含在发行版中。

答案 1 :(得分:-1)

几年前就已经在HTMLUnitDriver中提出了实现alert-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处理它的唯一方法。