当我ng e2e
我的应用程序时,我收到此错误:
失败:等待异步 Angular 任务在 11 秒后完成超时。
以下是app.component.ts
。请注意它在您订阅 15 秒后如何发布"app"。
我意识到量角器会等到您的 Angular 应用程序中没有挂起的异步任务。请继续阅读。
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
之后所做的唯一更改(。
这当然是一个愚蠢的例子。我现实生活中的代码做了一些有用的事情。我需要能够拥有长时间(就我而言是几个月(不发布任何内容的可观察量。
有没有办法在我的应用程序中使用 rxjs 的delay
运算符,这样我的端到端测试就不会超时?
或者我可以做些什么来向量角器发出信号,表明它不需要等待特定的可观察量程?
我尝试过的事情:
browser.waitForAngularEnabled(false)
这确实会导致量角器停止等待,但不是一个好的解决方案,因为这是一个 Angular 应用程序,它使一切变得更加困难。
ngZone.runOutsideAngular(() => {...})
这无济于事,因为长时间运行的操作是通过视图绑定({{ title | async }}
(发生的。那不是我可以打电话给ngZone.runOutsideAngular
的地方。
量角器尝试与Angular同步,例如从$http
调用中认为AUT足够稳定以进行测试。
您可以在测试开始时(在confg.js
文件或describe
块中使用browser.ignoreSynchronisation = true
来阻止量角器执行此操作。
这已经很晚了,但也许其他人遇到了同样的问题,我目前使用 rxjs 6 和 angular 8。
对我来说,从延迟切换到计时器会有所帮助,例如:
of(true).pipe(delay(1000));
遇到量角器超时,但如果我将其更改为
of(true).pipe(switchMap(() => timer(1000))
它正在工作,不知道为什么,但我不必告诉量角器他不应该等待 Angular,因为他应该这样做,因为我运行多个 HTTP 请求。如果我们不关心正确传递的值,它的作用几乎相同。
browser.waitForAngularEnabled(false)
那么就不需要了。好吧,这更像是一项工作,我宁愿使用延迟,但不要为这种行为重写所有 e2e 测试。
我在使用rxjs计时器时遇到了类似的问题,我的量角器测试一直抛出"脚本超时错误:脚本超时"异常。对我有用的解决方案是我在带有计时器的页面上使用了本机硒网络驱动程序 API。例如:
而不是:
await element(by.id('question-12' )).click();
我使用了硒网络驱动程序:
import {By} from "selenium-webdriver";
//...
await browser.driver.findElement(By.id('question-12' )).click();