我正在使用角度2项目上的量角器进行端到端测试,我需要测试登录操作。这里的问题是,当单击登录按钮时,expect语句仍然会将登录页面的URL作为主页。如果我等待,那么测试成功。我在文档中的某处读过量角器等待进程自动完成,所以,
wait()
方法的情况下正确执行操作?fakeAsync
,async
或至少whenStable
相似
测试这是我的测试用例
it("User successfully login",()=>{
browser.get(browser.baseUrl + '/account/login').then(() => {
return expect(browser.getCurrentUrl()).toBe(browser.baseUrl + "/account/login")
}).then(()=>{
element(by.tagName('input[type=text]')).sendKeys('username');
element(by.tagName('input[type=password]')).sendKeys('password');
element(by.css('button[type=submit]')).click().then(()=>{
return expect(browser.getCurrentUrl()).toBe(browser.baseUrl + "/home");
});
});
});
注意:
browser.wait()
方法的说明。 我有点解决了这个问题。我不知道它是否适用于其他场景或者它是否是正确的方法。我添加了
browser.wait(EC.urlContains(browser.baseUrl + "/account/login"), 10000);
browser.waitForAngularEnabled(false);
browser.wait(EC.urlContains(browser.baseUrl + "/home");
在click()事件之后,它现在似乎有效。
答案 0 :(得分:3)
导致错误的原因是:
click()
返回一个承诺,量角器等待解析。当登录请求被发送到服务器而不是加载主页时,可能会解决这个问题。因此,下一步的执行在页面加载之前开始。
为什么不wait()
:
我不确定,在什么基础上你得到了不使用browser.wait()
的指示。很可能你不应该使用browser.sleep()
(因为该命令总是过时的),但如果你不想使用browser.wait()
,你的开发人员可能不会离开最初打开的Angular页面。
fakeAsync
,whenStable
等等:
量角器默认情况下whenStable
使用browser.waitForAngular()
,只有在你没有关闭browser.waitForAngularEnabled(false)
之后才会调用它{...}你只需要切换关闭非角度页面或如果您的开发人员使用即持久的Macrotasks,这将导致超时。
此外,由于Selenium Control Flow可能会在2018年11月(read about here)被弃用,因此async/await
可用。
Read this important guide here以及一些further infos from protractor about it here
现在就是你的情况:
在您的情况下,您不需要使用then()
,因为您不需要立即解决承诺。 expect()
会自动解决您的承诺,因此不需要then()
。
事实上,Protractor逐行执行所有命令,好像它们都包含在then()
中一样,因此它会自动保持执行同步(只要你不使用{{1启动异步任务)在代码中。
所以这里是我对你的代码的建议:
then()
如果您现在获得超时,那么这是一个单独的调试问题。 检查this Protractor site for infos about timeouts并检查this SO-Answer here以了解如何调试超时。