如何在Protractor中处理UnexpectedAlertOpenError

时间:2017-01-04 16:32:14

标签: javascript automation gulp protractor

我正在研究网站的自动化,我遇到了一个特定的问题。 我正在使用量角器而不是gulp来运行自动化测试以及gulp任务中包含的报告生成器。

手头的问题如下: 每当chrome触发警报时,量角器会停止并在控制台中抛出“UnexpectedAlertOpenError”,停止测试运​​行并取消生成报告。

我想知道是否有办法让规范失败并继续运行套件的其余部分。

我知道你可以这样做:

browser.get(url).catch(function () {

    return browser.switchTo().alert().then(function (alert) {

      alert.accept();
      return browser.get(url);

    });
  });

但我不希望量角器关闭警报并继续,我想在测试失败的地方失败,并返回错误消息以继续运行。

有没有办法做到这一点?是否可以将异常传递给catch函数并返回消息?我找不到有关该catch方法的任何文档。

谢谢!

编辑:在控制台上查看堆栈跟踪之后,我发现量角器检测到规格失败,并且当它试图截取屏幕截图时,例外来自记者(我使用的是量角器-jasmine2) -html-记者) 我要粘贴一些堆栈跟踪以防万一有人能弄清楚什么,我真的迷路了。

 E/launcher - UnexpectedAlertOpenError: unexpected alert open: {Alert text : You have pending changes}

From: Task: WebDriver.takeScreenshot()

EDIT2:我发现我的实施存在真正的问题。 npm插件protractor-jasmine2-html-reporter(我正在使用)试图在警报打开时截取屏幕截图,导致webdriver中断并保持报告生成。

我做了解决这个问题的方法是从他们的存储库中分叉,然后在尝试截取屏幕截图之前确认警报是否已打开并避免截取屏幕截图:

  function alertIsPresent() {
    return browser.driver.switchTo().alert()
     .then(function (alert) {
       alert.accept();
       return true;
       }, function (err) {
      return false;
     });
  };

如果它是打开的,我会关闭它并继续而不截取屏幕截图,否则截取屏幕截图。 通过这样做,报告生成正确,并在下一个规范报告中记录了打开警报。

希望这对某人有帮助。

3 个答案:

答案 0 :(得分:2)

您应该能够检查这些Error codes并通过茉莉花fail function强制失败

  browser.switchTo().alert().then(function(alert) {
    alert.accept();
  }, function(err) {
    if (err.code == webdriver.error.ErrorCode.UNEXPECTED_ALERT_OPEN) {
      fail('Fail this spec');
    }
  });

答案 1 :(得分:1)

奇怪的是,您的测试量角器测试完全失败并且量角器停止工作。如果是这种情况,请随时打开一个量角器问题。

我的猜测是你的it规范失败了,它会发出警报,导致其他测试不起作用。你可以做几件事:

每次测试后重启浏览器(请参阅config)。这将退出驱动程序会话并创建一个新的浏览器实例。你可以想象,这会减慢你的测试速度。在您的配置集中:

restartBrowserBetweenTests: true

尝试使用postTest plugin 。使用postTest检查测试是否失败,并检查是否有警报并关闭它。

postTest: function(passed, testInfo) {
  if (!passed) {
    // should check to see if there is an alert

    // close the alert
    return browser.switchTo().alert().then(function (alert) {
      return alert.accept();
    });
  }
}

答案 2 :(得分:1)

我遇到了类似的问题。搜索了几个小时,终于找到了:

unexpectedAlertBehaviour: 'accept'

有关更多信息,请参见https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities#read-write-capabilities。您基本上可以创建一个capabilities对象,并将所需的值传递给它:

capabilities: {
    browserName: "chrome",
    unexpectedAlertBehaviour: 'accept',
    chromeOptions: {
        args: ["--window-size=1920,1080", "--disable-gpu"],
    },
},

希望这会有所帮助!