【发布时间】:2018-05-04 09:27:06
【问题描述】:
我有一个搜索字段,当用户点击输入时,它有一个带有一堆复选框的表格。我需要等待结果加载,然后单击表格第一行的复选框。
这分为 2 个测试用例,第一个执行搜索,第二个单击结果第一行中的复选框以执行其他操作。
// Test #2
it('should perform the Search', () => {
po.searchAutocomplete.sendKeys('\n');
});
// Test #3
it('3 : should Activate and Inactivate a Program', () => {
const r = browser.driver.findElements(by.tagName('p-checkbox'));
browser.driver.wait(EC.presenceOf(r[0]));
r[0].click();
browser.sleep(2000).then(() => {
});
r[0].click();
});
// Test #4
it('4 : should navigate to Create New', () => {
po.createNewButton.click();
});
因此,这里存在同步问题 - 我的测试 #2 成功运行,但测试 #3 立即开始在此处运行。如果搜索结果太慢,那么我会收到复选框不存在的错误,如果它及时返回就可以了。此外,有时第二次 click() 会导致对象未附加到当前页面,因为测试 #4 中的“新建”导航到另一个页面。
看起来 r[0].clicks 的承诺在页面导航到另一个视图后返回 po.createNewButton.click() 导致对象未附加到当前页面错误。
我需要所有这些操作同步进行。我放了一个 browser.wait 但这不起作用,它只是被忽略了。
我该如何解决这个问题?
编辑 - 感谢以下建议。这是我所做的更改并使其正常工作:)
在我的应用程序中,我的标头中有一个使用 Observable.interval 的时钟计时器,此外,我还有一个计时器,它正在 ping 服务器以以固定的时间间隔获取一些数据。由于这些始终在运行并且永远不会完成,因此使用 element.all 语法在 Protractor 中导致各种超时,这就是我切换到 browser.driver.findElement 语法的原因,但由于它的异步性质(如海报所示)下面 - 谢谢!)使编码变得困难。
我将计时器包装在以下代码中:
this.ngZone.runOutsideAngular(() => { // Required to prevent interference with Protractor
this.updateTimer = Observable.interval(UPDATE_INTERVAL).publish();
this.updateTimer.subscribe(v => {
this.doSomething();
});
});
现在,我可以使用 element.all 而不会超时!
【问题讨论】:
-
不错!我希望我能不止一次地对此表示赞同。您需要在区域外运行计时器。感谢您更新您的问题!
-
@SBKDeveloper:在角度区域外运行计时器非常棒!
标签: angular protractor