selenium - Webdriver/Selenium Alert 窗口问题

标签 selenium webdriver

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

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

所以我们想在自动化测试的时候在弹窗中加入Javascript alert window,弹窗有“OK”按钮,当用户点击OK按钮时,测试会继续下一步,以此类推。 ..

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

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

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

异常是:selenium.WebDriverException

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

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

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

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

我真的被困在这里一段时间了,做了很多谷歌搜索,但在网上找不到类似的例子,我希望你能告诉我,因为你在 JBehave 和 Selenium 方面比我高明得多.

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

最佳答案

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

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

  • JOptionPane.showMessageDialog(null, "登录成功。");
  • String loginAs = JOptionPane.showInputDialog("Login as:", "admin");
  • int choice = JOptionPane.showConfirmDialog(null, "使用生产数据?");

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

这样,您就不会以任何方式与 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. 不确定这在其他浏览器中的表现如何。

关于selenium - Webdriver/Selenium Alert 窗口问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17033008/

相关文章:

function - Selenium 中的驱动程序不存在 getWindowHandle 函数

selenium webdriver 在 sendKeys 之前填充字段后清除字段

selenium - WebDriver - Internet Explorer 中的关键命令

javascript - 在 Nightwatch 中设置 Firefox 首选项

java - selenium webdriver 如何获取在 iframe 所见即所得文本区域中输入的文本

java - 如何使用 Selenium 下载网页源

firefox - 在 Firefox 和 Selenium 测试中自动化 SSL 客户端证书

java - 为什么 webdriver 对于不同的 id 和 xPath 索引返回相同的元素?

css - 将 xpath 转换为 css

java - webdriver,你能帮忙使用java获取选项吗?