3

我刚刚开始使用量角器对 Angular 单页应用程序进行 e2e 测试。我已经用登录页面开始了测试。这是我为失败案例编写的测试

案例一

  it('Login with wrong email', function() {
    loginPage.get();
    loginPage.setEmail('xxxxx@xxxx.com');
    loginPage.setPassword('12345678');
    loginPage.submit()

    expect(browser.getCurrentUrl()).toBe(loginPage.appUrl + '/#/login')
  })

上面的代码完美运行。我正在使用 url 测试登录失败,如果 url 没有更改,则将其视为失败。Q1)这是正确的方法吗?我应该检查错误消息吗,我见过这样的例子,所以用 url 测试登录失败。

测试用例 2

这是我收到错误的地方,测试用例检查成功登录。

it('Login with correct email', function() {
  loginPage.get();
  loginPage.setEmail('YYYY@YYYY.YY');
  loginPage.setPassword('12345678');
  loginPage.submit()
  expect(browser.getCurrentUrl()).toBe(loginPage.appUrl + '/#/home')
})

如果我不使用上面的测试用例也可以完美运行browser.getCurrentUrl(),当我使用时出现以下错误getCurrentUrl,这loginPage.submit()是一次成功的登录尝试并重定向到另一条路线。

等待 Protractor 与页面同步 11 秒后超时。请参阅https://github.com/angular/protractor/blob/master/docs/faq.md。以下任务待处理

我用谷歌搜索了这个问题并找到了很多解决方案,但似乎没有一个有效。

试用解决方案

  1. 添加allScriptsTimeout,getPageTimeout到量角器配置文件。
  2. 添加defaultTimeoutInterval到配置文件
  3. 发现以下SO问题link1link2和这个 github问题,尝试了所有三个,但似乎都没有工作
  4. 当我用timeout错误消息搜索时,我发现这个 SO 问题link1link2,我尝试了所有不起作用的

基本上所有的解决方案都说要使用wait, sleep, waitForAngular. 我尝试了所有thenable时尚,因为所有回报都承诺。我发现这个问题是因为使用browser.getCurrentUrl. 让我知道我在哪里做错了,并想深入了解使用量角器进行 e2e 测试。

我想知道量角器的基础知识,它在路由更改上的工作原理以及量角器如何$http处理异步用户操作。我应该明确使用承诺等吗?

任何帮助是极大的赞赏。

4

3 回答 3

4

在理想的世界中,您不应该添加任何等待,并且Protractor应该自然地等待 Angular 准备好并且通常与它同步工作。

不幸的是,在现实世界中,经常需要添加等待。browser.sleep()不过,与通常应避免的硬编码调用相比,更喜欢具有特定条件的显式等待。在这种情况下,我们可以添加一个等待特定 URL 的等待,请参阅此答案

于 2016-04-18T13:18:28.773 回答
1

这里的问题不在于browser.getCurrentUrl(),正如您在正确运行的测试中提到的那样,该部分运行良好。

量角器在告诉您时会给您一个很大的提示Timed out waiting for Protractor to synchronize with the page after 11 seconds,这是说它无法抓住您的角度页面的方式 - 或者您的角度页面从未完成加载以提前执行测试。当您在$timeout页面上使用大量 s 或过多轮询时,就会发生这种情况。要调试此问题,请运行您的测试套件,jasmine-spec-reporter它会报告页面正在等待的功能(阻止同步)

于 2016-04-20T03:48:56.447 回答
0

[我在其他地方看到了与其他问题有关的这一点,我相信 StackOverflow。它不是原创的。] 我一直在做的是:

var EC, elm;//I have these as globals, because the issue arises a lot

EC = protractor.ExpectedConditions;

//after your click

elm = element(by.linkText('Logout'));//on menu at top, helps timing, 
//your next page may vary, but we have Logout only after you log in

browser.wait(EC.presenceOf(elm), 20000);
expect(e2.isPresent()).toBeTruthy();
expect(browser.getCurrentUrl()).toContain("data_entry");//where I say 
//data_entry you would say 
//home

如果您认为有多个期望是不好的形式,我怀疑您可以无害地删除第一个期望。高温高压

于 2016-07-29T21:24:28.203 回答