我很好奇waitForAngularEnabled()是如何工作的? 虽然看起来并不复杂,但我无法在任何地方获得满意的答案。所以希望有人帮我清理。
我的目标是检查标准并暂停/锁定运行测试,直到符合条件。以下是一些案例。
一个。暂停运行测试并等待页面加载
mysqldump
B中。使用browser.wait(),与A
类似的替代方法mysql
所以问题是:
的
希望通过一些背景原则得到明确的答案。
谢谢!
答案 0 :(得分:20)
<强> 1。调用waitForAngularEnabled(false)后会发生什么? (一旦符合标准或在我的情况下发生超时)
根据经验,我发现这似乎导致Protractor仅仅表现为Webdriver。它并没有等待Angular和#34;安定下来&#34; (没有待处理的HTTP请求或查看更新),这是true
的行为。相反,如果您使用false
设置,则需要使用ExpectedConditions或类似方法来验证前提条件,以便可靠地执行测试步骤,就像使用普通的Webdriver测试一样。
<强> 2。我应该还原waitForAngularEnabled(true)来继续正常测试吗?
是。但是,我发现在Protractor 5.1.1和5.1.2中,无论是否使用控制流,在同一执行过程中在整个测试中散布不同的waitForAngularEnabled
值似乎会产生不可预测的结果;也就是说,启用状态不遵循其他Protractor / Webdriver调用的相同异步语义。到目前为止,我的结论是你不能在同一个执行中可靠地混合waitForAngularEnabled(false)和waitForAngularEnabled(true)。我怀疑这是一个Protractor错误,但我还没有开发出一个简单可靠的测试来证明它支持提交一个Protractor问题。可能存在相关问题here,现已关闭但未完全诊断。
第3。如果我应该这样做,把它放在哪里?
&#34;之前&#34;你需要恢复等待Angular语义的Protractor / Webdriver调用。但是,如上所述,您可以可靠地保证在true
设置的上下文中真正进行此类调用,这一点并不清楚。
如果您必须使用false
和其他true
进行某些测试,则可以在单独的执行中运行它们(单独的进程;不要使用相同的protractor
运行它们或ng e2e
命令)。采取这种方法时我没有遇到任何问题。
答案 1 :(得分:0)
标记的答案很好-我仍然想通过添加有关browser.get的详细信息来回答您的问题:
要覆盖量角器等待Angular调用的默认行为,我们可以使用browser.waitForAngularEnabled(false)禁用Angular等待。在驱动程序会话的其余部分中,量角器将不会同步Angular调用,除非使用以下命令启用了Angular等待:browser.waitForAngularEnabled(true)。
但是我建议直接使用包装的驱动程序,而不要切换waitForAngularEnabled属性,否则可能导致脚本不稳定。我们在并行测试执行上遇到了一个问题(我们绝对不想按顺序运行)-当所有测试同时设置waitForAngularEnabled时,这一点很明显。
量角器使用AngularJS功能(如$ q,$ timeout和$ html)公开的可测试性API来同步AngularJS异步组件创建的页面。
browser.get 当我们在脚本中调用browser.get方法导航到网页时,Protractor使用selenium-webdriver的get方法导航到请求的页面,然后默认情况下尝试使用AngularJS可测试性API同步页面。
量角器的waitForAngular策略认为当前页面具有AngularJS库,并在全局对象window.angular上调用getTestabilityAPI方法。
browser.driver.get 在没有覆盖默认行为的情况下,将Protractor与非Angular应用程序一起使用时,会出现错误–未定义angular,因为默认情况下,Protractor会尝试使用window同步页面。页面上没有可用的angular API。
答案 2 :(得分:0)
作为Will答案的补充,可以在同一测试中多次使用waitForAngularEnabled
,但需要明确添加browser.get
。凭直觉,大多数人认为设置waitForAngularEnabled(true)
等待量角器再次执行Angular任务,但这返回了希望。大多数人使用它的方式是可以在非Angular页面上禁用它,也可以以同步方式在Angular页面上重新启用它。要解决此问题,可以使用以下命令:
// do things on your Angular application
waitForAngularEnabled(false)
// do things on non-angular page
waitForAngularEnabled(true)
browser.get('/home') // this is a page from your Angular application
browser.get
函数将一直阻塞,直到加载“ Angular”页面为止。
答案 3 :(得分:0)
正如 Babyburger 所述,waitForAngualar 需要重新加载页面以同步设置为启用(如果您来自错误状态),但这不是使用 Get 的唯一方法。
想象你正在处理一个带有超链接的页面,如果量角器没有再次请求 API,登陆页面将不会同步,所以只要页面在 browser.waitForAngular(enabled) 之后以任何方式刷新它应该再次同步。调用页面刷新,移动到新页面,使用获取,点击发送并重定向到另一个页面。
现在的区别: 如果您使用 browser.ignoreSyncrhonization,您将禁用所有量角器同步功能。因此,任何诸如使量角器能够使用 react 或任何其他框架进行测试的插件之类的东西也将被禁用
如果您使用 browser.waitForAngularEnabled(false),您只会停止等待来自 Angular API 的 $timeout 和 $http,其他所有同步都将保持并按预期工作。
如果您的测试要求您阅读信息更改、图片移动、动画完成或其他要求您从执行步骤开始处理正在发生的事情的内容,我有 2 个答案:
1.- 不要将其作为 E2E 测试运行,这是一种更易于人类观察、诊断和证据的行为
2.- 获取该步骤的视频记录:如果你真的需要验证它,并且完成状态不足以验证为通过,获取一个带有屏幕截图命令的视频,然后让同一个人负责寻求测试结果以验证该步骤。
对于那里的所有开发人员,有一个名为 $interval 的函数是预期的 Angular 函数,用于等待不会结束、重新启动或具有不是超时预期的有趣功能,也就是说,如果它没有' t 在短时间内发生,发送标志并停止 间隔是等待直到发生,量角器会忽略这一点,以免干扰测试执行。
这里是一位开发者解释这个Interval vs Timeout
请全世界的 QA 团队,不要让懒惰的开发人员给出懒惰的代码作为答案。
我有一个团队不包括间隔,只是使用无限超时,它在我们的自动化执行中造成了很多错误,它还导致由于所有超时运行而在运行脚本的机器中分配了过多的资源同时在同一个窗口。同一个团队现在有一个新任务,但我已经敦促他们不要滥用这两个包装器,编码变得更加顺畅,并且由于为我们使用量角器而不是相反的方式为每个新功能创建测试变得轻而易举.