【问题标题】:Webdriver/Selenium Alert window issueWebdriver/Selenium 警报窗口问题
【发布时间】:2013-06-10 21:15:04
【问题描述】:

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

  • 假设我转到“www.google.com”
  • 当我登录时

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

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

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

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

例外是:selenium.WebDriverException

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

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

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

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

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

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

【问题讨论】:

    标签: selenium webdriver


    【解决方案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. 不确定它在其他浏览器中的表现。

    【讨论】:

    • 非常感谢@Slanec!您通过使用 Swing 帮助我解决了这个问题。好吧,我还有一个问题,也许你可以帮帮我,我的公司希望我将 JMeter 与 JBehave 和 Selenium 一起使用来进行负载自动化测试,但我发现 JMeter 似乎只/通常支持使用其 IDE/GUI 进行手动测试,那么我如何编写 JMeter 的代码来自动化测试,我做了很多谷歌搜索,但找不到以编程方式使用 JMeter 的有用/实用示例......
    • 例如:如何使用 JMeter 的 API 编写代码来模拟“我是导航到 www.google.com 的 10 个用户之一”?如果您能提供帮助,我将非常感谢您...
    • @Brian 对不起,我从未使用过 JMeter。也就是说,从this 开始,似乎可以将 JMeter 设置为浏览器上的代理并像往常一样运行 WebDriver 测试。不过,不知道该怎么做。祝你好运!