ng:测试没有找到getTestability元素参数的注入器

时间:2016-05-26 23:00:03

标签: javascript angularjs protractor

关于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元素中,但它没有任何改变,仍然是同样的错误。

那有什么不对?

3 个答案:

答案 0 :(得分:1)

Protractor的核心价值在于它可以为您管理角度加载,包括同步,因此您非常想要使用:browser.ignoreSynchronization = true

您收到的错误消息是量角器无法定位角度以便同步。这是因为两个问题的组合:

  • 页面未就绪,未加载角度
  • 即使页面已加载
  • ,也无法找到ng-app

首先,来自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将失败。