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'], };
3 Réponses :
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')
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.
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>
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.
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.
Essayez de faire
expect (true) .toBe (true)
et dites-moi s'il échoue. Je veux juste éliminer le problème du pilote Web.