升级到Angular 2

时间:2016-10-11 18:58:31

标签: angularjs protractor

我有一个手动引导的Angular应用程序,其中编写了大量的Protractor测试。 2016年6月左右,测试工作正常,但不再适用。从那时起,发生了以下变化:

  • Angular 2已经发布
  • 已重写应用程序的登录部分。最初,登录页面根本没有使用Angular。现在它使用Angular 2.应用程序的其余部分仍然是Angular 1。

如果我在登录之后没有与应用程序交互,并且运行单个测试(例如"期望(true).toBe(true)"),那么一切都会运行完成,没有生成错误消息。

如果我的测试自动化确实与应用程序交互,则会发生以下情况:

  • 如果我的conf.js文件包含" useAllAngular2AppRoots:true",我收到错误消息:"超时等待Protractor在11秒后与页面同步。请参阅https://github.com/angular/protractor/blob/master/docs/faq.md"
  • 如果我的conf.js文件不包含" useAllAngular2AppRoots:true",我收到错误消息:"等待量角器与页面同步时出错:"无法找到元素的可测试性。"

在任何一种情况下,自动化都会通过登录进入应用程序的Angular1部分。

我的问题是:

  1. 这种应用程序(Angular2登录页面,其他一切Angular1)是否可以使用Protractor进行测试?
  2. 应该" useAllAngular2AppRoots:true"用吗?
  3. 我收到的错误消息似乎并未指向要修复的测试代码的特定区域。我怎样才能确定问题所在?
  4. 编辑2016年10月27日 收到这个问题的第一个答案后,我试图准确确定失败的原因,以及在哪里。

    我发现:

    • 在我的conf.js文件中设置rootElement无效。无论我是完全遗漏它,特别是将它设置为' body',还是将其设置为随机的无意义字符串,我都有相同的行为。
    • 按照给定的建议,我仍然收到一条错误消息' AfterAll Failed:等待Protractor与页面同步时出错:"无法找到元素的可测试性。"&# 39;请注意,我没有尝试在AfterAll函数中进行任何测试,只需单击“注销”按钮
    • 如果我设置' browser.ignoreSynchronization = true'在我的测试的beforeAll函数中,我可以进行与应用程序交互的调用,例如单击屏幕元素。没有这条线,没有这样的电话有任何影响。但是,我确信这不是我应该做的事情,或者我应该做的事情。
    • 即使使用' browser.ignoreSynchronization = true',当我尝试进行特定于Angular1的调用时,我仍然会收到错误消息,例如尝试使用by.repeater()匹配元素。这将发生在仍然以Angular 1编写的应用程序部分中,因此使用ng-repeat而不是ngFor。

    这些附加信息是否可以进一步了解可能发生的事情以及我可能尝试的其他方法?

1 个答案:

答案 0 :(得分:2)

首先,您需要确保使用最新的量角器(4.0.9)和zone.js> = 0.6.25。

然后,请确保为包含混合角1 + 2应用的每个页面设置browser.ng12Hybridtrue,即:

beforeEach(function () {
    browser.ng12Hybrid = true;
    browser.get('/somepage.html');
});

afterEach(function () {
    browser.ng12Hybrid = false;
});

您还可以在protractor's own test specs中找到示例。

至于useAllAngular2AppRoots: true,只有在您的应用完全迁移到Angular 2并且您已移除升级适配器后才能使用它,如here所述。

祝你的项目好运!