我们有一个网站是由Angular 100%构建的,我被要求使用Protractor编写端到端测试。现在遇到一个问题,如果我不使用waitForAngular(false)
和browser.sleep(3000)
,那么即使使用ExpectedCondition
,我的测试也会失败。
这是我的场景:
在登录页面中,我可以找到所有元素,将键发送到输入框并登录。但是登录后失败。它找不到任何元素,请完全单击任何元素。
我的代码如下。
describe("/profile", () => {
let page: Profile;
beforeAll(async () => {
page = await login(Profile, user, login);
await browser.wait(ExpectedConditions.presenceOf(page.element));
await navigate(path.profile)
})
afterAll(async () => {
logout();
})
it("should have navigate to the page", async () => {
expect(await browser.getCurrentUrl()).toContain("/profile");
});
it("should have correct page markup", async () => {
// this test fails without waitForAngular(false)
// or browser.sleep(3000) in the navigation or OnPrepare in the config
expect(await page.headerTitle.isDisplayed()).toBe(true);
expect(await page.headerTitle.getText()).toContain("Profile")
})
})
我在做什么错了?
答案 0 :(得分:0)
据我从评论中还可以理解,在您的应用程序(应使用量角器进行测试)上,您有setInterval
,setTimeout
或长时间运行且反复执行的异步操作。
在量角器执行任何测试规范之前,它将尝试等待Angular 2应用程序“同步”,即完成所有出色的操作。默认情况下,量角器将超时设置为11秒。
由于您执行一些“无限”操作-同步失败,并且量角器因超时错误而停止执行。
您可以使用Zone.js来避免这种情况:
ngZone.runOutsideAngular(() => {
setInterval(() => {
ngZone.run(() => {
// async operation
});
}, 2500);
与您的开发人员一起调查这个问题。
来源:https://christianliebel.com/2016/11/angular-2-protractor-timeout-heres-fix/
答案 1 :(得分:0)
首先,browser.wait()
具有三个参数-函数条件,超时,失败消息。仅最后一个是可选的。您忘记指定超时时间(以毫秒为单位),可能会导致问题
第二,waitForAngular
将可选字符串作为描述。知道为什么您将false
传递给它
P.S。 我认为您误解了有关如何处理量角器中等待的主要概念
browser.sleep(ms)
-是显式等待,在指定为参数的毫秒数内停止执行
browser.wait()
-等待,直到传递给它的函数返回true,或等待作为参数传递的毫秒数。这不是明确的等待。另外,它不会无限期地等待。您将超时时间作为参数传递,或者从protractor.conf.js中花费jasmineNodeOpts.defaultTimeoutInterval
或默认30秒
您的browser.sleep(ms)
导致测试性能出现问题。在测试中避免使用
browser.waitForAngular()
-非常有用,它会等到您的角度应用程序完成所有幕后任务,但默认情况下它包含在每个动作中。因此,如果您使用2、3或4次,通常不会有任何影响。重要提示,某些应用程序的构建不正确,并且总是在后台加载某些内容,因此您的测试要么很慢,要么根本没有响应。这就是为什么我总是使用browser.waitForAngularEnabled(false)
运行测试的原因,但是等待非常困难。作为一项优势,您可以获得快速,可靠的测试。而且不要将false
传递给waitForAngular
,它没有任何作用。
话虽如此,忘了browser.sleep()
,而是学习如何使用browser.wait
如果您使用的是browser.sleep(3000)
,则会使测试停止3秒钟,但是如果下一个元素准备在500毫秒内与之交互,该怎么办?所以只要说等到元素存在(可见(难处理(或您想要的任何))),但不超过3秒,您就可以进行更快的测试
希望能回答您的问题