在测试规范中,我需要单击网页上的按钮,然后等待新页面完全加载。
emailEl.sendKeys('jack');
passwordEl.sendKeys('123pwd');
btnLoginEl.click();
// ...Here need to wait for page complete... How?
ptor.waitForAngular();
expect(ptor.getCurrentUrl()).toEqual(url + 'abc#/efg');
答案 0 :(得分:81)
根据您的要求,您可以尝试:
browser.waitForAngular();
或
btnLoginEl.click().then(function() {
// do some stuff
});
解决诺言。如果你能在beforeEach
中做到这一点会更好。
注意:我注意到expect()在比较之前等待内部的承诺(即getCurrentUrl)。
答案 1 :(得分:26)
我刚看了一下源代码 - Protractor只在少数情况下等待Angular(比如调用element.all
或设置/获取位置时)。
所以Protractor在每次命令之后都不会等待Angular稳定下来。
此外,有时在我的测试中,我在Angular摘要周期和点击事件之间进行了比赛,所以有时我必须这样做:
elm.click();
browser.driver.sleep(1000);
browser.waitForAngular();
使用sleep等待执行以进入AngularJS上下文(由click
事件触发)。
答案 2 :(得分:25)
你不需要等待。量角器自动等待角度准备就绪,然后执行控制流程中的下一步。
答案 3 :(得分:4)
使用Protractor,您可以使用以下方法
var EC = protractor.ExpectedConditions;
// Wait for new page url to contain newPageName
browser.wait(EC.urlContains('newPageName'), 10000);
所以你的代码看起来像是,
emailEl.sendKeys('jack');
passwordEl.sendKeys('123pwd');
btnLoginEl.click();
var EC = protractor.ExpectedConditions;
// Wait for new page url to contain efg
ptor.wait(EC.urlContains('efg'), 10000);
expect(ptor.getCurrentUrl()).toEqual(url + 'abc#/efg');
注意:这可能并不意味着新页面已完成加载且DOM已准备就绪。随后的'expect()'语句将确保Protractor等待DOM可用于测试。
答案 4 :(得分:3)
在这种情况下,您可以使用:
页面对象:
waitForURLContain(urlExpected: string, timeout: number) {
try {
const condition = browser.ExpectedConditions;
browser.wait(condition.urlContains(urlExpected), timeout);
} catch (e) {
console.error('URL not contain text.', e);
};
}
页面测试:
page.waitForURLContain('abc#/efg', 30000);
答案 5 :(得分:2)
我通常只是在控制流程中添加一些东西,即:
it('should navigate to the logfile page when attempting ' +
'to access the user login page, after logging in', function() {
userLoginPage.login(true);
userLoginPage.get();
logfilePage.expectLogfilePage();
});
logfilePage:
function login() {
element(by.buttonText('Login')).click();
// Adding this to the control flow will ensure the resulting page is loaded before moving on
browser.getLocationAbsUrl();
}
答案 6 :(得分:1)
使用此我认为它更好
*isAngularSite(false);*
browser.get(crmUrl);
login.username.sendKeys(username);
login.password.sendKeys(password);
login.submit.click();
*isAngularSite(true);*
要使用isAngularSite的这个设置,请将它放在你的protractor.conf.js中:
global.isAngularSite = function(flag) {
browser.ignoreSynchronization = !flag;
};
答案 7 :(得分:1)
要等到点击本身完成(即解析 Promise),使用 await
关键字
it('test case 1', async () => {
await login.submit.click();
})
这将停止命令队列,直到点击(sendKeys、sleep 或任何其他命令)完成
如果您很幸运,并且您使用的是构建良好且没有待处理的微观和宏观任务的 Angular 页面,那么 Protractor 应自行等待,直到页面准备就绪。但有时您需要自己处理等待,例如通过非 Angular 的页面登录时(阅读 how to find out if page has pending tasks and how to work with non angular pages)
如果您手动处理等待,browser.wait
是最佳选择。只需向它传递一个具有等待条件的函数即可。比如等到页面没有加载动画
let $animation = $$('.loading');
await browser.wait(
async () => (await animation.count()) === 0, // function; if returns true it stops waiting; can wait for anything in the world if you get creative with it
5000, // timeout
`message on timeout`
);
确保使用await
答案 8 :(得分:0)
您可以做这样的事情
emailEl.sendKeys('jack');
passwordEl.sendKeys('123pwd');
btnLoginEl.click().then(function(){
browser.wait(5000);
});
答案 9 :(得分:-2)
browser.waitForAngular();
btnLoginEl.click().then(function() { Do Something });
解决诺言。