Webdriver/Selenium 警报窗口问题

Webdriver/Selenium Alert window issue

我的公司希望我使用 JBehave 和 Selenium 开发一个"可视化"GUI 风格的 BDD 函数,它使用 javascript 警报/确认弹出窗口来提示用户运行测试达到的确切步骤,例如:

  • 鉴于我转到"www.google.com"
  • 当我登录时

所以我们想在自动化测试过程中添加Javascript警报窗口弹出,弹出的窗口有"确定"按钮,所以当用户点击确定按钮时,测试将继续下一步,以此类推。 ..

我的问题是:我使用 Selenium 的 executeScript API 编写了一个 javascript 函数,它调用弹出警报窗口:

1
2
3
public void stepText(String step) {
  executeScript("alert('"+step+"');");
}

所以我希望当我点击确定按钮时,弹出的窗口会消失,测试会继续下一步......但让我震惊的是,当我点击它时,测试抛出异常并崩溃......

例外是:selenium.WebDriverException

但我发现如果我添加以下代码以使测试自动检测警报窗口并使用以下常用的selenium警报句柄函数接受它:

1
2
Alert alert=switchTo().alert();
alert.accept();

这可以使测试运行良好,因此看起来我无法手动单击警报(手动单击后,selenium 仍然无法返回浏览器...失去与浏览器的连接?),但是自动化警报句柄代码有效...

当然,我们想让用户手动点击警报窗口来控制测试执行,而不是自动化处理警报。

我真的在这里卡了一段时间,并且做了很多谷歌搜索,但在网上找不到类似的例子,我希望你能告诉我,因为你在 JBehave 和 Selenium 上比我更大师.

如果您能帮助我,我将不胜感激。


Selenium 是一个浏览器自动化工具,它不会预测用户的交互。

因此,我会使用一个简单的 Java GUI 窗口来向用户展示消息/选项。毕竟,您是在浏览器中测试 Web 应用程序,但程序本身是 Java,与浏览器无关。一个普通的 Swing 选项对话框就足够了。

  • JOptionPane.showMessageDialog(null,"Login successful.");
  • String loginAs = JOptionPane.showInputDialog("Login as:","admin");
  • int choice = JOptionPane.showConfirmDialog(null,"Use production data?");

(请注意,您不想在 EventQueue.invokeLater() 块中调用它,因为您希望对话框被阻塞)

这样,您不会以任何方式与 Selenium 或浏览器进行交互,您不会混淆它并且您会清晰地获得用户输入。

也就是说,如果你坚持使用警报,我认为这绝对是可行的,但截至目前(2013 年 6 月,Selenium 2.33.0),我不知道如何:

  • 该问题在 IE8 上无法重现。在 executeScript("alert('Something.')"); 调用之后,Selenium 等待调用返回一些东西,然后正常进行。所以你擅长 IE。

  • 但是,对于 FF21,Selenium 会立即使用 UnhandledAlertException 失败,就像你说的那样。

    我尝试了两个明显的解决方案:

    1
    2
    3
    4
    5
    6
    js.executeScript("alert('something')");
    new WebDriverWait(driver, 10)
        .pollingEvery(100, TimeUnit.MILLISECONDS)
        .ignoring(UnhandledAlertException.class)
        .until(ExpectedConditions.not(ExpectedConditions.alertIsPresent()))
        .wait();

    1
    2
    3
    4
    5
    6
    7
    8
    9
    js.executeScript("alert('something')");
    boolean alertVisible = true;
    while (alertVisible) {
        try {
            driver.switchTo().alert();
        } catch (NoAlertPresentException ignored) {
            alertVisible = false;
        }
    }

    两者都使 FF 因内部 JavaScript 异常而严重失败。可能是一个可能会修复的错误(请测试它,检查它是否已被报告,如果您对它感兴趣,请报告它),所以我会将解决方案留给后代。

    但正如我之前所说,它可能不会得到修复,因为 Selenium 不依赖手动用户交互。

  • 不确定这在其他浏览器中的表现如何。