Skip to content

Commit 8be47c2

Browse files
Lightning00BladeDevtools-frontend LUCI CQ
authored andcommitted
[test] Use Puppeteer to deduce Element types
Bug: none Change-Id: I8899a6795b6a7931f5afcb5dcbe2740623c9ed74 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6348456 Commit-Queue: Nikolay Vitkov <[email protected]> Auto-Submit: Nikolay Vitkov <[email protected]> Reviewed-by: Ergün Erdoğmuş <[email protected]>
1 parent 81bf552 commit 8be47c2

File tree

2 files changed

+15
-10
lines changed

2 files changed

+15
-10
lines changed

test/e2e/recorder/helpers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import {
2121
waitForAria,
2222
} from '../../../test/shared/helper.js';
2323

24-
const RECORDER_CONTROLLER_TAG_NAME = 'devtools-recorder-controller';
24+
const RECORDER_CONTROLLER_TAG_NAME = 'devtools-recorder-controller' as const;
2525
const TEST_RECORDING_NAME = 'New Recording';
2626
const ControlOrMeta = platform === 'mac' ? 'Meta' : 'Control';
2727

test/shared/helper.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -199,21 +199,26 @@ export const pasteText = async (text: string) => {
199199
await drainFrontendTaskQueue();
200200
};
201201

202+
type DeducedElementType<ElementType extends Element|null, Selector extends string> =
203+
ElementType extends null ? puppeteer.NodeFor<Selector>: ElementType;
204+
202205
// Get a single element handle. Uses `pierce` handler per default for piercing Shadow DOM.
203-
export const $ = async<ElementType extends Element = Element>(
204-
selector: string, root?: puppeteer.ElementHandle, handler = 'pierce') => {
206+
export const $ = async<ElementType extends Element|null = null, Selector extends string = string>(
207+
selector: Selector, root?: puppeteer.ElementHandle, handler = 'pierce') => {
205208
const {frontend} = getBrowserAndPages();
206209
const rootElement = root ? root : frontend;
207-
const element = await rootElement.$(`${handler}/${selector}`) as puppeteer.ElementHandle<ElementType>;
210+
const element = await rootElement.$(`${handler}/${selector}`) as
211+
puppeteer.ElementHandle<DeducedElementType<ElementType, Selector>>;
208212
return element;
209213
};
210214

211215
// Get multiple element handles. Uses `pierce` handler per default for piercing Shadow DOM.
212-
export const $$ =
213-
async<ElementType extends Element = Element>(selector: string, root?: puppeteer.JSHandle, handler = 'pierce') => {
216+
export const $$ = async<ElementType extends Element|null = null, Selector extends string = string>(
217+
selector: Selector, root?: puppeteer.JSHandle, handler = 'pierce') => {
214218
const {frontend} = getBrowserAndPages();
215219
const rootElement = root ? root.asElement() || frontend : frontend;
216-
const elements = await rootElement.$$(`${handler}/${selector}`) as Array<puppeteer.ElementHandle<ElementType>>;
220+
const elements = await rootElement.$$(`${handler}/${selector}`) as
221+
Array<puppeteer.ElementHandle<DeducedElementType<ElementType, Selector>>>;
217222
return elements;
218223
};
219224

@@ -241,7 +246,7 @@ export const timeout = (duration: number) => new Promise<void>(resolve => setTim
241246

242247
export const getTextContent =
243248
async<ElementType extends Element = Element>(selector: string, root?: puppeteer.ElementHandle) => {
244-
const text = await (await $<ElementType>(selector, root))?.evaluate(node => node.textContent);
249+
const text = await (await $<ElementType, typeof selector>(selector, root))?.evaluate(node => node.textContent);
245250
return text ?? undefined;
246251
};
247252

@@ -268,15 +273,15 @@ export const getVisibleTextContents = async (selector: string) => {
268273
export const waitFor = async<ElementType extends Element = Element>(
269274
selector: string, root?: puppeteer.ElementHandle, asyncScope = new AsyncScope(), handler?: string) => {
270275
return await asyncScope.exec(() => waitForFunction(async () => {
271-
const element = await $<ElementType>(selector, root, handler);
276+
const element = await $<ElementType, typeof selector>(selector, root, handler);
272277
return (element || undefined);
273278
}, asyncScope), `Waiting for element matching selector '${selector}'`);
274279
};
275280

276281
export const waitForVisible = async<ElementType extends Element = Element>(
277282
selector: string, root?: puppeteer.ElementHandle, asyncScope = new AsyncScope(), handler?: string) => {
278283
return await asyncScope.exec(() => waitForFunction(async () => {
279-
const element = await $<ElementType>(selector, root, handler);
284+
const element = await $<ElementType, typeof selector>(selector, root, handler);
280285
const visible = await element.evaluate(node => node.checkVisibility());
281286
return visible ? element : undefined;
282287
}, asyncScope), `Waiting for element matching selector '${selector}' to be visible`);

0 commit comments

Comments
 (0)