Webdriver/Selenium 警报窗口问题

Posted

技术标签:

【中文标题】Webdriver/Selenium 警报窗口问题【英文标题】:Webdriver/Selenium Alert window issue 【发布时间】: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 上比我更大师.

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

【问题讨论】:

【参考方案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),我不知道如何:

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

    但是,正如您所说,对于 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 reported 和 report it 如果您对此感兴趣),所以我会将解决方案留给后代。

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

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

【讨论】:

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

以上是关于Webdriver/Selenium 警报窗口问题的主要内容,如果未能解决你的问题,请参考以下文章

警报处理 - Selenium WebDriver/Selenium RC 2.18.0 - 异常

如何使用 C# 在 Selenium WebDriver (Selenium 2) 中最大化浏览器窗口?

如何搭建webdriver+selenium+nodejs自动化测试框架

如何搭建webdriver+selenium+nodejs自动化测试框架

使用 Java 的 Selenium WebDriver (Selenium 2) 中 selenium.refresh() 的等效代码

Selenium Webdriver概述