@@ -383,6 +383,52 @@ test('parseUiHierarchy keeps lower siblings when drawing-order metadata is unava
383383 ) ;
384384} ) ;
385385
386+ test ( 'parseUiHierarchy keeps overlapping siblings when drawing-order ties' , ( ) => {
387+ const xml = `<hierarchy>
388+ <node class="android.widget.FrameLayout" bounds="[0,0][390,844]" visible-to-user="true" drawing-order="0">
389+ <node class="android.view.ViewGroup" bounds="[0,0][390,844]" visible-to-user="true" drawing-order="1">
390+ <node class="android.widget.Button" text="First tied action" bounds="[24,420][366,480]" clickable="true" enabled="true" visible-to-user="true" drawing-order="1"/>
391+ </node>
392+ <node class="android.view.ViewGroup" bounds="[0,0][390,844]" visible-to-user="true" drawing-order="1">
393+ <node class="android.widget.Button" text="Second tied action" bounds="[0,220][280,280]" clickable="true" enabled="true" visible-to-user="true" drawing-order="1"/>
394+ </node>
395+ </node>
396+ </hierarchy>` ;
397+
398+ const result = parseUiHierarchy ( xml , 800 , { raw : true } ) ;
399+ assert . equal (
400+ result . nodes . some ( ( node ) => node . label === 'First tied action' ) ,
401+ true ,
402+ ) ;
403+ assert . equal (
404+ result . nodes . some ( ( node ) => node . label === 'Second tied action' ) ,
405+ true ,
406+ ) ;
407+ } ) ;
408+
409+ test ( 'parseUiHierarchy keeps lower siblings below the covered-area threshold' , ( ) => {
410+ const xml = `<hierarchy>
411+ <node class="android.widget.FrameLayout" bounds="[0,0][390,844]" visible-to-user="true" drawing-order="0">
412+ <node class="android.view.ViewGroup" bounds="[0,0][390,717]" visible-to-user="true" drawing-order="2">
413+ <node class="android.widget.Button" text="Partial overlay action" bounds="[24,420][366,480]" clickable="true" enabled="true" visible-to-user="true" drawing-order="1"/>
414+ </node>
415+ <node class="android.view.ViewGroup" bounds="[0,0][390,844]" visible-to-user="true" drawing-order="1">
416+ <node class="android.widget.Button" text="Mostly visible action" bounds="[0,760][280,820]" clickable="true" enabled="true" visible-to-user="true" drawing-order="1"/>
417+ </node>
418+ </node>
419+ </hierarchy>` ;
420+
421+ const result = parseUiHierarchy ( xml , 800 , { raw : true } ) ;
422+ assert . equal (
423+ result . nodes . some ( ( node ) => node . label === 'Partial overlay action' ) ,
424+ true ,
425+ ) ;
426+ assert . equal (
427+ result . nodes . some ( ( node ) => node . label === 'Mostly visible action' ) ,
428+ true ,
429+ ) ;
430+ } ) ;
431+
386432test ( 'parseUiHierarchy keeps lower siblings covered only by non-agent-visible overlays' , ( ) => {
387433 const xml = `<hierarchy>
388434 <node class="android.widget.FrameLayout" bounds="[0,0][390,844]" visible-to-user="true" drawing-order="0">
0 commit comments