我一直在玩 Protractor 和 promise ,我对得到的不同结果感到困惑。我有三个测试,基本上加载 www.angularjs.org 并等待“Home”链接。
describe('Sample tests', function() {
it("test1", function(){
browser.get("angularjs.org");
browser.wait(protractor.ExpectedConditions.visibilityOf(element(by.linkText('Home'))))
.then(function() {
console.log("element visible");
})
})
it("test2", function() {
browser.get("angularjs.org");
fn1().then(function(){
return browser.wait(protractor.ExpectedConditions.visibilityOf(element(by.linkText('Home'))))
.then(function() {
console.log("element visible");
})
});
function fn1() {
return new Promise(function (fulfill, reject){
fulfill();
});
}
})
it("test3", function() {
browser.get("angularjs.org");
fn1().then(function(){
browser.wait(protractor.ExpectedConditions.visibilityOf(element(by.linkText('Home'))))
.then(function() {
console.log("element visible");
}, function(err) {
console.log("error: " + err);
})
});
function fn1() {
return new Promise(function (fulfill, reject){
browser.manage().addCookie("abc", "123")
.then(function() {
console.log("set cookie");
fulfill();
}, function(err){
console.log("error in fn1: " + err);
})
});
}
})
})
test1传递并输出元素可见
。
test2 因异常而失败 等待 Protractor 与页面同步时出错:“[ng:test] http://errors.angularjs.org/1.5.8/ng/测试”
或 错误:WAITING Protractor 与页面同步时出错:“window.angle 未定义。
test3 不打印elementvisible
,并间歇性输出error: WebDriverError: no such session (Driver info: chromedriver=2.22.397929 (fb72fb249a903a0b1041ea71eb4c8b3fa0d9be5a),平台=Mac OS X 10.10.5 x86_64)
有趣的是,如果我将 browser.get("angularjs.org");
移动到 beforeEach
block ,test2 不会抛出错误并输出 元素可见
,而 test1 和 test3 的行为相同,无论 browser.get("angularjs.org");
的位置如何。
所以我的问题是
- 为什么将
browser.get("angularjs.org");
放在beforeEach
block 中会使 test2 工作,为什么的位置不起作用browser.get("angularjs.org");
影响 test1 和 test3 吗? - 为什么 test3 不输出
elementvisible
?
更新 我修复了 test3
- 从 fn1 返回浏览器 promise
- 在
fn1().then( ... )
中返回浏览器 promise - 将一个额外的
then
子句链接到末尾 (fn1().then().then()
) 并调用done()
.
it("test3", function(done) {
browser.get('https://www.angularjs.org')
fn1()
.then(function(){
return browser.wait(protractor.ExpectedConditions.visibilityOf(element(by.linkText('Home'))))
.then(function() {
console.log("element visible");
}, function(err) {
console.log("error: " + err);
})
})
.then(function(){
done();
});
function fn1() {
return new Promise(function (fulfill, reject){
return browser.manage().addCookie("abc", "123")
.then(function() {
console.log("set cookie");
fulfill();
}, function(err){
console.log("error in fn1: " + err);
})
});
}
})
最佳答案
首先,如果你传递 browser.get('angularjs.org')
你应该得到一个 webdriver 异常 失败:目标 URL angularjs.org 格式不正确。
你没有得到这个异常(exception)。我认为您使用的是旧版本的 Protractor。
当我将 url 更改为 browser.get('https://www.angularjs.org')
并运行您的规范(Firefox 浏览器)时,所有 3 个测试均通过并获得以下输出:
element visible // 1st test output
..element visible // 2nd test output
set cookie
.element visible // 3rd test output
3 specs, 0 failures
Finished in 8.661 seconds
正如您从上面的输出中看到的,所有三个测试都已按预期执行,并且相应地返回了 promise 。您的实现没有任何问题。
Protractor 的 API 完全是异步的并返回 Promise,每个任务都在 ControlFlow 中排队。为了了解任务如何排队以及控制流如何工作,请查看 webdriverJS control flow API doc
关于javascript - Protractor :使用 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39561783/