Skip to content

Commit

Permalink
fix: some assertion methods (#4144)
Browse files Browse the repository at this point in the history
  • Loading branch information
kobenguyent committed Jan 23, 2024
1 parent ad1bb15 commit 162b01b
Show file tree
Hide file tree
Showing 4 changed files with 107 additions and 14 deletions.
27 changes: 23 additions & 4 deletions lib/helper/Playwright.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ const {
setRestartStrategy, restartsSession, restartsContext, restartsBrowser,
} = require('./extras/PlaywrightRestartOpts');
const { createValueEngine, createDisabledEngine } = require('./extras/PlaywrightPropEngine');
const {
seeElementError, dontSeeElementError, dontSeeElementInDOMError, seeElementInDOMError,
} = require('./errors/ElementAssertion');

const pathSeparator = path.sep;

Expand Down Expand Up @@ -1451,7 +1454,11 @@ class Playwright extends Helper {
async seeElement(locator) {
let els = await this._locate(locator);
els = await Promise.all(els.map(el => el.isVisible()));
return empty('visible elements').negate(els.filter(v => v).fill('ELEMENT'));
try {
return empty('visible elements').negate(els.filter(v => v).fill('ELEMENT'));
} catch (e) {
dontSeeElementError(locator);
}
}

/**
Expand All @@ -1461,23 +1468,35 @@ class Playwright extends Helper {
async dontSeeElement(locator) {
let els = await this._locate(locator);
els = await Promise.all(els.map(el => el.isVisible()));
return empty('visible elements').assert(els.filter(v => v).fill('ELEMENT'));
try {
return empty('visible elements').assert(els.filter(v => v).fill('ELEMENT'));
} catch (e) {
seeElementError(locator);
}
}

/**
* {{> seeElementInDOM }}
*/
async seeElementInDOM(locator) {
const els = await this._locate(locator);
return empty('elements on page').negate(els.filter(v => v).fill('ELEMENT'));
try {
return empty('elements on page').negate(els.filter(v => v).fill('ELEMENT'));
} catch (e) {
dontSeeElementInDOMError(locator);
}
}

/**
* {{> dontSeeElementInDOM }}
*/
async dontSeeElementInDOM(locator) {
const els = await this._locate(locator);
return empty('elements on a page').assert(els.filter(v => v).fill('ELEMENT'));
try {
return empty('elements on a page').assert(els.filter(v => v).fill('ELEMENT'));
} catch (e) {
seeElementInDOMError(locator);
}
}

/**
Expand Down
29 changes: 23 additions & 6 deletions lib/helper/Puppeteer.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ const findReact = require('./extras/React');
const { highlightElement } = require('./scripts/highlightElement');
const { blurElement } = require('./scripts/blurElement');
const { focusElement } = require('./scripts/focusElement');
const {
dontSeeElementError, seeElementError, dontSeeElementInDOMError, seeElementInDOMError,
} = require('./errors/ElementAssertion');

let puppeteer;
let perfTiming;
Expand Down Expand Up @@ -1038,8 +1041,11 @@ class Puppeteer extends Helper {
els = (await Promise.all(els.map(el => el.boundingBox() && el))).filter(v => v);
// Puppeteer visibility was ignored? | Remove when Puppeteer is fixed
els = await Promise.all(els.map(async el => (await el.evaluate(node => window.getComputedStyle(node).visibility !== 'hidden' && window.getComputedStyle(node).display !== 'none')) && el));

return empty('visible elements').negate(els.filter(v => v).fill('ELEMENT'));
try {
return empty('visible elements').negate(els.filter(v => v).fill('ELEMENT'));
} catch (e) {
dontSeeElementError(locator);
}
}

/**
Expand All @@ -1051,24 +1057,35 @@ class Puppeteer extends Helper {
els = (await Promise.all(els.map(el => el.boundingBox() && el))).filter(v => v);
// Puppeteer visibility was ignored? | Remove when Puppeteer is fixed
els = await Promise.all(els.map(async el => (await el.evaluate(node => window.getComputedStyle(node).visibility !== 'hidden' && window.getComputedStyle(node).display !== 'none')) && el));

return empty('visible elements').assert(els.filter(v => v).fill('ELEMENT'));
try {
return empty('visible elements').assert(els.filter(v => v).fill('ELEMENT'));
} catch (e) {
seeElementError(locator);
}
}

/**
* {{> seeElementInDOM }}
*/
async seeElementInDOM(locator) {
const els = await this._locate(locator);
return empty('elements on page').negate(els.filter(v => v).fill('ELEMENT'));
try {
return empty('elements on page').negate(els.filter(v => v).fill('ELEMENT'));
} catch (e) {
dontSeeElementInDOMError(locator);
}
}

/**
* {{> dontSeeElementInDOM }}
*/
async dontSeeElementInDOM(locator) {
const els = await this._locate(locator);
return empty('elements on a page').assert(els.filter(v => v).fill('ELEMENT'));
try {
return empty('elements on a page').assert(els.filter(v => v).fill('ELEMENT'));
} catch (e) {
seeElementInDOMError(locator);
}
}

/**
Expand Down
27 changes: 23 additions & 4 deletions lib/helper/WebDriver.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ const { highlightElement } = require('./scripts/highlightElement');
const store = require('../store');
const { focusElement } = require('./scripts/focusElement');
const { blurElement } = require('./scripts/blurElement');
const {
dontSeeElementError, seeElementError, seeElementInDOMError, dontSeeElementInDOMError,
} = require('./errors/ElementAssertion');

const SHADOW = 'shadow';
const webRoot = 'body';
Expand Down Expand Up @@ -1461,7 +1464,11 @@ class WebDriver extends Helper {
const res = await this._locate(locator, true);
assertElementExists(res, locator);
const selected = await forEachAsync(res, async el => el.isDisplayed());
return truth(`elements of ${(new Locator(locator))}`, 'to be seen').assert(selected);
try {
return truth(`elements of ${(new Locator(locator))}`, 'to be seen').assert(selected);
} catch (e) {
dontSeeElementError(locator);
}
}

/**
Expand All @@ -1474,7 +1481,11 @@ class WebDriver extends Helper {
return truth(`elements of ${(new Locator(locator))}`, 'to be seen').negate(false);
}
const selected = await forEachAsync(res, async el => el.isDisplayed());
return truth(`elements of ${(new Locator(locator))}`, 'to be seen').negate(selected);
try {
return truth(`elements of ${(new Locator(locator))}`, 'to be seen').negate(selected);
} catch (e) {
seeElementError(locator);
}
}

/**
Expand All @@ -1483,7 +1494,11 @@ class WebDriver extends Helper {
*/
async seeElementInDOM(locator) {
const res = await this._res(locator);
return empty('elements').negate(res);
try {
return empty('elements').negate(res);
} catch (e) {
dontSeeElementInDOMError(locator);
}
}

/**
Expand All @@ -1492,7 +1507,11 @@ class WebDriver extends Helper {
*/
async dontSeeElementInDOM(locator) {
const res = await this._res(locator);
return empty('elements').assert(res);
try {
return empty('elements').assert(res);
} catch (e) {
seeElementInDOMError(locator);
}
}

/**
Expand Down
38 changes: 38 additions & 0 deletions lib/helper/errors/ElementAssertion.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
const Locator = require('../../locator');

const prefixMessage = 'Element';

function seeElementError(locator) {
if (typeof locator === 'object') {
locator = JSON.stringify(locator);
}
throw new Error(`${prefixMessage} "${(new Locator(locator))}" is still visible on page.`);
}

function seeElementInDOMError(locator) {
if (typeof locator === 'object') {
locator = JSON.stringify(locator);
}
throw new Error(`${prefixMessage} "${(new Locator(locator))}" is still seen in DOM.`);
}

function dontSeeElementError(locator) {
if (typeof locator === 'object') {
locator = JSON.stringify(locator);
}
throw new Error(`${prefixMessage} "${(new Locator(locator))}" is not visible on page.`);
}

function dontSeeElementInDOMError(locator) {
if (typeof locator === 'object') {
locator = JSON.stringify(locator);
}
throw new Error(`${prefixMessage} "${(new Locator(locator))}" is not seen in DOM.`);
}

module.exports = {
seeElementError,
dontSeeElementError,
seeElementInDOMError,
dontSeeElementInDOMError,
};

0 comments on commit 162b01b

Please sign in to comment.