簡體   English   中英

解決量角器承諾后退出函數

[英]Exit from function after resolving protractor promise

我對 JavaScript 和量角器相當陌生。 我的測試中有一項無法完成的簡單任務。

  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也拼錯了。 您的代碼甚至無法運行。

其次,您正在使用 anitpattern:當您已經從browser.wait獲得一個承諾對象時,無需創建承諾/延遲。 只需返回那個(或從then鏈返回的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 支持,因此您可以使用Promise而不是使用protractor.promise

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM