
    %j\                     d   d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
mZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZ  ej>                  e       Z! G d
 de"      Z# G d de"      Z$de%de%fdZ&de%de%fdZ'dee%e(f   de(fdZ)de%de*fdZ+de%de%fdZ,de%de%fdZ- G d de%      Z. G d d      Z/ G d de0      Z1 G d d e%ejd                        Z3 G d! d"ejh                        Z5 G d# d$e5      Z6 G d% d&e6      Z7 G d' d(e0      Z8 G d) d*e8      Z9y)+    )absolute_importN)AnyCallableDictListOptionalTupleUnion)etree)Image)	Direction)AbstractXPathBasedDevice)XPathElementNotFoundError)
deprecatedinject_callswipe_in_boundsc                       e Zd Zy)TimeoutExceptionN)__name__
__module____qualname__     V/var/www/oz-panel.ru/ozpay-pub/venv/lib/python3.12/site-packages/uiautomator2/xpath.pyr   r      s    r   r   c                       e Zd ZdZy)
XPathErrorzbasic error for xpath pluginN)r   r   r   __doc__r   r   r   r   r      s    &r   r   sreturnc                     | j                         } t        j                  dd|       } t        j                  dd|       } t        j                  dd|       } | S )Nz[$@#&].z\.+z^\.|\.$ )stripresubr   s    r   safe_xmlstrr'   #   sH    		A
xa A
vsAA
{B"AHr   c                 $    dj                  |       S )zquick way to quote stringz{!r})formatr&   s    r   string_quoter*   ,   s    ==r   vc                     t        | t              r| S t        | t              r| j                  d      S t	        dt        |       |       )Nzutf-8Invalid type)
isinstancebytesstrencode
ValueErrortype)r+   s    r   	str2bytesr4   1   s=    !U!Sxx  
^T!Wa
00r   xpath_expressionc                 b    	 t        j                  |        y# t         j                  $ r Y yw xY w)NTF)r   XPathXPathSyntaxError)r5   s    r   is_xpath_syntax_okr9   9   s/    $%!! s    ..c                 j    | j                  d      }|d   dj                  d |dd D              z   }|S )zl
    Convert a string from kebab-case to camelCase.

    Example:
        "hello-world" -> "helloWorld"
    -r   r"   c              3   <   K   | ]  }|j                           y wN)
capitalize).0parts     r   	<genexpr>z(convert_to_camel_case.<locals>.<genexpr>J   s     'Pd(9'Ps      N)splitjoin)r   partscamel_case_strs      r   convert_to_camel_caserG   A   s:     GGCLE1X'PeABi'P PPNr   xpathc                    | }| j                  d      j                  d      rn| j                  d      rdj                  | dd       } n| j                  d      rdj                  t        |             } n| j                  d	      r/| j	                  d	      rd
j                  t        | dd             } n| j                  d	      r*| dd }dj                  t        |      t        |            } nK| j	                  d	      r | dd }dj                  t        |            } ndj                  t        |             } | j                  d      } t        |       st        d|      t        j                  d||        | S )z*make xpath to be computer recognized xpath(/@z//*[@resource-id={!r}]rB   N^zX//*[re:match(@text, {0}) or re:match(@content-desc, {0}) or re:match(@resource-id, {0})]%z9//*[contains(@text, {0}) or contains(@content-desc, {0})]z}//*[{0} = substring(@text, string-length(@text) - {1} + 1) or {0} = substring(@content-desc, string-length(@text) - {1} + 1)]z?//*[starts-with(@text, {0}) or starts-with(@content-desc, {0})]z7//*[@text={0} or @content-desc={0} or @resource-id={0}]zInvalid xpathzxpath %s -> %s)lstrip
startswithr)   r*   endswithlenrstripr9   r   loggerdebug)rH   
orig_xpathtexts      r   strict_xpathrY   N   sp   J||C##C(			#	(//ab	:			#	jqq
 
		#	5>>##6KRRq%
 
		#	QRy P  W  WD	
 
	SbzMTTT" 	 JPP
 LLEe$*55
LL!:u5Lr   c                   H     e Zd Z fdZ fdZddZdedd fdZd	dZ xZ	S )
r7   c                     t        |t              r|S t        |      }|r!t        j                  d |t        |            S t
        |   | |      S )Nc                 $    | j                  |      S r=   )joinpathabs     r   <lambda>zXPath.__new__.<locals>.<lambda>|   s    A r   )r.   r7   rY   	functoolsreducesuper__new__)clsvalueargsrH   	__class__s       r   re   zXPath.__new__w   sJ    eU#LU###$>eElSS7?3..r   c                 (    dt         |           dS )NzXPath())rd   __repr__)selfri   s    r   rl   zXPath.__repr__   s    (*+1--r   r   c                     t         r=   )NotImplementedErrorrm   rg   s     r   __and__zXPath.__and__   s    !!r   subpathc                 J    |j                  d      sd|z   }t        | |z         S )NrK   )rQ   r7   )rm   rr   s     r   r]   zXPath.joinpath   s(    !!#&GmGTG^$$r   c                 $    |j                  |       S r=   )find_elementsrm   sources     r   allz	XPath.all   s    ##D))r   )rg   r7   r   XPathSelector)rw   
PageSource)
r   r   r   re   rl   rq   r0   r]   rx   __classcell__ri   s   @r   r7   r7   v   s*    /."% % %
*r   r7   c                       e Zd ZdefdZedeed f   dd fd       Zej                  de
j                  fd       Zdeded   fd	Zy
)rz   xml_contentc                 @    t        j                  dd|      }|| _        y )Nz[\u200B-\u200F\uFEFF]r"   )r$   r%   _xml_content)rm   r~   clean_xml_contents      r   __init__zPageSource.__init__   s    FF#;RM-r   datar   c                 <    t        | t              rt        |       S | S r=   )r.   r0   rz   )r   s    r   parsezPageSource.parse   s    dC d##r   c                     t        j                  t        | j                              }|j	                  d      D ]0  }t        |j                  j                  dd            xs d|_        2 |S )Nz//nodeclassr"   node)	r   
fromstringr4   r   rH   r'   attribpoptag)rm   _rootr   s      r   rootzPageSource.root   s\      4+<+<!=>KK) 	KD"4;;??7B#?@JFDH	Kr   rH   
XMLElementc                 |    | j                   j                  |ddi      }|D cg c]  }t        |       c}S c c}w )Nr$   $http://exslt.org/regular-expressions
namespaces)r   rH   r   )rm   rH   matchesr   s       r   ru   zPageSource.find_elements   s7    ))//%T;a4b/c-45T
4 555s   9N)r   r   r   r0   r   staticmethodr
   r   rb   cached_propertyr   _Elementr   r   ru   r   r   r   rz   rz      sw    .C .
 E#|+,   
 enn  63 64+= 6r   rz   c                      e Zd ZdefdZd Zd Zed        Zed        Z	de
fdZd$d
Z ed      defd       Z ed      d$d       Z ed      d%defd       Z ed      d        Z ed      d        Z ed      d        Zd$dedee   fdZej2                  dfdedeeef   ded   fd Zd$ded!eeee
f      dd"fd#Zy	)&
XPathEntrydc                 .    || _         t        |d      sJ y)z=
        Args:
            d (uiautomator2 instance)
        wait_timeoutN)_dhasattr)rm   r   s     r   r   zXPathEntry.__init__   s    
 q.)))r   c                 x    dh}||vrt        d|      |dk(  r| j                  |       y t        | d|z   |       y )Ntimeoutzinvalid key_)r2   implicitly_waitsetattr)rm   keyrg   
valid_keyss       r   
global_setzXPathEntry.global_set   sI    

 j ]C00)  'D#)U+r   c                 &    || j                   _        y)zset default timeout when clickNr   r   rm   r   s     r   r   zXPathEntry.implicitly_wait   s    &r   c                 .    | j                   j                  S r=   r   rm   s    r   r   zXPathEntry.wait_timeout   s    ww###r   c                 .    | j                   j                  S r=   )r   watcherr   s    r   _watcherzXPathEntry._watcher   s    wwr   r   c                 \    t         j                  | j                  j                               S r=   )rz   r   r   dump_hierarchyr   s    r   get_page_sourcezXPathEntry.get_page_source   s      6 6 899r   Nc                 H    t         | ||      j                               dkD  S Nr   rS   rx   rm   rH   rw   s      r   matchzXPathEntry.match   s"    4v&**,-11r   zuse d.watcher.when(..) insteadreasonxqueryc                 8    | j                   j                  |      S r=   )r   when)rm   r   s     r   r   zXPathEntry.when   s    }}!!&))r   zuse d.watcher.run() insteadc                 8    | j                   j                          y r=   )r   runrv   s     r   run_watcherszXPathEntry.run_watchers   s    r   zuse d.watcher.start(..) insteadintervalc                 8    | j                   j                  |      S r=   )r   start)rm   r   s     r   watch_backgroundzXPathEntry.watch_background   s    }}""8,,r   zuse d.watcher.stop() insteadc                 8    | j                   j                          y)zstop watch backgroundNr   stopr   s    r   
watch_stopzXPathEntry.watch_stop   s     	r   zuse d.watcher.remove() insteadc                 8    | j                   j                          y r=   r   r   s    r   watch_clearzXPathEntry.watch_clear   s    r   removedc                 2   t        j                          |z   }t        j                          |k  ri| j                          t        d|t        j                          z
        }t        j                  t	        d|             t        j                          |k  rhyy)zrun watchers when sleepr         ?N)timer   maxsleepmin)rm   secondsdeadline	left_times       r   sleep_watchzXPathEntry.sleep_watch   sh     99;(iikH$Ax$))+56IJJs3	*+ iikH$r   rH   r   c                 @    t        ||       }|j                  |       y)z
        Find element and perform click

        Args:
            xpath (str): xpath string
            timeout (float): pass
            pre_delay (float): pre delay wait time before click

        Raises:
            TimeoutException
        r   N)DeviceXPathSelectorclick)rm   rH   r   selectors       r   r   zXPathEntry.click   s     'ud3w'r   
   	directionr   Nc                 &   |t         j                  k(  rt         j                  }nx|t         j                  k(  rt         j                  }nT|t         j
                  k(  rt         j                  }n0|t         j                  k(  rt         j                  }nt        d|      |dkD  sJ  | |      }t        |      D ]X  }|j                  r.| j                  j                  |d       |j                         c S | j                  j                  |d       Z y)z
        Need more tests
        scroll up the whole screen until target element founded

        Returns:
            bool (found or not)
        zInvalid directionr   g?r   N)r   FORWARDUPBACKWARDDOWNHORIZ_FORWARDLEFTHORIZ_BACKWARDRIGHTr2   rangeexistsr   	swipe_extget_last_matchrm   rH   r   
max_swipestargetis         r   	scroll_tozXPathEntry.scroll_to   s     	)))!I),,,!I)111!I)222!I0)<< A~~ez" 	.A}}!!)S1,,..GGi-		.
 r   rw   r   c                 R    t        || |rt        j                  |            S d       S r=   )r   rz   r   r   s      r   __call__zXPathEntry.__call__  s'    "5$F
0@0@0H]]X\]]r   r=   )g      @)r   r   r   r   r   r   r   propertyr   r   rz   r   r   r   r0   r   r   floatr   r   r   r   r   r   r   r   r
   r   r   r   r   r   r   r      s~   *2 *	,' $ $  : :2 78*3 * 9* 45 6 89- - :- 56 7 78 9 y!, ",(3 (% ($ ,5+<+<	   C( 
 
!	" D^c ^8E#z/4J+K ^Wl ^r   r   c                       e Zd ZdZdZy)OperatorANDORN)r   r   r   r   r   r   r   r   r   r   !  s    
C	Br   r   c                   @    e Zd Zej                  deded   fd       Zy)AbstractSelectorrw   r   r   c                      y r=   r   rv   s     r   rx   zAbstractSelector.all'  s    r   N)r   r   r   abcabstractmethodrz   r   rx   r   r   r   r   r   &  s-    * l);  r   r   c                       e Zd Zdeeeef   fdZd Ze	deed f   dd fd       Z
d ZddZddZ ed	
      deeeef   dd fd       Zdedd fdZdeded   fdZy)ry   rg   c                     t        |t              rt        |      | _        n4t        |t        t        f      r|| _        nt        dt        |      |      d | _        d | _        y )Nr-   )	r.   r0   r7   _base_xpathr   r2   r3   	_operator_next_xpathrp   s     r   r   zXPathSelector.__init__-  sR    eS!$U|D'789$D^T%[%@@-17;r   c                 ,    t        j                   |       S )z	copy self)copyr   s    r   r  zXPathSelector.copy7  s    yyr   r   c                     t        |t              r|j                         S t        |t              r | t	        |            S t        d|      )NzInvalid value)r.   ry   r  r0   r7   r2   )rf   rg   s     r   createzXPathSelector.create;  s>    e]+::<s#uU|$$_e44r   c                     | j                   rFdt        | j                         d| j                   j                   dt        | j                         dS dt        | j                         dS )Nz#( rk   )r   reprr   rg   r   r   s    r   rl   zXPathSelector.__repr__D  sc    >>T--./q1E1E0FaTM]M]H^G__`aaT--./q11r   c                 z    t        |       }t         j                  |      |_        t        j                  |_        |S r=   )ry   r  r   r   r   r   rm   rg   r   s      r   rq   zXPathSelector.__and__J  s.    $%,,U3llr   c                 z    t        |       }t         j                  |      |_        t        j                  |_        |S r=   )ry   r  r   r   r   r   r  s      r   __or__zXPathSelector.__or__P  s.    $%,,U3kkr   zuse and_ or & insteadr   _xpathc                 h    t        |t        t        f      rt        j                  d ||       S | |z  S )z]
        add xpath to condition list
        the element should match all conditions
        c                     | |z  S r=   r   r^   s     r   ra   z%XPathSelector.xpath.<locals>.<lambda>]  s
    Q r   )r.   listtuplerb   rc   )rm   r  s     r   rH   zXPathSelector.xpathV  s2     ftUm,##$6EE&= r   c                     | j                   st        | j                  t              st	        d      | j                         }| j                  j                  |      |_        |S )z!
        add child xpath
        z9can't use child when base is not XPath or operator is set)r   r.   r   r7   r   r  r]   )rm   r  news      r   childzXPathSelector.childa  sN     >>D,<,<e!DXYYiik**33F;
r   rw   r   c                    | j                   j                  |      }| j                  r| j                  r| j                  j                  |      }| j                  t        j
                  k(  r"t        t        |      t        |      z        }|S | j                  t        j                  k(  r"t        t        |      t        |      z        }|S t        d| j                        |S )find all matched elementszInvalid operator)
r   rx   r   r   r   r   r  setr   r2   )rm   rw   elementsnext_elss       r   rx   zXPathSelector.allk  s    ##''/ ''++F3H~~-HH =>
 	 8;;.HH =>  !!3T^^DDr   N)r   ry   )r   r   r   r
   r0   r7   r   r   r  classmethodr  rl   rq   r
  r   r  r  rH   r  rz   r   rx   r   r   r   ry   ry   ,  s    <eC0@$@A < 55o!56 5? 5 52 ./!E$s"23 ! ! 0!C O * l); r   ry   c                       e Zd Zd!deeef   dedee   f fdZ	de
fdZd" fdZd" fd	Zd!d
eedef      fdZedefd       ZdefdZd!dee   ded   f fdZedefd       Zd!dZd#dZdee   fdZdefdZd!defdZded   fdZd!defdZd Zd!dZ d!defdZ!d Z"de#jF                  fdZ$defd Z% xZ&S )$r   rH   parentrw   c                 \    t         |   |       || _        || _        d | _        d | _        y r=   )rd   r   _parent_source_last_source	_fallback)rm   rH   r  rw   ri   s       r   r   zDeviceXPathSelector.__init__{  s-    26-1r   pc                     t        |j                  | j                  | j                        }|j                  |_        |j
                  |_        |S r=   )r   r   r  r  r   r   )rm   r   dps      r   from_parentzDeviceXPathSelector.from_parent  s7     dllK{{	r   r   c                 D    t         |   |      }| j                  |      S r=   )rd   rq   r#  rm   rg   r   ri   s      r   rq   zDeviceXPathSelector.__and__  s"    GOE"""r   c                 D    t         |   |      }| j                  |      S r=   )rd   r
  r#  r%  s      r   r
  zDeviceXPathSelector.__or__  s"    GN5!""r   func.c                 z    t        |      st        d      t        |      sJ | j                         }||_        |S )z%
        callback on failure
        z+func should be "click" or callable function)callabler2   r  r  )rm   r'  rh   kwargsr  s        r   fallbackzDeviceXPathSelector.fallback  s:     ~JKK~~iik
r   c                     t        | j                  d      r@t        | j                  j                  t        t
        f      r| j                  j                  S y)Nr   g      4@)r   r  r.   r   intr   r   s    r   _global_timeoutz#DeviceXPathSelector._global_timeout  s=    4<<0Z@Y@Y\_af[g5h<<,,,r   c                     | j                   r| j                   S | j                  st        d      | j                  j                         S )Nzself._parent is not set)r  r  r   r   r   s    r   _get_page_sourcez$DeviceXPathSelector._get_page_source  s9    <<<<||677||++--r   DeviceXMLElementc                     |s| j                         }|| _        t        |   |      }|D cg c]  }t	        || j
                         c}S c c}w )r  )r0  r  rd   rx   r1  r  )rm   rw   r  elri   s       r   rx   zDeviceXPathSelector.all  sJ    **,F"7;v&=EFr T\\2FFFs   Ac                 :    t        | j                               dkD  S r   r   r   s    r   r   zDeviceXPathSelector.exists  s    488:""r   c                 v    | j                  |xs | j                        st        |       | j                         S )z
        Get first matched element

        Args:
            timeout (float): max seconds to wait

        Returns:
            XMLElement

        Raises:
            XPathElementNotFoundError
        )waitr.  r   r   r   s     r   getzDeviceXPathSelector.get  s5     yy8D$8$89+D11""$$r   c                 >    | j                  | j                        d   S r   )rx   r  r   s    r   r   z"DeviceXPathSelector.get_last_match  s    xx))*1--r   c                 6    | j                         j                  S )z
        get element text

        Returns:
            string of node text

        Raises:
            XPathElementNotFoundError
        )r7  rX   r   s    r   get_textzDeviceXPathSelector.get_text  s     xxzr   rX   c                     | j                         }|j                          | j                  j                  j	                          | j                  j                  j                  |       y r=   )r7  r   r  r   
clear_text	send_keys)rm   rX   r3  s      r   set_textzDeviceXPathSelector.set_text  s@    XXZ

""$!!$'r   c                     t        j                          |xs | j                  z   }	 | j                  ryt        j                          |kD  ryt        j                  d       ;)z wait until element found TF皙?r   r.  r   r   rm   r   r   s      r   r6  zDeviceXPathSelector.wait  sK    99;'"AT-A-AB{{yy{X%JJsO r   c                 <    | j                   r| j                         S y)zG
        Returns:
            None or matched DeviceXMLElement
        N)r   r   r   s    r   r   zDeviceXPathSelector.match  s    
 ;;&&(( r   c                     t        j                          |xs | j                  z   }t        j                          |k  r:| j                  syt        j                  d       t        j                          |k  r:y)zr
        Args:
            timeout (float): seconds

        Returns:
            True if gone else False
        Tr@  FrA  rB  s      r   	wait_gonezDeviceXPathSelector.wait_gone  sW     99;'"AT-A-ABiikH$;;JJsO iikH$ r   c                     | j                         d   j                         \  }}t        j                  d||       | j                  j
                  j                  ||       y )Nr   zclick %d, %d)rx   centerrU   infor  r   r   rm   xys      r   click_nowaitz DeviceXPathSelector.click_nowait  sF    xxz!}##%1NAq)a#r   c                     	 | j                  |      }|j                          y# t        $ rF | j                  s t        j                  d       t        | j                  | j                        cY S w xY w)zfind element and perform clickr   zelement not found, run fallback)r   N)r7  r   r   r  rU   rH  r   r   rm   r   r3  s      r   r   zDeviceXPathSelector.click  s[    	:'*BHHJ( 	:>>KK9:t~~99		:s   "% AA43A4c                 h    	 | j                  |      }|j                          y# t        $ r Y yw xY w)zreturn if clickedr   TF)r7  r   r   rN  s      r   click_existsz DeviceXPathSelector.click_exists  s5    	'*BHHJ( 		s   "% 	11c                 @    | j                         j                          y)z#find element and perform long clickN)r7  
long_clickr   s    r   rR  zDeviceXPathSelector.long_click  s    
r   c                 B    | j                         }|j                         S )ztake element screenshot)r7  
screenshot)rm   r3  s     r   rT  zDeviceXPathSelector.screenshot  s    XXZ}}r   r   c                     |j                  d      rt        d|      t        t        |      st        d|      | j	                         }t        ||      S )z
        In IPython console, attr:_ipython_canary_method_should_not_exist_ will be called
        So here ignore all attr startswith _
        r   zInvalid attr)rQ   AttributeErrorr   r1  r7  getattr)rm   r   r3  s      r   __getattr__zDeviceXPathSelector.__getattr__  sM    
 >># 55'- 55XXZr3r   r=   )r   r   )r   r1  )'r   r   r   r
   r0   r   r   r   rz   r   ry   r#  rq   r
  r   boolr+  r   r   r.  r0  r   rx   r   r7  r   r:  r>  r6  r   rE  rL  r   rP  rR  r   rT  rX  r{   r|   s   @r   r   r   z  sI   2eC)9$9: 2J 2X`akXl 2] ##
XhsDy&9: 
   
.* .G(:. G$?Q:R G # # #%".
(3- 
(S (D )x 23 ) $
	:D  EKK 

 s 
 r   r   c                   .   e Zd Zdej                  fdZd Zd Zd Zdde	fdZ
d Zdd	ed
efdZddee   ded   fdZej&                  deeeeef   fd       Zedeeeeef   fd       Zed        Zedeeef   fd       Zedeeef   fd       Zy)r   elemc                     || _         y)zX
        Args:
            elem: lxml node
            d: uiautomator2 instance
        N)r[  )rm   r[  s     r   r   zXMLElement.__init__-  s     	r   c                 ,    t        | j                        S r=   )hashr[  r   s    r   __hash__zXMLElement.__hash__5  s    DIIr   c                 :    | j                         t        |      k(  S r=   )r_  r^  rp   s     r   __eq__zXMLElement.__eq__8  s    }}$u+--r   c                 x    | j                         \  }}dj                  | j                  j                  ||      S )Nz(<XMLElement [{tag!r} center:({x}, {y})]>)r   rJ  rK  )rG  r)   r[  r   rI  s      r   rl   zXMLElement.__repr__;  s9    {{}19@@		a A 
 	
r   strip_indexc                     | j                   j                         }|j                  | j                         }|rt        j                  dd|      }|S )zget element full xpathz\[\d+\]r"   )r[  getroottreegetpathr$   r%   )rm   rc  r   paths       r   	get_xpathzXMLElement.get_xpathA  s@    yy$$&||DII&66*b$/Dr   c                 &    | j                  dd      S )z-
        Returns:
            (x, y)
        r   )offsetr   s    r   rG  zXMLElement.centerI  s    
 {{3$$r   pxpyc                 h    | j                   \  }}}}|t        ||z        z   |t        ||z        z   fS )z
        Offset from left_top

        Args:
            px (float): percent of width
            py (float): percent of height

        Example:
            offset(0.5, 0.5) means center
        )rectr-  )rm   rk  rl  rJ  rK  widthheights          r   rj  zXMLElement.offsetP  s<     #ii1eV3urz?"AFRK(8$888r   NrH   r   r   c                    |#t        | j                  j                               S | j                  j                         }| j                  }g }|.||k7  r)|j	                  |       |j                         }|||k7  r)t        |      }|j                  |ddi      }|D cg c]  }|j                  |       }}t        |      D ]"  }|j                  |      |v st        |      c S  yc c}w )z(
        Returns parent element
        Nr$   r   r   )	r   r[  	getparentre  appendrY   rH   rf  reversed)rm   rH   r   eelsr   m	all_pathss           r   r  zXMLElement.parent^  s     =dii11344yy$$&IImT	JJqMA mT	 U#**t%KL  
 /66T\\!_6	6# 	%A||A)+!!}$	% 7s   "C-c                     | j                   j                  j                  d      }|syt        t        t        j                  d|            \  }}}}||||fS )zJ
        Returns:
            tuple of (left, top, right, bottom)
        bounds)r   r   r   r   z\d+)r[  r   r7  mapr-  r$   findall)rm   rz  lxlyrxrys         r   rz  zXMLElement.boundsu  sR     !!%%h/S"**VV"<=BBBBr   c                 <    | j                   \  }}}}||||z
  ||z
  fS )zN
        Returns:
            (left_top_x, left_top_y, width, height)
        )rz  )rm   r}  r~  r  r  s        r   rn  zXMLElement.rect  s,     BB2rBwR''r   c                 L    | j                   j                  j                  d      S )NrX   )r[  r   r7  r   s    r   rX   zXMLElement.text  s    yy##F++r   c                 @    t        | j                  j                        S r=   )dictr[  r   r   s    r   r   zXMLElement.attrib  s    DII$$%%r   c                 B   i }t        | j                        j                         D ]B  \  }}|dv r|dv r|dk(  |t        |      <   !|dk(  rt	        |      ||<   5||t        |      <   D t        | j                  j                               |d<   | j                  j                  |d<   | j                  \  }}}}||||d|d<   | j                  j                  d	      |d
<   | j                  j                  d      |d<   | j                  j                  d      |d<   |S )N)rz  r   packagecontent-desc)	checkablechecked	clickableenabled	focusablefocused
scrollablezlong-clickablepasswordselectedzvisible-to-usertrueindex
childCount	className)lefttoprightbottomrz  r  packageNamer  contentDescriptionzresource-idresourceName)r  r   itemsrG   r-  rS   r[  getchildrenr   rz  r7  )rm   retkr+   r}  r~  r  r  s           r   rH  zXMLElement.info  s   %++- 		2DAqBB R R01V)!,-gQA01)!,-		2  		 5 5 78L99==KBB!#BrJH "[[__Y7M$(KKOON$C !"kkoom<N
r   )F)        r  r=   )r   r   r   r   r   r   r_  ra  rl   rY  rh  rG  r   rj  r   r0   r
   r  rb   r   r	   r-  rz  r   rn  rX   r   r   r   rH  r   r   r   r   r   ,  s   U^^ .
T %9 9% 9%HSM %U;M5N %. 	 c3S01 	  	  (eCc3./ ( ( , , &S#X & & d38n  r   r   c            
            e Zd Zdedef fdZd Zd Zd Zdde	e
ef   defd	Ze
j                  fde	e
ef   d
efdZe
j                  dfdede
ded
e	d   fdZddee   fdZd Z xZS )r1  r3  r  c                 F    t         |   |j                         || _        y r=   )rd   r   r[  r  )rm   r3  r  ri   s      r   r   zDeviceXMLElement.__init__  s    !r   c                 v    | j                         \  }}| j                  j                  j                  ||       y)z:
        click element, 100ms between down and up
        N)rG  r  r   r   rI  s      r   r   zDeviceXMLElement.click  s+     {{}1a#r   c                 v    | j                         \  }}| j                  j                  j                  ||       y)zJ
        Sometime long click is needed, 400ms between down and up
        N)rG  r  r   rR  rI  s      r   rR  zDeviceXMLElement.long_click  s+     {{}1""1a(r   c                     | j                   j                  j                         }|j                  | j                        S )z,
        Take screenshot of element
        )r  r   rT  croprz  )rm   ims     r   rT  zDeviceXMLElement.screenshot  s-     \\__'')wwt{{##r   r   scalec                 Z    t        | j                  j                  | j                  ||      S )z
        Args:
            direction: one of ["left", "right", "up", "down"]
            scale: percent of swipe, range (0, 1.0)

        Raises:
            AssertionError, ValueError
        )r   r  r   rz  )rm   r   r  s      r   swipezDeviceXMLElement.swipe  s!     t||YNNr   r   c                    |dk(  rt         j                  }n|dk(  rt         j                  }t        | j	                  d      j                               }| j                  |d       t        | j	                  d      j                               |z
  }| j                         dz   }|D cg c]$  }|j                         j                  |      s#|& }}t        |      dkD  S c c}w )z
        Args:
            direction: Direction eg: Direction.FORWARD

        Returns:
            bool: if can be scroll again
        forwardbackwardz//*333333?)r  rK   r   )
r   r   r   r  r  rx   r  rh  rQ   rS   )rm   r   rv  new_elementsppathr3  s         r   scrollzDeviceXMLElement.scroll  s     	!!))I*$!**I$,,u%))+,

9C
( 4<<.2245; 3&(MbBLLN,E,Ee,LrMM3x!| Ns   )$C"C"r   rH   r   r   c                     |dkD  sJ | j                  |      }t        |      D ]3  }|j                  r|j                         c S | j	                  |      r3 y  y r   )r  r   r   r   r  r   s         r   r   zDeviceXMLElement.scroll_to  s_     A~~e$z" 	A}},,..;;y)	
 r   wsizec                     | j                   \  }}}}|xs$ | j                  j                  j                         \  }}||z  ||z  ||z  ||z  fS )z
        Args:
            wsize (tuple(int, int)): window size

        Returns:
            list of 4 float, eg: 0.1, 0.2, 0.5, 0.8
        )rz  r  r   window_size)rm   r  r}  r~  r  r  wwwhs           r   percent_boundszDeviceXMLElement.percent_bounds  sS     BB7$,,//557BRb"r'2733r   c                     | j                   j                  j                         \  }}| j                  \  }}}}||z  ||z  fS )zGReturns:
        (float, float): eg, (0.5, 0.5) means 50%, 50%
        )r  r   r  rn  )rm   r  r  r   whs         r   percent_sizezDeviceXMLElement.percent_size  sB     ,,.BYY
1aBBr   )r  r=   )r   r   r   r   r   r   r   rR  rT  r
   r   r0   r   r  r   rY  r  r-  r   r   r  r  r  r{   r|   s   @r   r1  r1    s    : z $)$	OuY^4 	OU 	O 9B8I8I in 5 d . 2;1B1BVX

%.
PS
	!	"

4HUO 
4 r   r1  ):
__future__r   r   r  enumrb   loggingr$   r   typingr   r   r   r   r   r	   r
   lxmlr   PILr   uiautomator2._protor   uiautomator2.abstractr   uiautomator2.exceptionsr   uiautomator2.utilsr   r   r   	getLoggerr   rU   	Exceptionr   r   r0   r'   r*   r/   r4   rY  r9   rG   rY   r7   rz   objectr   Enumr   ABCr   ry   r   r   r1  r   r   r   <module>r     sh   ' 
     	  D D D   ) : = G G			8	$	y 	' '
3 3 C C 
1sEz" 1u 1  
S 
S 
% % %P*C *26 60w^ w^tsDII 
sww L$ L\o - o d} }@Y z Y r   