我正在尝试为我们的角度应用程序设置端到端测试,但遇到了一些障碍。
一个是自举。我们正在使用这个库:angular-deferred-bootstrap来引导我们的应用程序。这个库允许我们进行http调用,然后将结果注入我们的应用程序(作为角度value()
)。然后它调用bootstrap
函数实际用角度引导应用程序。我希望测试在这个boostrapping完成后运行。
这是我到目前为止所做的事情
describe('navigation should', function () {
beforeEach(function () {
// load homepage
browser.get('/');
}, 10000);
it('show side navigation', function () {
browser.wait(function () {
var deferred = protractor.promise.defer();
element(by.css('body.deferred-bootstrap-loading')).isPresent()
.then(function (isPresent) {
deferred.fulfill(!isPresent);
});
return deferred.promise;
});
});
});
图书馆方便地在deferred-bootstrap-loading
上放置body
课程。我等到这个被删除了。
问题有时我得到错误Error while waiting for Protractor to sync with the page: "[ng:test] no injector found for element argument to getTestability\nhttp://errors.angularjs.org/1.4.8/ng/test"
。
它似乎比它(测试)传递更频繁地产生这个错误。
我不明白这里的问题是什么?量角器在角度运行之前是否有机会运行?
我是否必须在回调中运行所有测试,因为browser.wait
会返回一个承诺?
此外,我希望此代码可以在每次测试时运行(等待bootstrapping完成)。组织这个的最佳方法是什么?
答案 0 :(得分:2)
我要做的是关闭同步,直到达到预期的条件:
beforeEach(function () {
var EC = protractor.ExpectedConditions;
browser.ignoreSynchronization = true;
browser.get('/');
// wait for deferred bootstrap body to not be present
var body = $("body.deferred-bootstrap-loading");
browser.wait(EC.stalenessOf(body), 10000).then(function () {
browser.ignoreSynchronization = false;
});
browser.waitForAngular(); // might not be needed
});
此外,我希望此代码可以在每次测试时运行(等待bootstrapping完成)。组织这个的最佳方法是什么?
请参阅:
答案 1 :(得分:0)
当您使用手动/半手动引导机制时,我不会使用browser.get()
,因为它等待加载Angular。而是使用browser.driver.get()
并在之后的deferred-bootstrap-loading
课程中添加等待。请参阅Angular的Setting Up the System Under Test。
所以类似下面的内容应该可以解决问题:
describe('navigation should', function () {
beforeEach(function (done) {
// load homepage
browser.driver.get('/');
browser.driver.wait(function () {
return browser.driver.isElementPresent(by.class('body.deferred-bootstrap-loading'))
.then(function (el) {
return el === false;
});
}).then(done);
}, 10000);
it('show side navigation', function () {
// normal test here
});
});
我还没有测试过上面的内容,但是你应该了解一下。
通过使beforeEach异步并等待类从body
标记中消失,您可以预期在运行it
块时所有内容都会运行。