我对JavaScript和量角器不熟悉。我的测试中有一个简单的任务,我无法完成。
return deffered.fullfil(true)
我正在尝试递归执行此操作,下面是我的代码。正在打印找到的Element,但此后再也不会退出该功能并超时。
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:这是我正在使用的示例代码,更正了一些拼写错误和语法。
答案 0 :(得分:1)
我在您的共享代码上看到一些语法错误。下面,我尝试修复这些错误并提供了预期的行为,但仍然不知道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;
};
答案 1 :(得分:1)
首先,此代码存在拼写错误。 “ deferred”与一个“ f”一起使用,因此调用promise.deffer()
将给出运行时错误。它应该是.defer()
。 rpotractor
的拼写也错误。您的代码甚至无法运行。
第二,您正在使用anitpattern:当您已经从browser.wait
获得一个promise对象时,就无需创建一个promise / deferred。只需返回一个(或从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原生支持,因此您可以使用protractor.promise
来代替Promise
。