2 votes

Comment naviguer d'une page non Angular vers une autre page Angular avec protractor

Que faut-il faire exactement pour rediriger vers une page angulaire ? Voici mon entrée et mon bouton de html (page non angulaire)

<input class="value" type="password" 3dsinput="password" name="password">
<input type="submit" value="Submit" name="submit" alt="Submit" border="0">

situé à todo-spec.js comme ça ;

 element(by.css('.value')).sendKeys('12345');
 element(by.buttonText('Submit')).click();

avec browser.driver.ignoreSynchronization = true; appelé en dernier sur la page angulaire précédente pour désactiver la synchronisation. N'oubliez pas que cette petite page communique avec un service de passerelle de paiement avant de rediriger l'utilisateur vers les pages angulaires suivantes. J'ai essayé de désactiver la synchronisation, mais sans succès.

A noter également : il semble que je reçoive deux erreurs différentes chaque fois que j'exécute la même EXACT script minute après minute. Je pense que ça a quelque chose à voir avec le délai d'attente. Un est ;

Échec : Cannot assign to read only property 'stack' of Erreur en attendant que Protractor se synchronise avec la page : "window.angular est indéfini. Cela peut être dû au fait qu'il s'agit d'une page non angulaire ou que votre test implique une navigation côté client, ce qui peut interférer avec l'amorçage de Protractor. Voir http://git.io/v4gXM pour plus de détails"

et l'autre ;

Échec : erreur javascript : document déchargé pendant l'attente du résultat (Informations sur la session : chrome=51.0.2704.84) (Informations sur le pilote : chromedriver=2.21.371459 (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4),platform=Windows NT 10.0 x86_64) (WARNING : Le serveur n'a pas fourni d'informations sur le suivi de pile) Durée de la commande ou timeout : 1,40 secondes Informations sur la construction : version : '2.52.0', révision : '4c2593c', heure : '2016-02-11 19:06:42'. Informations système : host : 'xxxxxxxx', ip : 'xxxxx', os.name : 'Windows 10', os.arch : 'amd64', os.version : '10.0', java.version : '1.8.0_92'. Informations sur le pilote : org.openqa.selenium.chrome.ChromeDriver Capacités [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, chrome={chromedriverVersion=2.21.371459 (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4), userDataDir=1 C:\Users\Colin\AppData\Local\Temp\scoped_dir6892_17447 }, takesHeapSnapshot=true, databaseEnabled=false, handlesAlerts=true, hasTouchScreen=false, version=51.0.2704. 84, platform=XP, browserConnectionEnabled=false, nativeEvents=true, acceptSslCerts=true, locationContextEnabled=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true}] ID de la session : fde99ca463aacd06f923cae8895b06a5

Votre aide sera très appréciée...

2voto

colin_dev256 Points 377

Résolu. Je suis probablement en train de répéter la même solution (suggérée par d'autres) que j'ai simplement mal comprise avec d'autres problèmes SO similaires.

J'ai dû utiliser browser.driver.sleep(5000) sur une page non angulaire pour s'assurer qu'elle se charge et s'installe correctement et que le rapporteur ne passe pas rapidement dessus.

Pour gérer les timeouts de jasmine (ce qui était un problème occasionnel - me donnant l'impression d'être le mauvais depuis le début), j'ai programmé explicitement la fonction timeout dans le beforeEach en haut de l'écran. Jetez un coup d'œil ;

El beforeEach comme vu aquí (Réglage defaultTimeoutInterval en config.js n'a pas fonctionné pour moi).

  describe('angularjs homepage todo list', function() {

    beforeEach(function (done) {
       jasmine.DEFAULT_TIMEOUT_INTERVAL = 80000;
       setTimeout(function () {
           // console.log('inside timeout');
           done();
       }, 500);
    });

   it ('should be bla bla bla', function(){

Autre section dans le décrire-it fonction ( angulaire >> non-angulaire >> angulaire )

    browser.ignoreSynchronization = true; // Turn sync off before submit (on angular page).
    this_page.clickBtn(); //Redirect to *NON-ANGULAR PAGE*

    //*NON-ANGULAR PAGE* loaded (payment gateway)
    browser.driver.sleep(5000);// to fully load non-angular page 

    element(by.css('.value')).sendKeys('12345');                     
    element(by.buttonText('Submit')).click(); 

Encore une fois, je suis prêt à être corrigé si quelqu'un a un avis différent à ce sujet. Il m'a fallu une semaine de frustration pour comprendre cette partie. - Nouveau 'protractorer' ;)

Aussi BONUS TRÈS IMPORTANT si vous rencontrez un jour angular cases à cocher y boutons radio utiliser explicitement ;

    var elm = element(by.id('drop-off'));
    browser.executeScript("arguments[0].click();", elm.getWebElement());

au lieu de simplement

element(by.id('drop-off')).click(); 

Pour une raison quelconque, materialize, de par sa conception, cache l'élément brut dans la case à cocher/le bouton radio, ce qui fait que vous le regardez de trop près car le protracteur/webdriver ne détectera pas d'erreur. Vous devez donc très conscience de ça pour aider à parler au backend. Un petit mais gros problème que j'ai repéré tardivement. Quand j'ai compris cela, mes tests de rapporteur se sont déroulés comme les fesses d'un bébé ;)

Une autre chose qui m'a beaucoup aidé est faire attention aux erreurs de webdriver (ce que je ne faisais pas auparavant). Elles étaient plus explicites que celles sur les rapporteurs.

0voto

alecxe Points 50783

Après le clic, j'attendrais d'être redirigé vers la page souhaitée (attente d'une partie spécifique de l'URL qui doit être présente dans l'URL actuelle ), remettez la synchro en marche et lancez waitForAngular() :

browser.driver.wait(function() {
  return browser.driver.getCurrentUrl().then(function(url) {
    return /index/.test(url);  // TODO: replace "index" with a relevant part of URL in your case
  });
}).then(function () {
    browser.ignoreSynchronization = true;     
    browser.waitForAngular();
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X