web-dev-qa-db-fra.com

Rapporteur: Comment attendre que la page soit complète après avoir cliqué sur un bouton?

Dans une spécification de test, je dois cliquer sur un bouton d'une page Web et attendre que la nouvelle page soit complètement chargée.

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

Selon ce que vous voulez faire, vous pouvez essayer:

browser.waitForAngular();

ou

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

pour résoudre la promesse. Ce serait mieux si vous pouviez le faire dans la beforeEach.

NB: j'ai remarqué que expect () attend que la promesse à l'intérieur (c'est-à-dire getCurrentUrl) soit résolue avant de comparer.

82
glepretre

Je viens de jeter un coup d'œil à la source - Protractor n'attend que Angular que dans quelques cas (comme lorsque element.all est appelé ou définit/récupère un emplacement).

Donc, Protractor n'attendra pas que Angular se stabilise après chaque commande.

De plus, il semble que parfois, dans mes tests, j'ai eu une course entre Angular cycle de digestion et événement de clic, donc parfois je dois faire:

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

utiliser sleep pour attendre que l'exécution entre dans le contexte AngularJS (déclenché par l'événement click.).

28
Filip Sobczak

Tu n'as pas besoin d'attendre. Le rapporteur attend automatiquement que angular soit prêt, puis exécute la prochaine étape du flux de contrôle.

25
Andres D

Avec Protractor, vous pouvez utiliser l'approche suivante

var EC = protractor.ExpectedConditions;
// Wait for new page url to contain newPageName
browser.wait(EC.urlContains('newPageName'), 10000);

Donc, votre code va ressembler à quelque chose,

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

Remarque: cela ne signifie peut-être pas que le chargement de la nouvelle page est terminé et que DOM est prêt. L'instruction 'expect ()' suivante garantira que Protractor attend que DOM soit disponible pour le test.

Référence: Protractor ExpectedConditions

6
milan pandya

Dans ce cas, vous pouvez utiliser:

Objet de page:

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

Test de page:

page.waitForURLContain('abc#/efg', 30000);
3
Dao Minh Dam

J'ajoute généralement quelque chose au flux de contrôle, à savoir:

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

Utilisez ceci je pense que c'est mieux

   *isAngularSite(false);*
    browser.get(crmUrl);


    login.username.sendKeys(username);
    login.password.sendKeys(password);
    login.submit.click();

    *isAngularSite(true);*

Pour que vous puissiez utiliser ce paramètre d'isAngularSite, mettez ceci dans votre protractor.conf.js ici:

        global.isAngularSite = function(flag) {
        browser.ignoreSynchronization = !flag;
        };
1
Dantinho

tu peux faire quelque chose comme ça

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

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