【发布时间】:2016-09-21 08:30:04
【问题描述】:
我一直在玩量角器和承诺,我对我得到的不同结果感到困惑。我有三个测试,基本上加载 www.angularjs.org 并等待“主页”链接。
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 通过并输出element visible。
test2 失败,出现异常 Error while waiting for Protractor to sync with the page: "[ng:test] http://errors.angularjs.org/1.5.8/ng/test" 或 Error: Error while waiting for Protractor to sync with the page: "window.angular is undefined.
test3不打印element visible,间歇性输出error: WebDriverError: no such session (Driver info: chromedriver=2.22.397929 (fb72fb249a903a0b1041ea71eb4c8b3fa0d9be5a),platform=Mac OS X 10.10.5 x86_64)
有趣的是,如果我将browser.get("angularjs.org"); 移动到beforeEach 块,test2 不会抛出错误并输出element visible,而无论browser.get("angularjs.org"); 的位置如何,test1 和 test3 的行为都是相同的。
所以我的问题是
- 为什么将
browser.get("angularjs.org");放在beforeEach块中会使test2 工作,为什么browser.get("angularjs.org");的位置不影响test1 和test3? - 为什么 test3 不输出
element visible?
更新 我通过
修复了test3- 从 fn1 返回浏览器承诺
- 在
fn1().then( ... )中返回浏览器承诺 - 将一个额外的
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);
})
});
}
})
【问题讨论】:
-
//do stuff到底是什么? -
您是否尝试将
.catch()处理程序添加到您的承诺中? -
@Bergi 我编辑了问题并将错误处理添加到 test3,现在输出
WebDriverError: no such session。删除了//do stuff,因为它只是一条评论。 -
在test2中,你应该用
Promise.resolve替换fn1(),在test3中你应该避免fn1中的Promiseconstructor antipattern。同样在 test3 中,您忘记了 test2 中then回调中的return。尽管这些都不能真正解释错误。
标签: javascript protractor