From ae178e5192be18418e2ae31b403027b131866818 Mon Sep 17 00:00:00 2001 From: Juan Ferrer Toribio Date: Mon, 28 Oct 2019 19:52:54 +0100 Subject: [PATCH] Nigthmare error logging improved --- e2e/helpers/extensions.js | 87 ++++++++++++++++------------- e2e/paths/01-login/01_login.spec.js | 1 - 2 files changed, 47 insertions(+), 41 deletions(-) diff --git a/e2e/helpers/extensions.js b/e2e/helpers/extensions.js index 11fb86416..af501f6bc 100644 --- a/e2e/helpers/extensions.js +++ b/e2e/helpers/extensions.js @@ -7,6 +7,12 @@ import config from './config.js'; let currentUser; let actions = { + test: function() { + return this.evaluate(() => { + document.perico(); + }); + }, + // Generic extensions clickIfExists: async function(selector) { @@ -53,7 +59,7 @@ let actions = { if (logoutClicked) { let buttonSelector = '.vn-dialog.shown button[response=ACCEPT]'; - this.wait(buttonSelector => { + await this.wait(buttonSelector => { return document.querySelector(buttonSelector) != null || location.hash == '#!/login'; }, buttonSelector); @@ -63,7 +69,7 @@ let actions = { try { await this.waitForURL('#!/login'); } catch (e) { - this.goto(`${config.url}/#!/login`); + await this.goto(`${config.url}/#!/login`); } await this.doLogin(userName, null) @@ -133,10 +139,10 @@ let actions = { }, selector); }, - getProperty: function(selector, property, done) { - this.evaluate_now((selector, property) => { + getProperty: function(selector, property) { + return this.evaluate((selector, property) => { return document.querySelector(selector)[property].replace(/\s+/g, ' ').trim(); - }, done, selector, property); + }, selector, property); }, waitPropertyLength: function(selector, property, minLength) { @@ -174,17 +180,17 @@ let actions = { .click(selector); }, - focusElement: function(selector, done) { - this.wait(selector) - .evaluate_now(selector => { + focusElement: function(selector) { + return this.wait(selector) + .evaluate(selector => { let element = document.querySelector(selector); element.focus(); - }, done, selector); + }, selector); }, - isVisible: function(selector, done) { - this.wait(selector) - .evaluate_now(elementSelector => { + isVisible: function(selector) { + return this.wait(selector) + .evaluate(elementSelector => { const selectorMatches = document.querySelectorAll(elementSelector); const element = selectorMatches[0]; @@ -222,7 +228,7 @@ let actions = { element.removeEventListener('mouseover', eventHandler); } return isVisible; - }, done, selector); + }, selector); }, waitImgLoad: function(selector) { @@ -244,10 +250,10 @@ let actions = { }); }, - countElement: function(selector, done) { - this.evaluate_now(selector => { + countElement: function(selector) { + return this.evaluate(selector => { return document.querySelectorAll(selector).length; - }, done, selector); + }, selector); }, waitForNumberOfElements: function(selector, count) { @@ -286,15 +292,15 @@ let actions = { }, selector, text); }, - waitForInnerText: function(selector, done) { - this.wait(selector) + waitForInnerText: function(selector) { + return this.wait(selector) .wait(selector => { const innerText = document.querySelector(selector).innerText; return innerText != null && innerText != ''; }, selector) - .evaluate_now(selector => { + .evaluate(selector => { return document.querySelector(selector).innerText; - }, done, selector); + }, selector); }, waitForEmptyInnerText: function(selector) { @@ -309,9 +315,9 @@ let actions = { }, hashURL); }, - waitForShapes: function(selector, done) { - this.wait(selector) - .evaluate_now(selector => { + waitForShapes: function(selector) { + return this.wait(selector) + .evaluate(selector => { const shapes = document.querySelectorAll(selector); const shapesList = []; @@ -320,20 +326,20 @@ let actions = { return shapesList; - }, done, selector); + }, selector); }, waitForSnackbar: function() { return this.wait(500) .waitForShapes('vn-snackbar .shape .text'); }, - waitForLastShape: function(selector, done) { - this.wait(selector) - .evaluate_now(selector => { + waitForLastShape: function(selector) { + return this.wait(selector) + .evaluate(selector => { const shape = document.querySelector(selector); return shape.innerText; - }, done, selector); + }, selector); }, waitForLastSnackbar: function() { @@ -427,20 +433,21 @@ let actions = { for (let name in actions) { Nightmare.action(name, function(...args) { + let fnArgs = args.slice(0, args.length - 1); let done = args[args.length - 1]; - let promise = actions[name].apply(this, args); - if (promise) { - promise - .then(res => done(null, res)) - .catch(err => { - let errArgs = args.slice(0, args.length - 1); - errArgs = errArgs - .map(i => JSON.stringify(i)) - .join(', '); + actions[name].apply(this, fnArgs) + .then(res => done(null, res)) + .catch(err => { + let stringArgs = fnArgs + .map(i => typeof i == 'function' ? 'Function' : i) + .join(', '); - done(new Error(`.${name}(${errArgs}) failed: ${err.message}`)); - }); - } + let orgMessage = err.message.startsWith('.wait()') + ? '.wait() timed out' + : err.message; + + done(new Error(`.${name}(${stringArgs}) failed: ${orgMessage}`)); + }); }); } diff --git a/e2e/paths/01-login/01_login.spec.js b/e2e/paths/01-login/01_login.spec.js index e9e64c311..03acc98a8 100644 --- a/e2e/paths/01-login/01_login.spec.js +++ b/e2e/paths/01-login/01_login.spec.js @@ -6,7 +6,6 @@ describe('Login path', () => { it('should receive an error when the username is incorrect', async() => { const result = await nightmare .doLogin('badUser', null) - .waitUntilNotPresent('body', 'jose') .waitForLastSnackbar(); expect(result.length).toBeGreaterThan(0);