Webdriver / Selenium Alert窗口问题

时间:2013-06-10 21:15:04

标签: selenium webdriver

我公司希望我使用JBehave和Selenium开发一个“Visual”GUI样式的BDD功能,它使用javascript alert / confirm弹出窗口提示用户运行测试的确切步骤,例如:

  • 鉴于我转到“www.google.com”
  • 我登录时

因此我们希望在自动化测试期间添加Javascript警报窗口以弹出窗口,弹出窗口中有“确定”按钮,因此当用户单击“确定”按钮时,测试将继续执行下一步,依此类推。 ..

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

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

所以我希望当我点击OK按钮时,弹出的窗口将消失,测试将继续下一步...但令我震惊的是,当我点击它时,测试抛出异常并崩溃...... < / p>

例外情况是:selenium.WebDriverException

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

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

这可以使测试运行良好,所以它看起来我不能手动点击警报(我手动点击后,硒仍然无法返回浏览器...失去与浏览器的连接?),但自动化警报处理代码工作...

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

我真的被困在这里一段时间了,并且做了很多谷歌搜索,但是在网上找不到类似的例子,我希望你可以让我了解它,因为你在JBehave和Selenium上比我更加大师

如果你能帮助我,我将非常感激。

1 个答案:

答案 0 :(得分:1)

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),我不知道如何:

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

  2. 但是,对于FF21,Selenium正如你所说的那样立即与UnhandledAlertException失败。

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

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

    js.executeScript("alert('something')");
    boolean alertVisible = true;
    while (alertVisible) {
        try {
            driver.switchTo().alert();
        } catch (NoAlertPresentException ignored) {
            alertVisible = false;
        }
    }
    

    两者都使FF失败,内部JavaScript异常。可能是一个可能被修复的错误(如果你对它感兴趣,请测试它,check whether it had been reportedreport it),所以我会把这些解决方案留给后代。

    但正如我之前所说的那样,它可能无法修复,因为Selenium不依赖于手动用户交互。

  3. 不确定其在其他浏览器中的表现。