@@ -17,9 +17,10 @@ export const getElementInformation = async (
1717 page : Page ,
1818 coordinates : Coordinates ,
1919 listSelector : string ,
20+ getList : boolean
2021) => {
2122 try {
22- if ( listSelector !== '' ) {
23+ if ( ! getList || listSelector !== '' ) {
2324 const elementInfo = await page . evaluate (
2425 async ( { x, y } ) => {
2526 const el = document . elementFromPoint ( x , y ) as HTMLElement ;
@@ -74,22 +75,10 @@ export const getElementInformation = async (
7475 if ( originalEl ) {
7576 let element = originalEl ;
7677
77- const containerTags = [ 'DIV' , 'SECTION' , 'ARTICLE' , 'MAIN' , 'HEADER' , 'FOOTER' , 'NAV' , 'ASIDE' ,
78- 'ADDRESS' , 'BLOCKQUOTE' , 'DETAILS' , 'DIALOG' , 'FIGURE' , 'FIGCAPTION' , 'MAIN' , 'MARK' , 'SUMMARY' , 'TIME' ,
79- 'TABLE' , 'THEAD' , 'TBODY' , 'TFOOT' , 'TR' , 'TH' , 'TD' , 'CAPTION' , 'COLGROUP' , 'COL' , 'FORM' , 'FIELDSET' ,
80- 'LEGEND' , 'LABEL' , 'INPUT' , 'BUTTON' , 'SELECT' , 'DATALIST' , 'OPTGROUP' , 'OPTION' , 'TEXTAREA' , 'OUTPUT' ,
81- 'PROGRESS' , 'METER' , 'DETAILS' , 'SUMMARY' , 'MENU' , 'MENUITEM' , 'MENUITEM' , 'APPLET' , 'EMBED' , 'OBJECT' ,
82- 'PARAM' , 'VIDEO' , 'AUDIO' , 'SOURCE' , 'TRACK' , 'CANVAS' , 'MAP' , 'AREA' , 'SVG' , 'IFRAME' , 'FRAME' , 'FRAMESET' ,
83- 'LI' , 'UL' , 'OL' , 'DL' , 'DT' , 'DD' , 'HR' , 'P' , 'PRE' , 'LISTING' , 'PLAINTEXT' , 'A'
84- ] ;
8578 while ( element . parentElement ) {
8679 const parentRect = element . parentElement . getBoundingClientRect ( ) ;
8780 const childRect = element . getBoundingClientRect ( ) ;
8881
89- if ( ! containerTags . includes ( element . parentElement . tagName ) ) {
90- break ;
91- }
92-
9382 const fullyContained =
9483 parentRect . left <= childRect . left &&
9584 parentRect . right >= childRect . right &&
@@ -167,9 +156,9 @@ export const getElementInformation = async (
167156 * @category WorkflowManagement-Selectors
168157 * @returns {Promise<Rectangle|undefined|null> }
169158 */
170- export const getRect = async ( page : Page , coordinates : Coordinates , listSelector : string ) => {
159+ export const getRect = async ( page : Page , coordinates : Coordinates , listSelector : string , getList : boolean ) => {
171160 try {
172- if ( listSelector !== '' ) {
161+ if ( ! getList || listSelector !== '' ) {
173162 const rect = await page . evaluate (
174163 async ( { x, y } ) => {
175164 const el = document . elementFromPoint ( x , y ) as HTMLElement ;
@@ -202,22 +191,10 @@ export const getRect = async (page: Page, coordinates: Coordinates, listSelector
202191 if ( originalEl ) {
203192 let element = originalEl ;
204193
205- const containerTags = [ 'DIV' , 'SECTION' , 'ARTICLE' , 'MAIN' , 'HEADER' , 'FOOTER' , 'NAV' , 'ASIDE' ,
206- 'ADDRESS' , 'BLOCKQUOTE' , 'DETAILS' , 'DIALOG' , 'FIGURE' , 'FIGCAPTION' , 'MAIN' , 'MARK' , 'SUMMARY' , 'TIME' ,
207- 'TABLE' , 'THEAD' , 'TBODY' , 'TFOOT' , 'TR' , 'TH' , 'TD' , 'CAPTION' , 'COLGROUP' , 'COL' , 'FORM' , 'FIELDSET' ,
208- 'LEGEND' , 'LABEL' , 'INPUT' , 'BUTTON' , 'SELECT' , 'DATALIST' , 'OPTGROUP' , 'OPTION' , 'TEXTAREA' , 'OUTPUT' ,
209- 'PROGRESS' , 'METER' , 'DETAILS' , 'SUMMARY' , 'MENU' , 'MENUITEM' , 'MENUITEM' , 'APPLET' , 'EMBED' , 'OBJECT' ,
210- 'PARAM' , 'VIDEO' , 'AUDIO' , 'SOURCE' , 'TRACK' , 'CANVAS' , 'MAP' , 'AREA' , 'SVG' , 'IFRAME' , 'FRAME' , 'FRAMESET' ,
211- 'LI' , 'UL' , 'OL' , 'DL' , 'DT' , 'DD' , 'HR' , 'P' , 'PRE' , 'LISTING' , 'PLAINTEXT' , 'A'
212- ] ;
213194 while ( element . parentElement ) {
214195 const parentRect = element . parentElement . getBoundingClientRect ( ) ;
215196 const childRect = element . getBoundingClientRect ( ) ;
216197
217- if ( ! containerTags . includes ( element . parentElement . tagName ) ) {
218- break ;
219- }
220-
221198 const fullyContained =
222199 parentRect . left <= childRect . left &&
223200 parentRect . right >= childRect . right &&
@@ -875,8 +852,10 @@ interface SelectorResult {
875852 * @returns {Promise<Selectors|null|undefined> }
876853 */
877854
878- export const getNonUniqueSelectors = async ( page : Page , coordinates : Coordinates ) : Promise < SelectorResult > => {
855+ export const getNonUniqueSelectors = async ( page : Page , coordinates : Coordinates , listSelector : string ) : Promise < SelectorResult > => {
879856 try {
857+ if ( ! listSelector ) {
858+ console . log ( `NON UNIQUE: MODE 1` )
880859 const selectors = await page . evaluate ( ( { x, y } : { x : number , y : number } ) => {
881860 function getNonUniqueSelector ( element : HTMLElement ) : string {
882861 let selector = element . tagName . toLowerCase ( ) ;
@@ -914,47 +893,82 @@ export const getNonUniqueSelectors = async (page: Page, coordinates: Coordinates
914893
915894 let element = originalEl ;
916895
917- const containerTags = [ 'DIV' , 'SECTION' , 'ARTICLE' , 'MAIN' , 'HEADER' , 'FOOTER' , 'NAV' , 'ASIDE' ,
918- 'ADDRESS' , 'BLOCKQUOTE' , 'DETAILS' , 'DIALOG' , 'FIGURE' , 'FIGCAPTION' , 'MAIN' , 'MARK' , 'SUMMARY' , 'TIME' ,
919- 'TABLE' , 'THEAD' , 'TBODY' , 'TFOOT' , 'TR' , 'TH' , 'TD' , 'CAPTION' , 'COLGROUP' , 'COL' , 'FORM' , 'FIELDSET' ,
920- 'LEGEND' , 'LABEL' , 'INPUT' , 'BUTTON' , 'SELECT' , 'DATALIST' , 'OPTGROUP' , 'OPTION' , 'TEXTAREA' , 'OUTPUT' ,
921- 'PROGRESS' , 'METER' , 'DETAILS' , 'SUMMARY' , 'MENU' , 'MENUITEM' , 'MENUITEM' , 'APPLET' , 'EMBED' , 'OBJECT' ,
922- 'PARAM' , 'VIDEO' , 'AUDIO' , 'SOURCE' , 'TRACK' , 'CANVAS' , 'MAP' , 'AREA' , 'SVG' , 'IFRAME' , 'FRAME' , 'FRAMESET' ,
923- 'LI' , 'UL' , 'OL' , 'DL' , 'DT' , 'DD' , 'HR' , 'P' , 'PRE' , 'LISTING' , 'PLAINTEXT' , 'A'
924- ] ;
925-
926- while ( element . parentElement ) {
927- const parentRect = element . parentElement . getBoundingClientRect ( ) ;
928- const childRect = element . getBoundingClientRect ( ) ;
929-
930- if ( ! containerTags . includes ( element . parentElement . tagName ) ) {
931- break ;
896+ // if (listSelector === '') {
897+ while ( element . parentElement ) {
898+ const parentRect = element . parentElement . getBoundingClientRect ( ) ;
899+ const childRect = element . getBoundingClientRect ( ) ;
900+
901+ const fullyContained =
902+ parentRect . left <= childRect . left &&
903+ parentRect . right >= childRect . right &&
904+ parentRect . top <= childRect . top &&
905+ parentRect . bottom >= childRect . bottom ;
906+
907+ const significantOverlap =
908+ ( childRect . width * childRect . height ) /
909+ ( parentRect . width * parentRect . height ) > 0.5 ;
910+
911+ if ( fullyContained && significantOverlap ) {
912+ element = element . parentElement ;
913+ } else {
914+ break ;
915+ }
916+ }
917+ // }
918+
919+ const generalSelector = getSelectorPath ( element ) ;
920+ return {
921+ generalSelector,
922+ } ;
923+ } , coordinates ) ;
924+ return selectors || { generalSelector : '' } ;
925+ } else {
926+ console . log ( `NON UNIQUE: MODE 2` )
927+ const selectors = await page . evaluate ( ( { x, y } : { x : number , y : number } ) => {
928+ function getNonUniqueSelector ( element : HTMLElement ) : string {
929+ let selector = element . tagName . toLowerCase ( ) ;
930+
931+ if ( element . className ) {
932+ const classes = element . className . split ( / \s + / ) . filter ( ( cls : string ) => Boolean ( cls ) ) ;
933+ if ( classes . length > 0 ) {
934+ const validClasses = classes . filter ( ( cls : string ) => ! cls . startsWith ( '!' ) && ! cls . includes ( ':' ) ) ;
935+ if ( validClasses . length > 0 ) {
936+ selector += '.' + validClasses . map ( cls => CSS . escape ( cls ) ) . join ( '.' ) ;
937+ }
938+ }
932939 }
933940
934- const fullyContained =
935- parentRect . left <= childRect . left &&
936- parentRect . right >= childRect . right &&
937- parentRect . top <= childRect . top &&
938- parentRect . bottom >= childRect . bottom ;
941+ return selector ;
942+ }
939943
940- const significantOverlap =
941- ( childRect . width * childRect . height ) /
942- ( parentRect . width * parentRect . height ) > 0.5 ;
944+ function getSelectorPath ( element : HTMLElement | null ) : string {
945+ const path : string [ ] = [ ] ;
946+ let depth = 0 ;
947+ const maxDepth = 2 ;
943948
944- if ( fullyContained && significantOverlap ) {
949+ while ( element && element !== document . body && depth < maxDepth ) {
950+ const selector = getNonUniqueSelector ( element ) ;
951+ path . unshift ( selector ) ;
945952 element = element . parentElement ;
946- } else {
947- break ;
953+ depth ++ ;
948954 }
955+
956+ return path . join ( ' > ' ) ;
949957 }
950958
959+ const originalEl = document . elementFromPoint ( x , y ) as HTMLElement ;
960+ if ( ! originalEl ) return null ;
961+
962+ let element = originalEl ;
963+
951964 const generalSelector = getSelectorPath ( element ) ;
952965 return {
953966 generalSelector,
954967 } ;
955968 } , coordinates ) ;
956-
957969 return selectors || { generalSelector : '' } ;
970+ }
971+
958972 } catch ( error ) {
959973 console . error ( 'Error in getNonUniqueSelectors:' , error ) ;
960974 return { generalSelector : '' } ;
0 commit comments