当我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在很长一段时间内不发布任何内容(在我的情况下是几个月)。
delay
运算符,以便我的端到端测试不会超时?或者我可以做些什么来向量角器发出信号,它不需要等待特定的Observable?
browser.waitForAngularEnabled(false)
这确实会导致Protractor停止等待,但这不是一个好的解决方案,因为这是一个Angular应用程序,它会让一切变得更难。
ngZone.runOutsideAngular(() => {...})
这没有用,因为长时间运行的操作是通过视图绑定({{ title | async }}
)进行的。那不是我可以打电话给ngZone.runOutsideAngular
的地方。
答案 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();