量角器browser.getCurrentUrl()无法处理路由更改

时间:2016-04-15 18:49:41

标签: javascript angularjs protractor angularjs-e2e gulp-protractor

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

Tesr案例1

  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. allScriptsTimeoutgetPageTimeout添加到量角器配置文件中。
  2. defaultTimeoutInterval添加到配置文件
  3. 发现以下 SO 问题link1link2和此github issue,尝试了所有这三个问题,似乎没有任何问题
  4. 当我搜索timeout错误消息时,我发现了这个问题link1link2,我尝试了所有无效的问题
  5. 基本上所有解决方案都说使用waitsleepwaitForAngular。我以thenable的方式尝试了所有,因为所有的回报都是有希望的。我发现此问题是因为使用了browser.getCurrentUrl。让我知道我做错了什么,并想深入了解有关量角器的e2e测试。

    我想了解量角器的基础知识,它如何处理路由更改以及量角器如何处理像$http这样的异步用户操作。我应该明确使用承诺等。

    非常感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

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

在现实世界中,遗憾的是,通常需要添加等待。但是,更喜欢明确等待具有特定条件的硬编码browser.sleep()调用,这通常应该避免。在这种情况下,我们可以添加等待特定网址的等待,请参阅this answer

答案 1 :(得分:1)

这里的问题不是browser.getCurrentUrl(),正如你在正确运行的测试中所提到的那样,这件事运行正常。

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

答案 2 :(得分: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

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