【问题标题】:How to handle UnexpectedAlertOpenError in Protractor如何处理量角器中的 UnexpectedAlertOpenError
【发布时间】:2017-05-19 00:56:35
【问题描述】:

我正在研究网站的自动化,但遇到了一个特定问题。 我在 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;
     });
  };

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

希望这对某人有帮助。

【问题讨论】:

    标签: javascript automation gulp protractor


    【解决方案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"],
        },
    },
    

    希望这会有所帮助!

    【讨论】:

      【解决方案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');
          }
        });
      

      【讨论】:

      • 快速说明webdriver.error.ErrorCode 已被弃用。
      • @cnishina 嗯,这很有趣,我不知道。我看到它在我们的代码库中被使用,但也许它从未真正进入 if 检查。这是将要使用的还是已弃用的definitelytyped.org/docs/angular-protractor--angular-protractor/…
      • 我们将从最初的警报问题中得到一些侧向跟踪。首先,Protractor 当前使用webdriver.error.ErrorCode。 Selenium-webdriver 已弃用它,下一个版本的 Protractor(有望在一天结束之前发布)将没有 ErrorCodes。因此,如果您迁移到 Protractor 5.0.0+,请注意。其次,我会避免使用 DefintelyTyped angular-protractor 项目,因为 Protractor 自 4.0.0+ 起就支持类型。
      • 阅读以上内容。如果您升级到 Protractor 5.0.0+,它将被删除。
      • ty 我想我是在你评论的时候打字的。感谢您提供的信息,这非常有帮助,尤其是因为我们将来要升级
      【解决方案3】:

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

      我的猜测是您的 it 规范失败了,它会发出警报,导致其他测试无法工作。您可以做以下几件事:

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

      restartBrowserBetweenTests: true
      

      尝试使用postTestplugin。使用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();
          });
        }
      }
      

      【讨论】:

      • 感谢您的回复...我一定会尝试的。
      • 告诉我进展如何。同样值得一提的是,Protractor 也看到了类似的警报问题。在此处查看完整讨论:github.com/angular/protractor/issues/3925
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      • 2017-08-29
      • 2015-02-19
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      相关资源
      最近更新 更多