在测试规范中,我需要单击网页上的按钮,然后等待新页面完全加载。
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');
在测试规范中,我需要单击网页上的按钮,然后等待新页面完全加载。
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');
Answers:
根据您要执行的操作,可以尝试:
browser.waitForAngular();
要么
btnLoginEl.click().then(function() {
// do some stuff
});
兑现诺言 如果您可以在Windows中这样做,那会更好beforeEach
。
注意:我注意到Expect()在比较之前会等待内部的Promise(即getCurrentUrl)得到解决。
我只是看了一下源代码-量角器仅在少数情况下等待Angular(例如何时element.all
调用,或设置/获取位置)。
因此,量角器无需等待每条命令后Angular的稳定。
另外,有时在我的测试中,我似乎在Angular摘要循环和click事件之间进行了竞争,因此有时我必须这样做:
elm.click();
browser.driver.sleep(1000);
browser.waitForAngular();
使用sleep等待执行进入AngularJS上下文(由click
事件触发)。
expect
。在其他情况下,我明确使用waitForAngular
。
element(by.css('my-css')).click()
。似乎.click没有等待,尽管返回了承诺。
return elm.click().then(function () { return nextAction(); }
您无需等待。量角器自动等待角度准备就绪,然后执行控制流程中的下一步。
waitForAngular()
在内部被调用,但是我也不得不为某些规格调用它。
browser.get
,它明确表示存在它要覆盖它包装的东西。如果没有click
方法ElementFinder
,则似乎只是将其委托给webDriver.WebElement
。 angular.github.io/protractor/#/api?view=ElementFinder
通过量角器,可以使用以下方法
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可用于测试。
参考:量角器的预期条件
在这种情况下,您可以使用:
页面对象:
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);
我通常只在控制流中添加一些内容,即:
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();
});
日志文件页面:
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();
}
用这个我觉得比较好
*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;
};
browser.waitForAngular();
btnLoginEl.click().then(function() { Do Something });
兑现诺言