@@ -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
242247export 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) => {
268273export 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
276281export 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