rxjs`delay`使Protractor E2E超时

时间:2018-05-16 12:36:21

标签: angular typescript protractor rxjs

当我ng e2e我的应用时,我收到此错误:

  

失败:超时等待异步Angular任务在11秒后完成。

以下是app.component.ts。请注意它如何发布' app'订阅后15秒。

我意识到Protractor waits until there are no pending asynchronous tasks in your Angular application。请继续阅读。

import { Component } from '@angular/core';
import * as Rxjs from 'rxjs';
import * as Operators from 'rxjs/operators';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title: Rxjs.Observable<string>;

  constructor() {
    this.title = Rxjs.of('app').pipe(
      Operators.delay(15000)
    );
  }
}

这里是app.component.html的相应变化:

Welcome to {{ title | async }}!

其他一切都是骨头(这是我在ng new之后所做的唯一更改。)

这当然是一个愚蠢的例子。我的现实代码做了一些有用的事情。 我需要能够使Observables在很长一段时间内不发布任何内容(在我的情况下是几个月)。

有没有办法在我的应用程序中使用rxjs的delay运算符,以便我的端到端测试不会超时?

或者我可以做些什么来向量角器发出信号,它不需要等待特定的Observable?

我尝试过的事情:

browser.waitForAngularEnabled(false)

这确实会导致Protractor停止等待,但这不是一个好的解决方案,因为这是一个Angular应用程序,它会让一切变得更难。

ngZone.runOutsideAngular(() => {...})

这没有用,因为长时间运行的操作是通过视图绑定({{ title | async }})进行的。那不是我可以打电话给ngZone.runOutsideAngular的地方。

3 个答案:

答案 0 :(得分:2)

量角器尝试与Angular同步,例如从$http调用,以考虑AUT足够稳定以进行测试。

您可以在测试开始时(browser.ignoreSynchronisation = true文件或confg.js块中)使用describe来阻止Protractor这样做。

答案 1 :(得分:0)

为此,要晚得多了,但也许其他人遇到了同样的问题,我目前使用的是角度8的rxjs 6。

对我来说,将延迟从计时器切换为计时器有帮助,例如:

of(true).pipe(delay(1000)); 

遇到量角器超时,但是如果我将其更改为

of(true).pipe(switchMap(() => timer(1000))

它正在工作,不知道为什么,但是我不必告诉量角器由于我运行多个http请求,他不应该因为他应该做的简单原因而等待角度。如果我们不在乎传递正确的值,它的作用几乎相同。

browser.waitForAngularEnabled(false)
这样就不需要

了。好吧,这是更多的工作,我更愿意使用延迟,而不是针对此类行为重写所有e2e测试。

答案 2 :(得分:0)

我在rxjs计时器上遇到了类似的问题,我的量角器测试始终会抛出“ ScriptTimeoutError:脚本超时”异常。对我有用的解决方案是,我在带有计时器的页面上使用了原生的硒webdriver API。例如:

代替:

await element(by.id('question-12' )).click();

我使用了硒Web驱动程序:

import {By} from "selenium-webdriver";
//...
await browser.driver.findElement(By.id('question-12' )).click();