解析量角器承诺后退出函数

Exit from function after resolving protractor promise

我对 JavaScript 和 Protractor 还很陌生。我的测试中有一个简单的任务我无法完成。

  1. 检查网页上的可用选项卡。
  2. 检查元素在网页上是否可见。
  3. a) 如果是,return deffered.fullfil(true)
    b) 如果否,
    - 单击进行中选项卡
    - 单击“可用”选项卡。
    - 转到步骤 1。

我正在尝试递归执行此操作,下面是我的代码。它正在打印 Element found 但此后从未退出函数并超时。

var check_availability = function(counter, totalCount, element){
var deferred = potractor.promise.defer()
if(counter <= totalCount){
    browser.wait(function(){
        browser.wait(EC.visibilityOf(element),2000)
        return element
    }).then(function(success){
        console.log('Element found.')
        return deferred.fulfill(true)
    }, function(err){
       inprogressTab.click()
       .then(() => availableTab .click())
       .then(() => check_availability (counter+1 , totalCount, element))
    })
   } else{
   return deferred.reject(false)
  }
  return deferred.promise
}

PS: 这是我正在使用的示例代码,更正了一些拼写错误和语法。

我在您的共享代码中发现了几个语法错误。下面我尝试修复这些错误并提供预期的行为,但仍然不知道 inprogressTab 来自哪里。

const check_availibility = function(counter, totalCount, element) {
  const deferred = protractor.promise.defer();
    if (counter <= totalCount) {
       browser
        .wait(() => browser.wait(EC.visibilityOf(element), 2000))
   .then(
    element => {
      console.log("Element found.");
      return deferred.fulfill(true);
    },
    err => {
      inprogressTab
        .click()
        .then(() => availableTab.click())
        .then(() => check_availibility(counter + 1, totalCount, element));
    }
  );
} else {
   return deferred.reject(false);
}
  return deferred.promise;
};

首先,这段代码有拼写错误。 "deferred" 与一个 "f",因此调用 promise.deffer() 将给出 运行 时间错误。应该是.defer()rpotractor 也拼写错误。你的代码甚至不能 运行.

其次,您使用的是反模式:当您已经从 browser.wait 获得了一个 promise 对象时,无需创建 promise/deferred。只是 return 那个(或 return 来自 then 链)。

此外,return element 是一个错误的 return 值。它是同步执行的,所以在等待结束之前,then 链会很快启动。相反,请确保 return browser.wait returns.

的承诺

你可以这样做:

var check_availibility = function(counter, totalCount, element){
    if (counter <= totalCount) {
        return browser.wait(function () {
            return browser.wait(EC.visibilityOf(element), 2000)
//          ^^^^^^
        }).then(function () {
            console.log('Element found.')
            return true;
        }).catch(function (err) {
            return inprogressTab.click()
//          ^^^^^^
                .then(() => availableTab.click())
                .then(() => check_availibility(counter+1 , totalCount, element))
        })
    } else {
        return protractor.promise.rejected(false);
    }
}

请注意,自 EcmaScript2015 以来,JavaScript 具有原生 Promise 支持,因此您可以只使用 Promise.

而不是使用 protractor.promise