量角器:使用承诺
我一直在玩量角器和承诺,我对我得到的不同结果感到困惑。我有三个测试基本上加载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
,而test1和test3的行为相同,无论browser.get("angularjs.org");
的位置如何。
所以我的问题是
- 为什么把
browser.get("angularjs.org");
在beforeEach
块使test2的工作,为什么不的browser.get("angularjs.org");
位置影响TEST1和TEST3? - 为什么不测试3输出
element visible
?
UPDATE 我固定由
- 返回从FN1
- 的浏览器的承诺在
fn1().then(...)
- 返回浏览器的承诺TEST3链的附加
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你Failed: Target URL angularjs.org is not well-formed.
没有得到这个例外。我认为你正在使用一个老版本的量角器。
当我改变的URL browser.get('https://www.angularjs.org')
就跑您的规格(火狐浏览器)中的所有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
正如你可以从上面的输出中看到所有三个测试已执行如预期的那样,承诺会相应返还。您的实施没有任何问题。
量角器的API完全异步并返回承诺,每个任务都排在ControlFlow中。为了理解这些任务是如何排队的以及控制流程如何工作的,请查看webdriverJS control flow API doc
“// do stuff”究竟是什么? – Bergi
您是否尝试在您的承诺中添加'.catch()'处理程序? – Bergi
@Bergi我编辑了这个问题,并将错误处理添加到test3,它现在输出'WebDriverError:no such session'。删除了/ /做东西,因为它只是一个评论。 – mws