[英]Selenium/WebdriverJs/Protractor promise chaining with page objects
[英]Selenium WebdriverJS Promise Loop
我試圖在容器中查找“更多”鏈接,以保持單擊狀態,直到該鏈接不再存在。 我正在創建一個延遲的,並在不再有“更多”鏈接可用的情況下,通過執行調用返回它。
.then(function (previousResults) {
var deferred = webdriver.promise.defer();
// look for the more link, keep clicking it till it's no longer available
browser.wait(function() {
// see if we have "more" to click on
browser.findElements(byMoreLinkXpath)
.then(function (moreLinks) {
if (moreLinks[0]) {
console.log('has more');
moreLinks[0].click()
.then(function() {
// check for spinner to go away
browser.wait(pageDoneLoading, configSetting.settings.testTimeoutMillis);
});
} else {
console.log('no more');
deferred.fulfill(true);
}
});
}, 5000);
return deferred.promise;
})
不幸的是,這個承諾永遠都無法兌現。 我試圖做一個return deferred.promise;
的return deferred.promise;
在else
塊中,盡管它可以reject
,但是仍然不能fulfill
。
webdriver.wait
的語法:
但是在您的代碼中,第一個參數既不是condition
也不是promise
而是function
,因此我將其更改為:
另外,我認為您在此處所做的工作是promise anti-pattern(同樣,我也沒有看到再次檢查更多鏈接的循環,對不起,但我認為您不完全了解driver.wait
),我只會簡化上述功能如:
function exhaustMoreLinks(){
return driver.wait( until.elementLocated(byMoreLinkXpath), 5000)
.then(function(){
return driver.findElement(byMoreLinkXpath);
}).then(function(moreLink){
console.log('more links');
return moreLink.click();
}).then(function(){
return browser.wait(pageDoneLoading(), configSetting.settings.testTimeoutMillis).then(exhaustMoreLinks);
}, function(err){
if(err.name === 'NoSuchElementError' || (err.message.search(/timed out/i)> -1 && err.message.search(/waiting element/i) > -1) ){ // checking if error because time-out or element not found, if true, redirect to fulfil
console.log('no more links');
return;
}else{
throw err;
}
});
}
和用法如下:
...
.then(exhaustMoreLinks)
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.