解析量角器承诺后退出函数
Exit from function after resolving protractor promise
我对 JavaScript 和 Protractor 还很陌生。我的测试中有一个简单的任务我无法完成。
- 检查网页上的可用选项卡。
- 检查元素在网页上是否可见。
- a) 如果是,
return deffered.fullfil(true)
b) 如果否,
- 单击进行中选项卡
- 单击“可用”选项卡。
- 转到步骤 1。
我正在尝试递归执行此操作,下面是我的代码。它正在打印 Element found 但此后从未退出函数并超时。
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: 这是我正在使用的示例代码,更正了一些拼写错误和语法。
我在您的共享代码中发现了几个语法错误。下面我尝试修复这些错误并提供预期的行为,但仍然不知道 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;
};
首先,这段代码有拼写错误。 "deferred" 与一个 "f",因此调用 promise.deffer()
将给出 运行 时间错误。应该是.defer()
。 rpotractor
也拼写错误。你的代码甚至不能 运行.
其次,您使用的是反模式:当您已经从 browser.wait
获得了一个 promise 对象时,无需创建 promise/deferred。只是 return 那个(或 return 来自 then
链)。
此外,return element
是一个错误的 return 值。它是同步执行的,所以在等待结束之前,then
链会很快启动。相反,请确保 return browser.wait
returns.
的承诺
你可以这样做:
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 支持,因此您可以只使用 Promise
.
而不是使用 protractor.promise
我对 JavaScript 和 Protractor 还很陌生。我的测试中有一个简单的任务我无法完成。
- 检查网页上的可用选项卡。
- 检查元素在网页上是否可见。
- a) 如果是,
return deffered.fullfil(true)
b) 如果否,
- 单击进行中选项卡
- 单击“可用”选项卡。
- 转到步骤 1。
我正在尝试递归执行此操作,下面是我的代码。它正在打印 Element found 但此后从未退出函数并超时。
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: 这是我正在使用的示例代码,更正了一些拼写错误和语法。
我在您的共享代码中发现了几个语法错误。下面我尝试修复这些错误并提供预期的行为,但仍然不知道 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;
};
首先,这段代码有拼写错误。 "deferred" 与一个 "f",因此调用 promise.deffer()
将给出 运行 时间错误。应该是.defer()
。 rpotractor
也拼写错误。你的代码甚至不能 运行.
其次,您使用的是反模式:当您已经从 browser.wait
获得了一个 promise 对象时,无需创建 promise/deferred。只是 return 那个(或 return 来自 then
链)。
此外,return element
是一个错误的 return 值。它是同步执行的,所以在等待结束之前,then
链会很快启动。相反,请确保 return browser.wait
returns.
你可以这样做:
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 支持,因此您可以只使用 Promise
.
protractor.promise