关于SO的其他问题有同样的问题,但解决方案对我没有用。 这是我的spec.js
describe('Protractor Demo App', function() {
it('should have a title', function() {
browser.driver.get('http://rent-front-static.s3-website-us-east-1.amazonaws.com/');
expect(browser.getTitle()).toEqual('How It Works');
});
});
这是我的conf.js
exports.config = {
framework: 'jasmine',
rootElement: 'body',
seleniumAddress: 'http://localhost:4444/wd/hub',
specs: ['spec.js']
}
所以,当我尝试运行我的测试即时得到错误
Message:
Failed: 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.5.0/ng/test"
Stack:
Error: Failed: 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.5.0/ng/test"
at C:\Users\ShapeR\PycharmProjects\ratest\node_modules\jasminewd2\index.js:101:16
at Promise.invokeCallback_ (C:\Users\ShapeR\PycharmProjects\ratest\node_modules\selenium-webdriver\lib\promise.js:1329:14)
at TaskQueue.execute_ (C:\Users\ShapeR\PycharmProjects\ratest\node_modules\selenium-webdriver\lib\promise.js:2790:14)
at TaskQueue.executeNext_ (C:\Users\ShapeR\PycharmProjects\ratest\node_modules\selenium-webdriver\lib\promise.js:2773:21)
1 spec, 1 failure
我有一个body元素的手动引导,并在配置中将rootElement设置为body,但它没有帮助。我甚至尝试删除手动boostraping,只需将ng-app ='rentapplicationApp'添加到body元素中,但它没有任何改变,仍然是同样的错误。
那有什么不对?
答案 0 :(得分:1)
Protractor的核心价值在于它可以为您管理角度加载,包括同步,因此您非常想要使用:browser.ignoreSynchronization = true
。
您收到的错误消息是量角器无法定位角度以便同步。这是因为两个问题的组合:
首先,来自Protractor setup page。
如果您的页面使用手动引导程序,Protractor将无法使用browser.get加载您的页面。而是使用基本webdriver实例 - browser.driver.get。这意味着Protractor不知道您的页面何时完全加载,并且您可能需要添加一个等待语句以确保您的测试避免竞争条件。
解决方案1
添加wait声明。
解决方案2
如果您没有充分的理由进行手动引导,或者不想等待:
browser.get
而不是browser.driver.get
答案 1 :(得分:1)
[ng:test]找不到getTestability元素参数的注入器
我怀疑应用程序本身有错误,它的引导方式,因为Protractor
实际上找到了根元素(你可以在里面明确设置rootElement: "body.root"
您的配置也是如此),但根元素未能setup the injector。
我试着逐步弄清楚它发生了什么 - 首先,尝试针对直接从源启动的非构建应用程序运行量角器测试,以确保这不是webpack' s或构建错误的其他部分。
然后,我尝试升级到最新的1.x Angular和Protractor(3.3.0是最新版本)。
目前最简单的解决方法是使用browser.ignoreSynchronization = true
关闭Protractor和Angular之间的同步:
describe("Strange Protractor/Angular problem", function () {
beforeEach(function () {
browser.ignoreSynchronization = true;
browser.get("https://dl.dropboxusercontent.com/u/597502/vxcv/index.html");
var elm = $(".navbar-brand");
browser.wait(EC.presenceOf(elm), 5000);
});
it("should have an expected title", function () {
expect($(".navbar-brand").getText()).toEqual('RENT APPLICATION');
});
});
当然,这种方法存在缺点 - 你必须在这里和那里使用browser.wait
调用来解决时间问题。测试流程不像开启同步时那样自然而简单。
答案 2 :(得分:0)
问题在于引导我的应用程序。由于某种原因,它不适用于ng-app标签。唯一可行的解决方案是手动引导它
angular.bootstrap(document, ["rentapplicationApp"]);
第一个参数应该是dom节点,而不是字符串,就像在我的情况下一样,尽管使用字符串应用程序将起作用,但getTestability将失败。