【问题标题】:Make Protractor wait for an alert box?让量角器等待警报框?
【发布时间】:2015-07-28 06:02:20
【问题描述】:

我正在为登录页面编写 E2E 测试。如果登录失败,则会弹出一个警告框,通知用户用户名或密码无效。日志本身是对 Web 服务的调用,控制器正在处理回调。当我在量角器中使用browser.switchTo().alert(); 时,它发生在回调完成之前。有什么方法可以让 Protractor 等待该警报框弹出?

【问题讨论】:

    标签: angularjs protractor


    【解决方案1】:

    我在 Protractor 测试中使用以下语句解决了类似的任务:

    browser.wait(function() {
        return browser.switchTo().alert().then(
            function() { return true; }, 
            function() { return false; }
        );
    });
    

    通常,此代码会不断尝试切换到警报,直到成功(最后打开警报时)。更多细节:
    "browser.wait" 等待被调用函数返回 true。
    “browser.switchTo().alert()”尝试切换到打开的警报框,要么成功,要么失败。
    由于“browser.switchTo().alert()”返回了一个promise,那么promise要么被解析并且第一个函数运行(返回true),要么被拒绝并且第二个函数运行(返回false)。

    【讨论】:

    • 你能解释一下这段代码是如何工作的,特别是为什么 then() 包含它的作用吗?
    • @Samuli Kärkkäinen 解释已添加到答案中。希望这会有所帮助:)
    • 运行测试的开发人员都没有看到警报 switchTo 失败,但 CI 服务器的 10 次中有 1 次。您的解决方案挽救了这一天,谢谢。
    【解决方案2】:

    您现在可以使用 ExpectedConditions 库,这使代码更具可读性:

    function openAndCloseAlert () {
      var alertButton = $('#alertbutton');
      alertButton.click();
    
      // wait up to 1000ms for alert to pop up.
      browser.wait(protractor.ExpectedConditions.alertIsPresent(), 1000); 
    
      var alertDialog = browser.switchTo().alert();
      expect(alertDialog.getText()).toEqual('Hello');
      alertDialog.accept();
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多