Je suis nouveau dans l'écriture de cas de tests en utilisant un rapporteur pour une application non angulaire. J'ai écrit un exemple de scénario de test. Le navigateur se ferme automatiquement après l'exécution du scénario de test. Comment puis-je empêcher cela? Voici mon code
var submitBtnElm = $('input[data-behavior=saveContribution]');
it('Should Search', function() {
browser.driver.get('http://localhost/enrollments/osda1.html');
browser.driver.findElement(by.id('contributePercentValue')).sendKeys(50);
submitBtnElm.click().then(function() {
});
});
Ajoutez browser.pause()
à la fin de votre fonction it. Dans la fonction elle-même.
Ajoutez une fonction de rappel dans le bloc It
et la fenêtre du navigateur ne se fermera pas tant que vous ne l’appelez pas.
var submitBtnElm = $('input[data-behavior=saveContribution]');
it('Should Search', function(callback) {
browser.driver.get('http://localhost/enrollments/osda1.html');
browser.driver.findElement(by.id('contributePercentValue')).sendKeys(50);
submitBtnElm.click().then(function() {
// Have all the logic you need
// Then invoke callback
callback();
});
});
Je vous suggère d'utiliser browser.driver.sleep(500);
avant votre opération de clic.
Regarde ça.
browser.driver.sleep(500);
element(by.css('your button')).click();
browser.driver.sleep(500);
J'étais également aux prises avec un problème similaire dans lequel j'avais un flux de cas de test dans lequel nous étions en interaction avec plusieurs applications et avec Protractor, le navigateur se fermait après l'exécution d'un fichier conf.js. Maintenant, quand j’ai regardé dans la réponse précédente, c’était comme ajouter un délai qui dépend de la rapidité avec laquelle votre prochaine action a été effectuée ou de l’absence ou non du cas. Même si nous pensons que, du point de vue du débogage, la plupart des utilisateurs effectuent des analyses nocturnes et souhaitent que le navigateur soit actif pendant quelques heures avant d'analyser le problème. J'ai donc commencé à examiner le code de base du rapporteur et suis tombé sur une solution générique qui peut contourner ce problème, indépendamment de tout navigateur. Actuellement, la solution spécifie que le navigateur ne doit pas se fermer après l’exécution d’un fichier conf.js, mais pourrait être amélioré si un utilisateur pouvait ajouter un paramètre de configuration demandant à l’utilisateur s’il souhaitait fermer le navigateur après son exécution.
Le navigateur pourrait être réutilisé pour une utilisation ultérieure du fichier conf.js en utilisant la balise --seleniumSessionId en ligne de commande.
Solution:
En ce qui concerne mon utilisation actuelle, il semble n'y avoir aucun effet secondaire du changement de code, sera mis à jour si je rencontre un autre problème en raison de ce changement. Instantané de l'extrait de code ci-dessous.
Merci Gleeson
Instantané de l'extrait de code:
La meilleure façon de faire browser NE PAS fermer pendant un certain temps, utilisez browser.wait () . Dans la logique de la fonction d'attente, écrivez une logique pour vérifier soit la visibilitéOf (), soit l'invisibilitéOf () d'un élément, ce qui n'est pas visible ou cela prendra du temps pour devenir invisible sur l'interface utilisateur. Dans ce cas, wait () continue de vérifier la logique jusqu'à ce que la condition soit remplie ou que le délai d'attente soit atteint. Vous pouvez augmenter le délai si vous souhaitez que le navigateur soit visible plus longtemps.
var EC=protractor.ExpectedConditions;
var submitBtnElm = $('input[data-behavior=saveContribution]');
it('Should Search', function() {
browser.driver.get('http://localhost/enrollments/osda1.html');
browser.driver.findElement(by.id('contributePercentValue')).sendKeys(50);
submitBtnElm.click().then(function() {
browser.wait(function(){
EC.invisibilityOf(submitBtnElm).call().then(function(isPresent){
if(isPresent){
return true;
}
});
},20000,'error message');
});
});
Je suis sûr qu'un changement a été déclenché sur votre page par un clic de bouton. Cela peut être aussi subtil qu'un changement de classe sur un élément ou aussi évident qu'un élément <p></p>
avec le texte "Sauvé" affiché. Ce que je ferais, c’est, après le test, d’attendre explicitement ce changement.
[...]
return protractor.browser.wait(function() {
return element(by.cssContainingText('p', 'Saved')).isPresent();
}, 10000);
Vous pouvez ajouter un tel mécanisme d'attente à la méthode afterEach()
de votre fichier de spécification, de sorte que vos tests soient séparés même sans l'attente implicite de Protractor Angular.
var submitBtnElm = $('input[data-behavior=saveContribution]');
it('Should Search', function() {
browser.driver.get('http://localhost/enrollments/osda1.html');
browser.driver.findElement(by.id('contributePercentValue')).sendKeys(50);
submitBtnElm.click().then(function() {
});
browser.pause(); // it should leave browser alive after test
});
browser.pause () devrait laisser le navigateur actif jusqu'à ce que vous le laissiez aller.
Une autre approche consiste à définir browser.ignoreSynchronization = true
avant browser.get (...). Le rapporteur n'attendrait pas que Angular soit chargé et que vous puissiez utiliser la syntaxe habituelle element (...).
J'ai trouvé que la solution de Gleeson fonctionnait et cela m'a vraiment aidé. La solution était ...
Redémarrez vos tests après cela.
J'utilise Noeud v8.12.0 Npm v6.4.1 Rapporteur v5.4.1
Cette solution ne fonctionnera que si vous avez installé npm ou un rapporteur globalement. si vous avez installé votre npm ou votre rapporteur localement (dans votre dossier), vous devez accéder à votre dossier de rapporteur local et faire de même.