Skip to content

Commit 162b01b

Browse files
authored
fix: some assertion methods (#4144)
1 parent ad1bb15 commit 162b01b

File tree

4 files changed

+107
-14
lines changed

4 files changed

+107
-14
lines changed

Diff for: lib/helper/Playwright.js

+23-4
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ const {
4747
setRestartStrategy, restartsSession, restartsContext, restartsBrowser,
4848
} = require('./extras/PlaywrightRestartOpts');
4949
const { createValueEngine, createDisabledEngine } = require('./extras/PlaywrightPropEngine');
50+
const {
51+
seeElementError, dontSeeElementError, dontSeeElementInDOMError, seeElementInDOMError,
52+
} = require('./errors/ElementAssertion');
5053

5154
const pathSeparator = path.sep;
5255

@@ -1451,7 +1454,11 @@ class Playwright extends Helper {
14511454
async seeElement(locator) {
14521455
let els = await this._locate(locator);
14531456
els = await Promise.all(els.map(el => el.isVisible()));
1454-
return empty('visible elements').negate(els.filter(v => v).fill('ELEMENT'));
1457+
try {
1458+
return empty('visible elements').negate(els.filter(v => v).fill('ELEMENT'));
1459+
} catch (e) {
1460+
dontSeeElementError(locator);
1461+
}
14551462
}
14561463

14571464
/**
@@ -1461,23 +1468,35 @@ class Playwright extends Helper {
14611468
async dontSeeElement(locator) {
14621469
let els = await this._locate(locator);
14631470
els = await Promise.all(els.map(el => el.isVisible()));
1464-
return empty('visible elements').assert(els.filter(v => v).fill('ELEMENT'));
1471+
try {
1472+
return empty('visible elements').assert(els.filter(v => v).fill('ELEMENT'));
1473+
} catch (e) {
1474+
seeElementError(locator);
1475+
}
14651476
}
14661477

14671478
/**
14681479
* {{> seeElementInDOM }}
14691480
*/
14701481
async seeElementInDOM(locator) {
14711482
const els = await this._locate(locator);
1472-
return empty('elements on page').negate(els.filter(v => v).fill('ELEMENT'));
1483+
try {
1484+
return empty('elements on page').negate(els.filter(v => v).fill('ELEMENT'));
1485+
} catch (e) {
1486+
dontSeeElementInDOMError(locator);
1487+
}
14731488
}
14741489

14751490
/**
14761491
* {{> dontSeeElementInDOM }}
14771492
*/
14781493
async dontSeeElementInDOM(locator) {
14791494
const els = await this._locate(locator);
1480-
return empty('elements on a page').assert(els.filter(v => v).fill('ELEMENT'));
1495+
try {
1496+
return empty('elements on a page').assert(els.filter(v => v).fill('ELEMENT'));
1497+
} catch (e) {
1498+
seeElementInDOMError(locator);
1499+
}
14811500
}
14821501

14831502
/**

Diff for: lib/helper/Puppeteer.js

+23-6
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ const findReact = require('./extras/React');
3939
const { highlightElement } = require('./scripts/highlightElement');
4040
const { blurElement } = require('./scripts/blurElement');
4141
const { focusElement } = require('./scripts/focusElement');
42+
const {
43+
dontSeeElementError, seeElementError, dontSeeElementInDOMError, seeElementInDOMError,
44+
} = require('./errors/ElementAssertion');
4245

4346
let puppeteer;
4447
let perfTiming;
@@ -1038,8 +1041,11 @@ class Puppeteer extends Helper {
10381041
els = (await Promise.all(els.map(el => el.boundingBox() && el))).filter(v => v);
10391042
// Puppeteer visibility was ignored? | Remove when Puppeteer is fixed
10401043
els = await Promise.all(els.map(async el => (await el.evaluate(node => window.getComputedStyle(node).visibility !== 'hidden' && window.getComputedStyle(node).display !== 'none')) && el));
1041-
1042-
return empty('visible elements').negate(els.filter(v => v).fill('ELEMENT'));
1044+
try {
1045+
return empty('visible elements').negate(els.filter(v => v).fill('ELEMENT'));
1046+
} catch (e) {
1047+
dontSeeElementError(locator);
1048+
}
10431049
}
10441050

10451051
/**
@@ -1051,24 +1057,35 @@ class Puppeteer extends Helper {
10511057
els = (await Promise.all(els.map(el => el.boundingBox() && el))).filter(v => v);
10521058
// Puppeteer visibility was ignored? | Remove when Puppeteer is fixed
10531059
els = await Promise.all(els.map(async el => (await el.evaluate(node => window.getComputedStyle(node).visibility !== 'hidden' && window.getComputedStyle(node).display !== 'none')) && el));
1054-
1055-
return empty('visible elements').assert(els.filter(v => v).fill('ELEMENT'));
1060+
try {
1061+
return empty('visible elements').assert(els.filter(v => v).fill('ELEMENT'));
1062+
} catch (e) {
1063+
seeElementError(locator);
1064+
}
10561065
}
10571066

10581067
/**
10591068
* {{> seeElementInDOM }}
10601069
*/
10611070
async seeElementInDOM(locator) {
10621071
const els = await this._locate(locator);
1063-
return empty('elements on page').negate(els.filter(v => v).fill('ELEMENT'));
1072+
try {
1073+
return empty('elements on page').negate(els.filter(v => v).fill('ELEMENT'));
1074+
} catch (e) {
1075+
dontSeeElementInDOMError(locator);
1076+
}
10641077
}
10651078

10661079
/**
10671080
* {{> dontSeeElementInDOM }}
10681081
*/
10691082
async dontSeeElementInDOM(locator) {
10701083
const els = await this._locate(locator);
1071-
return empty('elements on a page').assert(els.filter(v => v).fill('ELEMENT'));
1084+
try {
1085+
return empty('elements on a page').assert(els.filter(v => v).fill('ELEMENT'));
1086+
} catch (e) {
1087+
seeElementInDOMError(locator);
1088+
}
10721089
}
10731090

10741091
/**

Diff for: lib/helper/WebDriver.js

+23-4
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ const { highlightElement } = require('./scripts/highlightElement');
3232
const store = require('../store');
3333
const { focusElement } = require('./scripts/focusElement');
3434
const { blurElement } = require('./scripts/blurElement');
35+
const {
36+
dontSeeElementError, seeElementError, seeElementInDOMError, dontSeeElementInDOMError,
37+
} = require('./errors/ElementAssertion');
3538

3639
const SHADOW = 'shadow';
3740
const webRoot = 'body';
@@ -1461,7 +1464,11 @@ class WebDriver extends Helper {
14611464
const res = await this._locate(locator, true);
14621465
assertElementExists(res, locator);
14631466
const selected = await forEachAsync(res, async el => el.isDisplayed());
1464-
return truth(`elements of ${(new Locator(locator))}`, 'to be seen').assert(selected);
1467+
try {
1468+
return truth(`elements of ${(new Locator(locator))}`, 'to be seen').assert(selected);
1469+
} catch (e) {
1470+
dontSeeElementError(locator);
1471+
}
14651472
}
14661473

14671474
/**
@@ -1474,7 +1481,11 @@ class WebDriver extends Helper {
14741481
return truth(`elements of ${(new Locator(locator))}`, 'to be seen').negate(false);
14751482
}
14761483
const selected = await forEachAsync(res, async el => el.isDisplayed());
1477-
return truth(`elements of ${(new Locator(locator))}`, 'to be seen').negate(selected);
1484+
try {
1485+
return truth(`elements of ${(new Locator(locator))}`, 'to be seen').negate(selected);
1486+
} catch (e) {
1487+
seeElementError(locator);
1488+
}
14781489
}
14791490

14801491
/**
@@ -1483,7 +1494,11 @@ class WebDriver extends Helper {
14831494
*/
14841495
async seeElementInDOM(locator) {
14851496
const res = await this._res(locator);
1486-
return empty('elements').negate(res);
1497+
try {
1498+
return empty('elements').negate(res);
1499+
} catch (e) {
1500+
dontSeeElementInDOMError(locator);
1501+
}
14871502
}
14881503

14891504
/**
@@ -1492,7 +1507,11 @@ class WebDriver extends Helper {
14921507
*/
14931508
async dontSeeElementInDOM(locator) {
14941509
const res = await this._res(locator);
1495-
return empty('elements').assert(res);
1510+
try {
1511+
return empty('elements').assert(res);
1512+
} catch (e) {
1513+
seeElementInDOMError(locator);
1514+
}
14961515
}
14971516

14981517
/**

Diff for: lib/helper/errors/ElementAssertion.js

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
const Locator = require('../../locator');
2+
3+
const prefixMessage = 'Element';
4+
5+
function seeElementError(locator) {
6+
if (typeof locator === 'object') {
7+
locator = JSON.stringify(locator);
8+
}
9+
throw new Error(`${prefixMessage} "${(new Locator(locator))}" is still visible on page.`);
10+
}
11+
12+
function seeElementInDOMError(locator) {
13+
if (typeof locator === 'object') {
14+
locator = JSON.stringify(locator);
15+
}
16+
throw new Error(`${prefixMessage} "${(new Locator(locator))}" is still seen in DOM.`);
17+
}
18+
19+
function dontSeeElementError(locator) {
20+
if (typeof locator === 'object') {
21+
locator = JSON.stringify(locator);
22+
}
23+
throw new Error(`${prefixMessage} "${(new Locator(locator))}" is not visible on page.`);
24+
}
25+
26+
function dontSeeElementInDOMError(locator) {
27+
if (typeof locator === 'object') {
28+
locator = JSON.stringify(locator);
29+
}
30+
throw new Error(`${prefixMessage} "${(new Locator(locator))}" is not seen in DOM.`);
31+
}
32+
33+
module.exports = {
34+
seeElementError,
35+
dontSeeElementError,
36+
seeElementInDOMError,
37+
dontSeeElementInDOMError,
38+
};

0 commit comments

Comments
 (0)