Skip to content

Commit 99c7c8c

Browse files
committed
Add new modal specific commands
1 parent 7386a09 commit 99c7c8c

File tree

5 files changed

+82
-0
lines changed

5 files changed

+82
-0
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { Selectors } from '../compass';
2+
import type { CompassBrowser } from '../compass-browser';
3+
4+
import Debug from 'debug';
5+
6+
const debug = Debug('compass-e2e-tests');
7+
8+
// TODO: Wait for any animation to settle before resolving?
9+
export function getOpenModals(
10+
browser: CompassBrowser,
11+
selector: Parameters<CompassBrowser['$$']>[0] = Selectors.LGModal
12+
): Promise<WebdriverIO.Element[]> {
13+
return browser.$$(selector).filter(async (element) => {
14+
try {
15+
const tagName = await element.getTagName();
16+
if (tagName !== 'dialog') {
17+
throw new Error(
18+
`Expected selector to match dialogs, matched '${tagName}'`
19+
);
20+
}
21+
const open = await element.getAttribute('open');
22+
return open === 'true';
23+
} catch (err) {
24+
// Most likely, the element disappeared after it got selected
25+
debug('ignoring', err instanceof Error ? err.stack : err);
26+
return false;
27+
}
28+
});
29+
}

packages/compass-e2e-tests/helpers/commands/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,7 @@ export * from './read-stage-operators';
6767
export * from './click-confirmation-action';
6868
export * from './get-input-by-label';
6969
export * from './resize-window';
70+
export * from './get-open-modals';
71+
export * from './is-modal-open';
72+
export * from './is-modal-eventually-open';
73+
export * from './wait-for-open-modal';
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { Selectors } from '../compass';
2+
import type { CompassBrowser } from '../compass-browser';
3+
4+
export async function isModalEventuallyOpen(
5+
browser: CompassBrowser,
6+
selector: Parameters<CompassBrowser['$$']>[0] = Selectors.LGModal,
7+
timeout?: number
8+
): Promise<boolean> {
9+
try {
10+
await browser.waitForOpenModal(selector, { timeout });
11+
// return true if it opens before the timeout expires
12+
return true;
13+
} catch {
14+
return false;
15+
}
16+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { Selectors } from '../compass';
2+
import type { CompassBrowser } from '../compass-browser';
3+
4+
export async function isModalOpen(
5+
browser: CompassBrowser,
6+
selector: Parameters<CompassBrowser['$$']>[0] = Selectors.LGModal
7+
): Promise<boolean> {
8+
const modals = await browser.getOpenModals(selector);
9+
return modals.length > 0;
10+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { inspect } from 'node:util';
2+
import type { WaitForOptions } from 'webdriverio';
3+
import type { CompassBrowser } from '../compass-browser';
4+
5+
export async function waitForOpenModal(
6+
browser: CompassBrowser,
7+
selector: Parameters<CompassBrowser['$$']>[0],
8+
{ reverse = false, ...options }: WaitForOptions = {}
9+
): Promise<void> {
10+
await browser.waitUntil(
11+
async () => {
12+
const open = await browser.isModalOpen(selector);
13+
return reverse ? !open : open;
14+
},
15+
{
16+
timeout: 2_000,
17+
timeoutMsg: `Timeout waiting for modal '${inspect(selector)}' to ${
18+
reverse ? 'close' : 'open'
19+
}`,
20+
...options,
21+
}
22+
);
23+
}

0 commit comments

Comments
 (0)