1- import type { Page , ElementHandle , Frame } from "playwright-core"
1+ import type { Page , ElementHandle , Frame , Locator } from "playwright-core"
22import { PageWaitForSelectorOptions } from "../../global"
33
4- type Handle = Page | Frame | ElementHandle
4+ type Handle = Page | Frame | ElementHandle | Locator
55export type ExpectInputType = Handle | Promise < Handle >
66
77const isElementHandle = ( value : Handle ) : value is ElementHandle => {
88 return value . constructor . name === "ElementHandle"
99}
1010
11+ const isLocator = ( value : Handle ) : value is Locator => {
12+ return value . constructor . name === "Locator"
13+ }
14+
1115export const getFrame = async ( value : ExpectInputType ) => {
1216 const resolved = await value
13- return isElementHandle ( resolved ) ? resolved . contentFrame ( ) : resolved
17+
18+ return isElementHandle ( resolved )
19+ ? resolved . contentFrame ( )
20+ : ( resolved as Page | Frame )
1421}
1522
1623const isObject = ( value : unknown ) =>
@@ -37,22 +44,25 @@ export const getElementHandle = async (
3744 const expectedValue = args . splice ( - valueArgCount , valueArgCount ) as string [ ]
3845
3946 // Finally, we can find the element handle
40- const handle = await args [ 0 ]
41- let elementHandle = ( await getFrame ( handle ) ) ?? handle
47+ let handle = await args [ 0 ]
48+ handle = ( await getFrame ( handle ) ) ?? handle
4249
50+ if ( isLocator ( handle ) ) {
51+ handle = ( await handle . elementHandle ( ) ) !
52+ }
4353 // If the user provided a page or iframe, we need to locate the provided
4454 // selector or the `body` element if none was provided.
45- if ( ! isElementHandle ( elementHandle ) ) {
55+ else if ( ! isElementHandle ( handle ) ) {
4656 const selector = args [ 1 ] ?? "body"
4757
4858 try {
49- elementHandle = ( await elementHandle . waitForSelector ( selector , options ) ) !
59+ handle = ( await handle . waitForSelector ( selector , options ) ) !
5060 } catch ( err ) {
5161 throw new Error ( `Timeout exceed for element ${ quote ( selector ) } ` )
5262 }
5363 }
5464
55- return [ elementHandle , expectedValue ] as const
65+ return [ handle , expectedValue ] as const
5666}
5767
5868export const quote = ( val : string | null ) => ( val === null ? "" : `'${ val } '` )
0 commit comments