gpt4 book ai didi

javascript - Selenium WebdriverJS Promise 循环

转载 作者:行者123 更新时间:2023-11-28 00:14:19 28 4
gpt4 key购买 nike

我正在尝试在容器中查找“更多”链接,然后继续单击它,直到该链接不再存在。我正在创建一个延迟,并在不再有可用的“更多”链接时通过执行调用返回它。

.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;
})

不幸的是,这个 promise 永远不会兑现,只是超时了。我尝试在 else block 中执行 return deferred.promise; ,虽然它适用于 reject,但它仍然不适用于 >履行

最佳答案

webdriver.wait的语法:

wait(condition, opt_timeout, opt_message)

但是在您的代码中,第一个参数既不是条件也不是 promise 而是一个函数,所以我将其更改为:

另外,我认为你在这里所做的是 promise 反模式(而且我没有看到再次检查更多链接的循环,抱歉,但我认为你不完全理解 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)
...

关于javascript - Selenium WebdriverJS Promise 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30605820/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com