我正在做一个端到端测试,在一个角2项目中使用量角器,我需要测试一个登录操作。这里的问题是,当单击“登录”按钮时,expect语句仍然会获得登录页的URL,这应该是主页的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()
方法的说明。基于Ernst的解决方案
我解决了这个问题。我不知道它是否适用于其他场景,或者它是否是正确的方法。我加了
browser.wait(EC.urlContains(browser.baseUrl + "/account/login"), 10000);
browser.waitForAngularEnabled(false);
browser.wait(EC.urlContains(browser.baseUrl + "/home");
就在click()事件之后,它现在似乎还能工作。
发布于 2017-11-09 07:51:38
导致错误的原因:
click()
返回一个承诺,而量角器则等待解决。当登录请求被发送到服务器时,而不是在加载主页的时候,这个问题可能已经解决了。因此,下一步的执行将在加载页面之前开始。
为什么不wait()
**:** ?
我不知道,你是从什么基础上得到不使用browser.wait()
的指令的。很可能您不应该使用browser.sleep()
(因为这个命令总是过时的),但是如果您不想使用browser.wait()
,您的开发人员可能一次也不会离开最初打开的角页。
fakeAsync
**,** whenStable
等:
量角器默认在whenStable
中使用browser.waitForAngular()
,它总是在承诺之后调用,只要您不关闭browser.waitForAngularEnabled(false)
.如果您只需要关闭非角度页面,或者如果开发人员使用持久的宏任务,则会导致超时。
此外,由于Selenium流可能会在2018年11月(在这里读到)被废弃,所以有可用的async/await
。在这里阅读这个重要的指南。和一些从量角器得到的更多关于它的信息
现在在你的例子中:
在您的情况下,您不需要使用then()
,因为您不需要立即解决承诺。expect()
会自动解决您的承诺,因此不需要在那里使用then()
。
实际上,Protractor逐行执行所有命令,就好像它们都包装在then()
中一样,因此它会自动保持执行同步(只要您不通过在代码中使用then()
启动异步任务。
因此,这里我对您的代码的建议:
it("User successfully login",()=>{
var EC = protractor.ExpectedConditions; //or within onPrepare() of conf.js put global.EC = protractor.ExpectedConditions ... to make it everywhere available.
browser.get(browser.baseUrl + '/account/login');
//next line lets protractor wait max 5 seconds for your url to become, what you want.
browser.wait(EC.urlContains(browser.baseUrl + "/account/login"), 5000);
//additionally after the URL appeared, use this command to wait until the page is fully loaded.
browser.waitForAngular();
expect(browser.getCurrentUrl()).toBe(browser.baseUrl + "/account/login");
element(by.tagName('input[type=text]')).sendKeys('username');
element(by.tagName('input[type=password]')).sendKeys('password');
element(by.css('button[type=submit]')).click();
//next line lets protractor wait max 5 seconds for your url to become, what you want.
//as here a new page is loaded and the click()-promise is resolved before, use this:
browser.wait(EC.urlContains(browser.baseUrl + "/account/login"), 5000);
//additionally after the URL appeared, use this command to wait until the page is fully loaded.
browser.waitForAngular();
expect(browser.getCurrentUrl()).toBe(browser.baseUrl + "/home");
});
如果您现在有超时,那么这是另一个需要调试的问题。检查这个量角器站点提供关于超时的信息。和请回答这个问题以了解如何调试超时。
https://stackoverflow.com/questions/47195796
复制相似问题