11import { type Browser , type BrowserContext , type Page , Locator , FrameLocator } from '@playwright/test' ;
22
3+ type SelectorDefinition = string | ( ( argument : string ) => string ) | ( ( argument : any ) => any ) | null ;
4+
35export class Selector {
4- selector : string | ( ( argument : string ) => string ) | ( ( argument : any ) => any ) ;
6+ selector : SelectorDefinition ;
57 component ! : Function ;
68 type : string = 'simple' ;
79
8- constructor ( selector : string | ( ( argument : string ) => string ) | ( ( argument : any ) => any ) , type ?: string ) {
10+ constructor ( selector : SelectorDefinition , type ?: string ) {
911 this . selector = selector ;
1012 if ( type ) {
1113 this . type = type ;
@@ -48,6 +50,12 @@ export interface LocatorDefinition {
4850 * @param {(argument: string) => string } selector - selector function
4951 */
5052 native : ( selector : ( params : NativeSelectorParams ) => Locator | FrameLocator ) => Selector ;
53+
54+ /**
55+ * Define component
56+ * @param { new () => void } component
57+ */
58+ as : ( component : new ( ) => void ) => Selector ;
5159}
5260
5361export const locator : LocatorDefinition = function locator ( selector : any ) : Selector {
@@ -62,6 +70,12 @@ locator.native = function(selector: (params: NativeSelectorParams) => Locator |
6270 return new Selector ( selector , 'native' ) ;
6371}
6472
73+ locator . as = function ( component : new ( ) => void ) {
74+ const selector = new Selector ( null ) ;
75+ selector . component = component ;
76+ return selector ;
77+ }
78+
6579export class ChainItem {
6680 alias : string ;
6781 argument ?: string ;
@@ -80,7 +94,7 @@ export function query(root: any, path: string) {
8094 const elements = path . split ( / \s * > \s * / ) ;
8195 const tokens = [ ] ;
8296 let currentComponent = new root ( ) ;
83- let currentAlias = 'root' ;
97+ let currentAlias = 'page object root' ;
8498 for ( const element of elements ) {
8599 const groups = element . match ( / ^ (?< alias > .+ ?) (?: \( (?< argument > .+ ) \) ) ? $ / ) ?. groups as { alias : string , argument : string } ;
86100 const alias = groups . alias . replace ( / \s / g, '' ) ;
@@ -106,7 +120,7 @@ export function element(this: any, path: string): Locator {
106120 let current = page as unknown as Locator ;
107121 for ( const item of chain ) {
108122 switch ( item . type ) {
109- case 'simple' : current = current . locator ( item . selector ) ; break ;
123+ case 'simple' : current = item . selector ? current . locator ( item . selector ) : current ; break ;
110124 case 'template' : current = current . locator ( item . selector ( item . argument ) ) ; break ;
111125 case 'native' : current = item . selector ( {
112126 driver : this . playwright . driver ,
0 commit comments