@@ -1944,8 +1944,15 @@ class Playwright extends Helper {
19441944 * {{> seeElement }}
19451945 *
19461946 */
1947- async seeElement ( locator ) {
1948- let els = await this . _locate ( locator )
1947+ async seeElement ( locator , context = null ) {
1948+ let els
1949+ if ( context ) {
1950+ const contextEls = await this . _locate ( context )
1951+ assertElementExists ( contextEls , context , 'Context element' )
1952+ els = await findElements . call ( this , contextEls [ 0 ] , locator )
1953+ } else {
1954+ els = await this . _locate ( locator )
1955+ }
19491956 els = await Promise . all ( els . map ( el => el . isVisible ( ) ) )
19501957 try {
19511958 return empty ( 'visible elements' ) . negate ( els . filter ( v => v ) . fill ( 'ELEMENT' ) )
@@ -1958,8 +1965,15 @@ class Playwright extends Helper {
19581965 * {{> dontSeeElement }}
19591966 *
19601967 */
1961- async dontSeeElement ( locator ) {
1962- let els = await this . _locate ( locator )
1968+ async dontSeeElement ( locator , context = null ) {
1969+ let els
1970+ if ( context ) {
1971+ const contextEls = await this . _locate ( context )
1972+ assertElementExists ( contextEls , context , 'Context element' )
1973+ els = await findElements . call ( this , contextEls [ 0 ] , locator )
1974+ } else {
1975+ els = await this . _locate ( locator )
1976+ }
19631977 els = await Promise . all ( els . map ( el => el . isVisible ( ) ) )
19641978 try {
19651979 return empty ( 'visible elements' ) . assert ( els . filter ( v => v ) . fill ( 'ELEMENT' ) )
@@ -2245,8 +2259,8 @@ class Playwright extends Helper {
22452259 * {{> fillField }}
22462260 *
22472261 */
2248- async fillField ( field , value ) {
2249- const els = await findFields . call ( this , field )
2262+ async fillField ( field , value , context = null ) {
2263+ const els = await findFields . call ( this , field , context )
22502264 assertElementExists ( els , field , 'Field' )
22512265 if ( this . options . strict ) assertOnlyOneElement ( els , field )
22522266 const el = els [ 0 ]
@@ -2340,31 +2354,39 @@ class Playwright extends Helper {
23402354 /**
23412355 * {{> selectOption }}
23422356 */
2343- async selectOption ( select , option ) {
2344- const context = await this . context
2357+ async selectOption ( select , option , context = null ) {
2358+ const pageContext = await this . context
23452359 const matchedLocator = new Locator ( select )
23462360
2361+ let contextEl
2362+ if ( context ) {
2363+ const contextEls = await this . _locate ( context )
2364+ assertElementExists ( contextEls , context , 'Context element' )
2365+ contextEl = contextEls [ 0 ]
2366+ }
2367+
23472368 // Strict locator
23482369 if ( ! matchedLocator . isFuzzy ( ) ) {
23492370 this . debugSection ( 'SelectOption' , `Strict: ${ JSON . stringify ( select ) } ` )
2350- const els = await this . _locate ( matchedLocator )
2371+ const els = contextEl ? await findElements . call ( this , contextEl , matchedLocator ) : await this . _locate ( matchedLocator )
23512372 assertElementExists ( els , select , 'Selectable element' )
2352- return proceedSelect . call ( this , context , els [ 0 ] , option )
2373+ return proceedSelect . call ( this , pageContext , els [ 0 ] , option )
23532374 }
23542375
23552376 // Fuzzy: try combobox
23562377 this . debugSection ( 'SelectOption' , `Fuzzy: "${ matchedLocator . value } "` )
2357- let els = await findByRole ( context , { role : 'combobox' , name : matchedLocator . value } )
2358- if ( els ?. length ) return proceedSelect . call ( this , context , els [ 0 ] , option )
2378+ const comboboxSearchCtx = contextEl || pageContext
2379+ let els = await findByRole ( comboboxSearchCtx , { role : 'combobox' , name : matchedLocator . value } )
2380+ if ( els ?. length ) return proceedSelect . call ( this , pageContext , els [ 0 ] , option )
23592381
23602382 // Fuzzy: try listbox
2361- els = await findByRole ( context , { role : 'listbox' , name : matchedLocator . value } )
2362- if ( els ?. length ) return proceedSelect . call ( this , context , els [ 0 ] , option )
2383+ els = await findByRole ( comboboxSearchCtx , { role : 'listbox' , name : matchedLocator . value } )
2384+ if ( els ?. length ) return proceedSelect . call ( this , pageContext , els [ 0 ] , option )
23632385
23642386 // Fuzzy: try native select
2365- els = await findFields . call ( this , select )
2387+ els = await findFields . call ( this , select , context )
23662388 assertElementExists ( els , select , 'Selectable element' )
2367- return proceedSelect . call ( this , context , els [ 0 ] , option )
2389+ return proceedSelect . call ( this , pageContext , els [ 0 ] , option )
23682390 }
23692391
23702392 /**
@@ -4355,34 +4377,45 @@ async function proceedIsChecked(assertType, option) {
43554377 return truth ( `checkable ${ option } ` , 'to be checked' ) [ assertType ] ( selected )
43564378}
43574379
4358- async function findFields ( locator ) {
4380+ async function findFields ( locator , context = null ) {
4381+ let contextEl
4382+ if ( context ) {
4383+ const contextEls = await this . _locate ( context )
4384+ assertElementExists ( contextEls , context , 'Context element' )
4385+ contextEl = contextEls [ 0 ]
4386+ }
4387+
4388+ const locateFn = contextEl
4389+ ? loc => findElements . call ( this , contextEl , loc )
4390+ : loc => this . _locate ( loc )
4391+
43594392 // Handle role locators with text/exact options
43604393 if ( isRoleLocatorObject ( locator ) ) {
4361- const page = await this . page
4362- const roleElements = await handleRoleLocator ( page , locator )
4394+ const matcher = contextEl || ( await this . page )
4395+ const roleElements = await handleRoleLocator ( matcher , locator )
43634396 if ( roleElements ) return roleElements
43644397 }
43654398
43664399 const matchedLocator = new Locator ( locator )
43674400 if ( ! matchedLocator . isFuzzy ( ) ) {
4368- return this . _locate ( matchedLocator )
4401+ return locateFn ( matchedLocator )
43694402 }
43704403 const literal = xpathLocator . literal ( locator )
43714404
4372- let els = await this . _locate ( { xpath : Locator . field . labelEquals ( literal ) } )
4405+ let els = await locateFn ( { xpath : Locator . field . labelEquals ( literal ) } )
43734406 if ( els . length ) {
43744407 return els
43754408 }
43764409
4377- els = await this . _locate ( { xpath : Locator . field . labelContains ( literal ) } )
4410+ els = await locateFn ( { xpath : Locator . field . labelContains ( literal ) } )
43784411 if ( els . length ) {
43794412 return els
43804413 }
4381- els = await this . _locate ( { xpath : Locator . field . byName ( literal ) } )
4414+ els = await locateFn ( { xpath : Locator . field . byName ( literal ) } )
43824415 if ( els . length ) {
43834416 return els
43844417 }
4385- return this . _locate ( { css : locator } )
4418+ return locateFn ( { css : locator } )
43864419}
43874420
43884421async function proceedSelect ( context , el , option ) {
0 commit comments