我刚开始使用量角器进行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。以下任务正在等待
我已经搜索了这个问题并找到了很多解决方案,而且似乎都没有。
尝试解决方案
allScriptsTimeout
,getPageTimeout
添加到量角器配置文件中。defaultTimeoutInterval
添加到配置文件timeout
错误消息时,我发现了这个问题link1,link2,我尝试了所有无效的问题基本上所有解决方案都说使用wait
,sleep
,waitForAngular
。我以thenable
的方式尝试了所有,因为所有的回报都是有希望的。我发现此问题是因为使用了browser.getCurrentUrl
。让我知道我做错了什么,并想深入了解有关量角器的e2e测试。
我想了解量角器的基础知识,它如何处理路由更改以及量角器如何处理像$http
这样的异步用户操作。我应该明确使用承诺等。
非常感谢任何帮助。
答案 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