1
votes

Erreur de temporisation lors de l'utilisation de browser.getCurrentUrl () après des modifications d'URL

J'écris un test de rapporteur pour la connexion à une application AngularJS et je souhaite vérifier que la connexion est réussie et que l'URL change après la connexion. J'ai essayé d'utiliser la condition attendue avec urlContains () et j'ai également essayé avec browser.getCurrentUrl (). ToContain () mais j'obtiens une erreur dans les deux.

it('should login successfully', function () {
  browser.get("https://example.com/");
  loginobj.username.sendKeys(logindata.email);
  loginobj.password.sendKeys(logindata.password);
  loginobj.loginbtn.click().then(function(){
  browser.getCurrentUrl().then(url => expect(url).toContain('/dashboard'));
  //var EC = protractor.ExpectedConditions;
  //browser.wait(EC.urlContains('/dashboard'), 5000);  
})

La condition attendue passe le test lorsque l'url est correct. Mais lorsque l'URL est différente, une erreur de délai d'expiration est générée "Échec: attente expirée après 5013 ms". expect (browser.getCurrentUrl ()). toContain ('/ dashboard') échoue toujours avec l'erreur ci-dessous

Stack:
    ScriptTimeoutError: script timeout: result was not received in 11 seconds
      (Session info: chrome=75.0.3770.142)
    Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:25:53'
    System info: os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.14.3', java.version: '12.0.1'
    Driver info: driver.version: unknown
        at Object.checkLegacyResponse (/Users/.nvm/versions/node/v8.9.4/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/error.js:546:15)
        at parseHttpResponse (/Users/.nvm/versions/node/v8.9.4/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/http.js:509:13)
        at doSend.then.response (/Users/.nvm/versions/node/v8.9.4/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/http.js:441:30)
        at <anonymous>
        at process._tickCallback (internal/process/next_tick.js:188:7)
    From: Task: Protractor.waitForAngular()
        at thenableWebDriverProxy.schedule (/Users/.nvm/versions/node/v8.9.4/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver.js:807:17)
        at ProtractorBrowser.executeAsyncScript_ (/Users/.nvm/versions/node/v8.9.4/lib/node_modules/protractor/built/browser.js:425:28)
        at angularAppRoot.then (/Users/.nvm/versions/node/v8.9.4/lib/node_modules/protractor/built/browser.js:456:33)
        at ManagedPromise.invokeCallback_ (/Users/.nvm/versions/node/v8.9.4/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:1376:14)
        at TaskQueue.execute_ (/Users/.nvm/versions/node/v8.9.4/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:3084:14)
        at TaskQueue.executeNext_ (/Users/.nvm/versions/node/v8.9.4/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:3067:27)
        at asyncRun (/Users/.nvm/versions/node/v8.9.4/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:2927:27)
        at /Users/.nvm/versions/node/v8.9.4/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:668:7
        at <anonymous>
        at process._tickCallback (internal/process/next_tick.js:188:7)
    From: Task: Run it("should login successfully") in control flow
        at UserContext.<anonymous> (/Users/.nvm/versions/node/v8.9.4/lib/node_modules/protractor/node_modules/jasminewd2/index.js:94:19)
    From asynchronous test: 
    Error
        at Object.<anonymous> (/Users/ProtractorTest/Tests/login.spec.js:17:3)
        at Module._compile (module.js:643:30)
        at Object.Module._extensions..js (module.js:654:10)
        at Module.load (module.js:556:32)
        at tryModuleLoad (module.js:499:12)
        at Function.Module._load (module.js:491:3)
        at Module.require (module.js:587:17)
        at require (internal/module.js:11:18)
        at /Users/.nvm/versions/node/v8.9.4/lib/node_modules/protractor/node_modules/jasmine/lib/jasmine.js:93:5

Voici mon code

exports.config = {

    seleniumAddress : 'http://localhost:4444/wd/hub', 
    specs: ['login.spec.js'],

    };


1 commentaires

Essayez de faire expect (true) .toBe (true) et dites-moi s'il échoue. Je veux juste éliminer le problème du pilote Web.


3 Réponses :


1
votes

J'ai quelque chose de similaire

await browser.getCurrentUrl().then(url => expect(url).toContain('/dashboard'));

Essayez-le peut-être que cela vous aidera, juste sans attendre car je vois que vous n'utilisez pas les fonctions asynchrones

ou comme ça

const currentUrl = await browser.getCurrentUrl().then(url => url);
expect(currentUrl).toContain('/dashboard')


5 commentaires

J'ai mis à jour le test comme ci-dessous. Mais j'obtiens l'erreur "Identifiant inattendu" it ('devrait se connecter avec succès', async () => {browser.get ("https://pdtest.gan-compliance.com/"); loginobj.username. sendKeys (logindata.email); loginobj.password.sendKeys (logindata.password); loginobj.loginbtn.click (). then (() => {const currentUrl = wait browser.getCurrentUrl (). then (url => url) ; wait expect (currentUrl) .toContain ('/ dashboard')});


Faites-le sans attendre pendant que vous mélangez 2 approches en une, essayez également quelque chose comme ceci browser.getCurrentUrl (). Then (url => expect (url) .toContain ('/ dashboard')); si vous utilisez la fonction async, vous devez utiliser à chaque étape de loginobj wait


J'ai essayé sans attendre et j'ai également essayé d'utiliser aync et attendre. J'obtiens l'erreur «Échec: délai d'expiration du script: le résultat n'a pas été reçu dans les 11 secondes et donne les informations de construction, les informations système et les informations sur le pilote: driver.version: inconnu. dans les deux cas


@jane Pouvez-vous fournir plus d'informations à partir de stacktrace sur l'erreur, ainsi que sur l'application que vous testez. Est-ce angulaire / autre fw, aussi votre conf rapporteur serait bien à voir. Veuillez modifier le message principal pour cela. Au début, je pensais que c'était peut-être un défaut de synchronisation du rapporteur, mais cela semble différent.


Mise à jour du message. J'apprécie vraiment votre aide.



1
votes

Dans le délai d'expiration du script par défaut du rapporteur, est de 11 secondes, Dans l'extrait de code ci-dessus, l'instruction

exports.config = {
allScriptsTimeout: 30000,
seleniumAddress : 'http://localhost:4444/wd/hub', 
specs: ['login.spec.js'],

prend plus de 11 secondes pour résoudre la promesse.

Solution : dans le fichier de configuration Protractor, ajoutez les instructions ci-dessous allScriptsTimeout: timeout_in_millis . par exemple pour 30 secondes d'expiration

allScriptsTimeout: 30000

Fichier de configuration modifié:

browser.getCurrentUrl().then(url => expect(url).toContain('/dashboard'));

}; p>


4 commentaires

J'ai ajouté allScriptsTimeout: 30000, dans le fichier de configuration, mais j'obtiens toujours l'erreur de temporisation. La connexion ne prend pas longtemps. Il semble qu'il n'obtienne pas l'URL pour une raison quelconque. J'obtiens l'erreur 'Échec: délai d'expiration du script: le résultat n'a pas été reçu dans les 30 secondes'


Essayez-vous d'automatiser un site Web non angulaire à l'aide d'un rapporteur?


c'est un site Web angulaire.


Reportez-vous au lien ci-dessous pour tous les types de délais d'attente dans le rapporteur. Lien: protractortest.org/#/timeouts . Cela peut être utile.



1
votes

Par défaut, le rapporteur gère toutes les asynchrones pour vous. En regardant votre code, vous vous fiez au comportement par défaut du rapporteur, c'est-à-dire que vous ne définissez pas SELENIUM_PROMISE_MANAGER sur false .

Dans ce cas, pourquoi voulez-vous faire quelque chose à l'intérieur de click (). then () ? Cela peut être aussi simple et clair que

loginobj.loginbtn.click (); expect (browser.getCurrentUrl ()). toContain ('/ dashboard');

Une théorie avec votre code: une fois que vous avez quelque chose à l'intérieur de cliquez (). puis () , il n'est plus à sa place dans la file d'attente de promesses que le rapporteur gère pour vous. À moins que cela ne soit absolument nécessaire, par exemple obtenir de la valeur à partir d'un élément pour une utilisation ultérieure dans la spécification, je suggérerais de ne pas se mêler autant que possible de la gestion asynchrone du rapporteur.

J'espère que cela vous aidera.


0 commentaires