![](/img/trans.png)
[英]can async with fetch poll until a condition is met? (survive rejection)
[英]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.