[jasmine] 각도기 : 버튼 클릭 후 페이지 완료를 기다리는 방법은 무엇입니까?

테스트 사양에서 웹 페이지의 버튼을 클릭하고 새 페이지가 완전히로드 될 때까지 기다려야합니다.

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;
        };