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


78

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

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');

2
기다리고있는 페이지에 대해 더 구체적으로 설명해 주시겠습니까? 페이지 변경이나 비동기 로딩을 기다리고 있습니까?
Furzel 2014

답변:


92

수행하려는 작업에 따라 다음을 시도 할 수 있습니다.

browser.waitForAngular();

또는

btnLoginEl.click().then(function() {
  // do some stuff 
}); 

약속을 해결합니다. 에서 할 수 있다면 더 좋을 것 beforeEach입니다.

NB : 나는 expect ()이 내부의 promise (즉, getCurrentUrl)가 비교하기 전에 해결되기를 기다린다는 것을 알았습니다.


공유해 주셔서 감사합니다. 일부 이상한 간헐적 문제를 식별하는 데 도움이되었습니다.
Hakan Serce

1
여전히 문제가 있습니다. 비동기 스크립트 결과를 기다리는 시간이 초과되었습니다
Emna Ayadi

3
이것은 버튼 클릭 후 자바 스크립트가 페이지 수정을 마칠 때까지 기다리는 문제를 해결하지 못했습니다. 아래browser.driver.sleep(1000) 제안 된 대로 추가 하면 트릭이 수행되었습니다.
CGFoX

3
waitForAngular() 사용해서는 안됩니다 . [정보] click().then()나를 위해 작동하지 않았다. 나는 browser.wait(//use of protractor.ExpectedConditions).
Coli

30

방금 소스를 살펴 봤습니다. Protractor는 몇 가지 경우에만 Angular를 기다리고 있습니다 (예 : 언제 element.all호출되거나 위치 설정 / 가져 오기).

따라서 각도기는 모든 명령 후에 Angular가 안정화되기를 기다리지 않습니다.

또한 때때로 내 테스트에서 Angular 다이제스트주기와 클릭 이벤트 사이에 경쟁이있는 것처럼 보이므로 때때로 수행해야합니다.

elm.click();
browser.driver.sleep(1000);
browser.waitForAngular();

실행이 AngularJS 컨텍스트 ( click이벤트 에 의해 트리거 됨 ) 로 들어갈 때까지 대기하기 위해 절전을 사용 합니다.


1
각도기는 .click ()을 동기화하지 않고 ElementFinder / ElementArrayFinder와 관련된 다음 작업을 동기화했습니다.
Max

나는 경험을 통해 각도기가를 사용하여 기대치를 평가할 때 각도를 기다릴 것이라는 것을 알고 있습니다 expect. 다른 경우에는 명시 적으로 waitForAngular.
jrharshath

1
귀하의 게시물은 거의 2 년이 지났지 만 여전히 귀하의 말이 맞습니다. 현재 Protractor 뒤에 '.sleep (1000)'을 추가해야합니다 element(by.css('my-css')).click(). 약속이 반환되었지만 .click이 기다리고 있지 않은 것 같습니다.
bob.mazzo

나는 항상 약속을 사용합니다. 예 :return elm.click().then(function () { return nextAction(); }
Ed Greaves 2016

3
애플리케이션이 구성된 절전 모드보다 빠르게로드되는 경우에도 절전 모드를 사용하기 때문에 명시 적 절전 모드를 사용하지 않는 것이 좋습니다.
timbru31

25

기다릴 필요가 없습니다. 각도기는 자동으로 각도가 준비 될 때까지 기다린 다음 제어 흐름의 다음 단계를 실행합니다.


5
이론적으로는 그렇습니다. 왜냐하면 waitForAngular()내부적으로 호출 되었기 때문 입니다.하지만 일부 사양에 대해서도 호출해야했습니다.
glepretre

8
자동으로 대기합니까? 와 같은 browser.get것을 보면 랩핑하는 것을 덮어 쓰는 것이 존재한다고 명시 적으로 말합니다. 어떤이없는 경우 click에 대한 방법 ElementFinder, 그것은 그것 같이 단지 대표 보인다 webDriver.WebElement. angular.github.io/protractor/#/api?view=ElementFinder
Snekse

5
@Snekse Protractor는 ElementFinder 및 ElementArrayFinder를 통해 모든 작업을 동기화했습니다. 따라서 테스트가 요소를 조회하려고 할 때마다 조회 자체는 angular가 소화주기를 완료 할 때까지 기다린 다음 호출을 webdriver에 위임합니다. expect () 호출에서도 마찬가지입니다.
Max

8
기다릴 필요가 없다면이 스레드는 100,000 번 조회되지 않았을 것입니다.
Justin

7

각도기를 사용하면 다음 접근 방식을 사용할 수 있습니다.

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을 테스트에 사용할 수있을 때까지 기다립니다.

참조 : 각도기 예상 조건


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

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

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

-1

당신은 이렇게 할 수 있습니다

emailEl.sendKeys('jack');
passwordEl.sendKeys('123pwd');

btnLoginEl.click().then(function(){
browser.wait(5000);
});


browser.wait (5000)은 "함수 유형에 할당 할 수 없음"을 반환합니다. browser.wait는 1 개 이상의 인수를 취하므로 첫 번째는 조건이고 두 번째는 시간입니다 ...
IWI

-2
browser.waitForAngular();

btnLoginEl.click().then(function() { Do Something });

약속을 해결합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.