테스트 사양에서 웹 페이지의 버튼을 클릭하고 새 페이지가 완전히로드 될 때까지 기다려야합니다.
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');
답변
수행하려는 작업에 따라 다음을 시도 할 수 있습니다.
browser.waitForAngular();
또는
btnLoginEl.click().then(function() {
// do some stuff
});
약속을 해결합니다. 에서 할 수 있다면 더 좋을 것 beforeEach
입니다.
NB : 나는 expect ()이 내부의 promise (즉, getCurrentUrl)가 비교하기 전에 해결되기를 기다린다는 것을 알았습니다.
답변
방금 소스를 살펴 봤습니다. Protractor는 몇 가지 경우에만 Angular를 기다리고 있습니다 (예 : 언제 element.all
호출되거나 위치 설정 / 가져 오기).
따라서 각도기는 모든 명령 후에 Angular가 안정화되기를 기다리지 않습니다.
또한 때때로 내 테스트에서 Angular 다이제스트주기와 클릭 이벤트 사이에 경쟁이있는 것처럼 보이므로 때때로 수행해야합니다.
elm.click();
browser.driver.sleep(1000);
browser.waitForAngular();
실행이 AngularJS 컨텍스트 ( click
이벤트 에 의해 트리거 됨 ) 로 들어갈 때까지 대기하기 위해 절전을 사용 합니다.
답변
기다릴 필요가 없습니다. 각도기는 자동으로 각도가 준비 될 때까지 기다린 다음 제어 흐름의 다음 단계를 실행합니다.
답변
각도기를 사용하면 다음 접근 방식을 사용할 수 있습니다.
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();
});
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();
}
답변
이것을 사용하면 더 좋다고 생각합니다
*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;
};