簡體   English   中英

使量角器投票承諾,直到滿足條件

[英]Make Protractor poll promise until condition is met

我正在用 jasmine 為 AngularJS 編寫量角器測試。 我正在跟蹤表中的一行,該行將從正在進行的表移動到已完成的表。 此移動可能需要 30 秒到 20 分鍾不等。 我需要讓 Protractor 等待該行出現在 Completed 表中。

我在行中使用 2 個元素將其標識為我正在跟蹤的行。 該行的搜索函數是一個復雜的元素選擇器和驗證鏈,它返回一個 Promise,該 Promise 解析為包含該行元素的對象。 大致簡化:

searchForElement = function() {
  var response = element.all(by.repeater(...))
                 .then(...)
                 .then(...)
                 .filter(...)
                 .then(... 
                     //if found, response.value = element object 
                     //if not found, response.value = false
                  );
  return response;
};

我嘗試從 browser.wait() 中調用搜索,但即使找到了該行,它仍然停留在 browser.wait() 中並且 jasmine 超時。 我嘗試將 jasmine.DEFAULT_TIMEOUT_INTERVAL 更改為 1500000 和 0,但它仍然超時。

browser.wait( function() {
  searchForElement().then( function (result) {
    // if result.value is an object, return true
  });
}, timeout).then( function() {
  // assertions
});

在互聯網上搜索后,我嘗試使用 $interval,但出現錯誤,說 $interval 未定義。 顯然它不打算用於測試。

如何按時間間隔輪詢搜索函數(返回 Promise),以便在 Completed 表中找到該行時停止輪詢,如果未找到該行,則在 25 分鍾后超時?

已解決:我有 2 個錯誤。

首先,我沒有從 browser.wait 循環返回true 所以搜索函數找到了元素,但它卡在了等待循環中。 這是我的解決方案:

var visible = false;
browser.wait( function() {
  searchForElement().then( function (result) {
    // if result.value is an object, set visible to true
    visible = true;
  });
  return visible;
}, timeout).then( function() {
  // assertions
});

其次,如果 browser.wait 上的超時時間大於 jasmine.DEFAULT_TIMEOUT_INTERVAL,那么代碼可以成功退出 browser.wait,然后立即報告 jasmine 超時,因為it塊沒有在 jasmine 超時內完成。

我還得出結論,沒有必要使用間隔來輪詢搜索函數,因為搜索返回一個 Promise。 browser.wait 循環只是不斷調用搜索函數,直到它得到所需的響應。

嘗試這個

var elementWeWaitFor = element(by.id('element1'));    
var EC = protractor.ExpectedConditions;
    browser.wait(EC.presenceOf(elementWeWaitFor), 20000).then(function() {
        elementWeWaitFor.click(); //or do whatever with the element
});

暫無
暫無

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

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