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
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();
Une autre approche consiste à définir browser.ignoreSynchronization = true
avant 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();
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');
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');
ajoutez l'extrait ci-dessous dans votre fichier de spécifications .js
beforeAll(function() {
browser.waitForAngularEnabled(false);
});
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