【发布时间】:2016-10-11 18:58:30
【问题描述】:
我有一个手动引导的 Angular 应用程序,其中包含大量 Protractor 测试。 2016 年 6 月左右,测试成功了,但不再有效。从那时起,发生了以下变化:
- Angular 2 已发布
- 应用程序的登录部分已被重写。最初,登录页面根本没有使用 Angular。现在它使用 Angular 2。应用程序的其余部分仍然是 Angular 1。
如果我在登录后不与应用交互,并运行单个测试(例如“expect(true).toBe(true)”),那么一切都会运行完成,不会生成错误消息。
如果我的测试自动化确实与应用交互,则会发生以下情况:
- 如果我的 conf.js 文件包含“useAllAngular2AppRoots: true”,我会收到错误消息:“等待 Protractor 与页面同步 11 秒后超时。请参阅 https://github.com/angular/protractor/blob/master/docs/faq.md”
- 如果我的 conf.js 文件不包含“useAllAngular2AppRoots: true”,我会收到错误消息:“等待量角器与页面同步时出错:“找不到元素的可测试性。”
在任何一种情况下,自动化都会通过登录进入应用程序的 Angular1 部分。
我的问题是:
- 这种应用程序(Angular2 登录页面,其他所有 Angular1)是否可以使用 Protractor 进行测试?
- 应该使用“useAllAngular2AppRoots: true”吗?
- 我收到的错误消息似乎并没有指向我的测试代码中要修复的特定区域。我该如何确定问题所在?
2016 年 10 月 27 日编辑 在收到这个问题的第一个答案后,我试图确定到底是什么失败了,在哪里失败。
我发现:
- 在我的 conf.js 文件中设置 rootElement 无效。无论我完全忽略它,特别将其设置为“body”,还是将其设置为随机的无意义字符串,我都会得到相同的行为。
- 按照给定的建议,我仍然收到一条错误消息“AfterAll Failed: Error while waiting for Protractor to sync with the page:”Could not find testability for element.””请注意,我并没有尝试进行任何测试在我的 AfterAll 函数中,只需单击注销按钮
- 如果我在测试的 beforeAll 函数中设置“browser.ignoreSynchronization=true”,我可以进行与应用程序交互的调用,例如单击屏幕元素。没有这条线,这样的调用就没有任何效果。但是,我确信这不是我应该做的,或者我不应该做的。
- 即使使用“browser.ignoreSynchronization=true”,当我尝试进行特定于 Angular1 的调用(例如尝试将元素与 by.repeater() 匹配)时,我仍然会收到错误消息。这将发生在应用程序的一部分,它仍然是用 Angular 1 编写的,因此使用的是 ng-repeat 而不是 ngFor。
这些附加信息是否可以进一步了解可能发生的情况以及我还可以尝试什么?
【问题讨论】:
-
如果 Urish 的解决方案对您有用,请将其标记为答案。
标签: angularjs protractor