web-dev-qa-db-fra.com

comment utiliser Protractor sur le site non angularjs?

J'ai trouvé le framework Protractor conçu pour les applications Web AngularJS.

Comment utiliser Protractor sur un site Web qui n'utilise pas AngularJS?

J'ai écrit mon premier test et Protractor a déclenché le message suivant:

Error: Angular could not be found on the page https://www.stratexapp.com/ : retries looking for angular exceeded
75
Abdelkrim

Si votre test doit interagir avec une page non angulaire, accédez à l'instance webdriver directement avec browser.driver.

Exemple de documentation de rapporteur

browser.driver.get('http://localhost:8000/login.html');

browser.driver.findElement(by.id('username')).sendKeys('Jane');
browser.driver.findElement(by.id('password')).sendKeys('1234');
browser.driver.findElement(by.id('clickme')).click();
72
Eitan Peer

Une autre approche consiste à définir browser.ignoreSynchronization = trueavant browser.get (...). Le rapporteur n'attendrait pas Angular chargé et vous pouvez utiliser la syntaxe élémentaire (...) habituelle.

browser.ignoreSynchronization = true;
browser.get('http://localhost:8000/login.html');

element(by.id('username')).sendKeys('Jane');
element(by.id('password')).sendKeys('1234');
element(by.id('clickme')).click();
122

waitForAngular doit maintenant être utilisé à la place de la propriété ignoreSynchronization, devenue obsolète.

Le guide waitForAngular suivant est extrait de la documentation de Protractor pour les délais d'expiration:

Comment désactiver l'attente pour Angular

Si vous devez naviguer vers une page qui n'utilise pas Angular, vous pouvez désactiver l'attente de Angular en définissant `browser.waitForAngularEnabled (false). Par exemple:

browser.waitForAngularEnabled(false);
browser.get('/non-angular-login-page.html');

element(by.id('username')).sendKeys('Jane');
element(by.id('password')).sendKeys('1234');
element(by.id('clickme')).click();

browser.waitForAngularEnabled(true);
browser.get('/page-containing-angular.html');
10
MatthewThomasGB

Pour tester sur un site non angular, vous devez supprimer la synchronisation. Pour cela, utilisez les éléments suivants:

browser.ignoreSynchronisation = true;
browser.get('url');
2
randomguy

ajoutez l'extrait ci-dessous dans votre fichier de spécifications .js

beforeAll(function() {
    browser.waitForAngularEnabled(false);
});
1
Anil Kumar

Personnellement, les solutions proposées n'ont pas donné de succès, car les éléments DOM n'étaient pas chargés correctement à temps.

J'ai essayé de nombreuses manières de gérer ce comportement asynchrone, y compris browser.wait avec browser.isElementPresent, mais aucune d'entre elles n'était satisfaisante.

Qu'est-ce que le truc, c'est que l'utilisation de Protractor a renvoyé Promises de ses méthodes dans onPrepare:

onPrepare: () => {

    browser.manage().window().maximize();

    browser.waitForAngularEnabled(true).then(function () {
        return browser.driver.get(baseUrl + '/auth/');
    }).then(function () {
        return browser.driver.findElement(by.name('login')).sendKeys('login');
    }).then(function () {
        return browser.driver.findElement(by.name('password')).sendKeys('password');
    }).then(function () {
        return browser.driver.findElement(by.name('submit')).click();
    }).then(function () {
        return true;
    });

    return browser.driver.wait(function () {
        return browser.driver.getCurrentUrl().then(function (url) {
            return /application/.test(url);
        });
    }, 10000);
},

J'ai été inspiré par https://github.com/angular/protractor/blob/master/spec/withLoginConf.js

0
Matthieu Dsprz