【问题标题】:What does Protractor browser.wait return if the condition never becomes true?如果条件永远不会为真,Protractor browser.wait 会返回什么?
【发布时间】:2017-10-18 04:31:10
【问题描述】:

我想使用 browser.wait 函数反复检查按钮元素是否存在一定时间,然后使用相关回调。下面我有不使用等待的代码。

detailsButton.isPresent()
    .then(function(present){
        if(!present) {
            callback();
        } else {
             callback(new Error('The details button was not present.'));
        }
    });

我需要一些帮助来修复此代码,因为我不确定等待函数如何处理故障/超时。本质上,我是在问下面代码的“.then”部分应该是什么,它不像我目前所拥有的那么笨重。

browser.driver.wait(function(){
    return pgTransactionHistory.transactionHistoryDetails.isPresent();
}, 60000).then(function(){
    pgTransactionHistory.transactionHistoryDetails.isPresent()
        .then(function(present){
            if(!present) {
                callback();
            } else {
                callback(new Error('The details button was not present.'));
            }
        });
});

谢谢!

【问题讨论】:

    标签: promise protractor wait


    【解决方案1】:

    有两种方法可以做到这一点: 首先,您可以将 browser.wait 的第三个参数用于将作为错误消息发送的字符串。像这样:

    browser.driver.wait(function(){
        return //condition
    }, timeout, 'Error message string')
        .then(function(){
            callback();
        });
    

    或者其次使用 .then 的第二个参数,如下所示:

    browser.driver.wait(function(){
        return //condition
    }, timeout)
        .then(function(){
            callback();
        }, function(){
            //code to want to execute on failure.
        });
    

    【讨论】:

    • 为什么量角器不只是拒绝错误并让它最终出现在 .catch 处理程序中?
    【解决方案2】:

    等待函数超时拒绝。也就是说 - 它返回一个承诺,当达到超时时它会拒绝它。

    browser.driver.wait(function(){
        return pgTransactionHistory.transactionHistoryDetails.isPresent();
    }, 60000).then(function(){
        callback(); // instead of doing this, you should return a promise
    }).catch(function(){
        callback(new Error('The details button was not present.'));
    });
    

    【讨论】:

    • 感谢您的回答!但是由于某种原因,添加 .catch() 会导致错误:“未定义不是函数。”当我离开时,它可以顺利工作,而且显然什么都不会被“抓住”。
    • 好的,所以我让它工作的方法是使用 browser.wait 的第三个参数,它是一个用作错误消息的字符串。似乎我应该更仔细地阅读文档......不确定为什么 catch 不起作用。
    【解决方案3】:

    由于 Protractor 提供了同步编写异步操作的能力,因此也可以以更同步的方式处理 browser.wait 超时。

    export class AppPage {
    
      public static isLoaded() {
        return browser
         .wait(until.presenceOf(by.id('myID')), 5000)
         .then(() => true, () => false);
      }
    }
    

    并在您的 e2e.spec 中使用它,如下所示:

    expect(AppPage.isLoaded()).toBeTruthy();
    

    【讨论】:

    • 虽然这行得通,但我想知道 expect 在幕后做了什么,这是否会阻塞线程。
    猜你喜欢
    • 1970-01-01
    • 2017-05-25
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多