解决量角器承诺后退出功能

时间:2020-01-18 10:05:50

标签: javascript protractor cucumberjs

我对JavaScript和量角器不熟悉。我的测试中有一个简单的任务,我无法完成。

  1. 检查网页上的可用标签。
  2. 检查元素在网页上是否可见。
  3. a)如果是,return deffered.fullfil(true)
    b)如果否,
    -点击“进度”标签
    -点击“可用”标签。
    -转到步骤1。

我正在尝试递归执行此操作,下面是我的代码。正在打印找到的Element,但此后再也不会退出该功能并超时。

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:这是我正在使用的示例代码,更正了一些拼写错误和语法。

2 个答案:

答案 0 :(得分:1)

我在您的共享代码上看到一些语法错误。下面,我尝试修复这些错误并提供了预期的行为,但仍然不知道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;
};

答案 1 :(得分:1)

首先,此代码存在拼写错误。 “ deferred”与一个“ f”一起使用,因此调用promise.deffer()将给出运行时错误。它应该是.defer()rpotractor的拼写也错误。您的代码甚至无法运行。

第二,您正在使用anitpattern:当您已经从browser.wait获得一个promise对象时,就无需创建一个promise / deferred。只需返回一个(或从then链返回的一个)即可。

此外,return element是错误的返回值。它是同步执行的,因此在等待结束之前,then链会启动得太早。相反,请确保返回 browser.wait返回的承诺。

您可以执行以下操作:

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原生支持,因此您可以使用protractor.promise来代替Promise