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

Protractor browser.getCurrentUrl() is not working on route change

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

测试案例 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() 是一次成功的登录尝试并重定向到另一条路线。

Timed out waiting for Protractor to synchronize with the page after 11 seconds. Please see https://github.com/angular/protractor/blob/master/docs/faq.md. The following tasks were pending

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

尝试过的解决方案

  1. 已将 allScriptsTimeoutgetPageTimeout 添加到量角器配置文件。
  2. 已将 defaultTimeoutInterval 添加到配置文件
  3. 找到以下 SO 问题 , link2 and this github issue,尝试了所有三个并且 none 似乎有效
  4. 当我用谷歌搜索 timeout 错误消息时,我发现了这个 SO 问题 link1,link2,我尝试了所有方法都不起作用

基本上所有的解决方案都说使用waitsleepwaitForAngular。我尝试了所有 thenable 方式,因为所有 returns 都承诺。我发现这个问题是因为使用 browser.getCurrentUrl。让我知道我哪里做错了,想深入了解用量角器进行端到端测试。

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

非常感谢任何帮助。

在理想情况下,您不应该添加任何等待,Protractor 自然应该等待 Angular 准备就绪,并且通常与其同步工作。

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

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

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

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

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