我一直在玩量角器和承诺,我对我得到的不同结果感到困惑。我有三个测试基本上加载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 传递并输出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的行为相同,无论{的位置如何{1}}。
所以我的问题是
browser.get("angularjs.org");
块中放置browser.get("angularjs.org");
会使test2正常工作,为什么beforeEach
的位置不会影响test1和test3?browser.get("angularjs.org");
?更新 我通过
修复了test3element visible
fn1().then( ... )
子句链接到末尾(then
)并调用fn1().then().then()
。
done()
答案 0 :(得分:0)
首先,如果你通过browser.get('angularjs.org')
,你应该得到一个webdriver异常Failed: Target URL angularjs.org is not well-formed.
你没有得到这个例外。我认为您使用的是较旧版本的Protractor。
当我将网址更改为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
正如您从上面的输出中看到的,所有三个测试都按预期执行,并且相应地返回了承诺。您的实现没有任何问题。
Protractor的API完全异步并返回promise,每个任务都在ControlFlow中排队。为了理解任务排队的方式以及控制流程的工作原理,请查看webdriverJS control flow API doc