
    &thI                         d 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 ddlmZ ddlmZmZ ddlmZmZ ddlmZ ddlmZ erdd	lmZmZ  ej        e          Z G d
 de          Zde	e         defdZ dS )zElement handle module.    N)AnyDictListOptionalTYPE_CHECKING)
CDPSession)ExecutionContextJSHandle)ElementHandleErrorNetworkError)
debugError)
merge_dict)FrameFrameManagerc                   <    e Zd ZdZdededededddd	f fd
Zd,dZ	de
d         fdZd-dZdeeef         fdZde
e         fdZdee         deeeef                  fdZd-dZd.dededd	fdZdedefdZd-dZd-dZd.dedededd	fdZd.dedededd	fdZde
eeef                  fdZde
e         fd Zd.dededefd!Zd"ede
d          fd#Z d"eded          fd$Z!d"ed%ed&edefd'Z"d"ed%ed&edefd(Z#e Z$e!Z%e"Z&e#Z'd)eded          fd*Z(e(Z)de*fd+Z+ xZ,S )/ElementHandlea  ElementHandle class.

    This class represents an in-page DOM element. ElementHandle can be created
    by the :meth:`pyppeteer.page.Page.querySelector` method.

    ElementHandle prevents DOM element from garbage collection unless the
    handle is disposed. ElementHandles are automatically disposed when their
    origin frame gets navigated.

    ElementHandle isinstance can be used as arguments in
    :meth:`pyppeteer.page.Page.querySelectorEval` and
    :meth:`pyppeteer.page.Page.evaluate` methods.
    contextclientremoteObjectpageframeManagerr   returnNc                     t                                          |||           || _        || _        || _        || _        d| _        d S )NF)super__init___client_remoteObject_page_frameManager	_disposed)selfr   r   r   r   r   	__class__s         l/var/www/html/mycamper/aliexpress-site/backend/venv/lib/python3.11/site-packages/pyppeteer/element_handle.pyr   zElementHandle.__init__(   sJ     	&,777)
)    c                     | S )zReturn this ElementHandle. r!   s    r#   	asElementzElementHandle.asElement2   s    r$   r   c                 <  K   | j                             dd| j                            d          i           d{V }|                    di           }t	          |                    d          t
                    sdS | j                            |d                   S )z|Return the content frame for the element handle.

        Return ``None`` if this handle is not referencing iframe.
        zDOM.describeNodeobjectIdNnodeframeId)r   sendr   get
isinstancestrr   frame)r!   nodeInfonode_objs      r#   contentFramezElementHandle.contentFrame6   s      
 **+=*..z::@
         <<++(,,y11377 	4!''(;<<<r$   c                    K   | j                             d| | j        j                   d {V }|rt	          |          d S )Na  
            async (element, pageJavascriptEnabled) => {
                if (!element.isConnected)
                    return 'Node is detached from document';
                if (element.nodeType !== Node.ELEMENT_NODE)
                    return 'Node is not of type HTMLElement';
                // force-scroll if page's javascript is disabled.
                if (!pageJavascriptEnabled) {
                    element.scrollIntoView({
                        block: 'center',
                        inline: 'center',
                        behavior: 'instant',
                    });
                    return false;
                }
                const visibleRatio = await new Promise(resolve => {
                    const observer = new IntersectionObserver(entries => {
                        resolve(entries[0].intersectionRatio);
                        observer.disconnect();
                    });
                    observer.observe(element);
                });
                if (visibleRatio !== 1.0)
                    element.scrollIntoView({
                        block: 'center',
                        inline: 'center',
                        behavior: 'instant',
                    });
                return false;
            })executionContextevaluater   _javascriptEnabledr   )r!   errors     r#   _scrollIntoViewIfNeededz%ElementHandle._scrollIntoViewIfNeededC   so      +44 6: 
5;7 7 7 7 7 7 7 7<  	,$U+++	, 	,r$   c                 \  K   d }	 | j                             dd| j                            d          i           d {V }n,# t          $ r}t          t          |           Y d }~nd }~ww xY w|r|                    d          st          d          g }|                    d          D ]?}|                     |          }t          |          dk    r|
                    |           @|st          d          |d         }d}d}|D ]}	||	d         z  }||	d         z  }|d	z  |d	z  d
S )NzDOM.getContentQuadsr*   quads0Node is either not visible or not an HTMLElement   r   xy   r?   r@   )r   r-   r   r.   	Exceptionr   loggerr   _fromProtocolQuad_computeQuadAreaappend)
r!   resulter<   _quad_qquadr?   r@   points
             r#   _clickablePointzElementHandle._clickablePointe   s     	"<,,-BD.22:>>E        FF  	" 	" 	"vq!!!!!!!!	"  	DVZZ00 	D$BD D D ZZ(( 	! 	!E''..B##a''R    	D$BD D D Qx 	 	EsOAsOAAUQ'''s   ;A 
A+A&&A+c                    K   	 | j                             dd| j                            d          i           d {V }n.# t          $ r!}t          t          |           d }Y d }~nd }~ww xY w|S )NzDOM.getBoxModelr*   )r   r-   r   r.   r   r   rD   )r!   rH   rI   s      r#   _getBoxModelzElementHandle._getBoxModel   s      	+/<+<+<!T/33J??@, , & & & & & &FF  	 	 	vq!!!FFFFFF	 s   ;A   
A+
A&&A+rL   c                     |d         |d         d|d         |d         d|d         |d         d|d         |d	         dgS )
Nr   r>   rB         rA            r&   )r!   rL   s     r#   rE   zElementHandle._fromProtocolQuad   sX    q'Q((q'Q((q'Q((q'Q((	
 	
r$   c                   K   |                                   d{V  |                                  d{V }|                    dd          }|                    dd          }| j        j                            ||           d{V  dS )zMove mouse over to center of this element.

        If needed, this method scrolls element into view. If this element is
        detached from DOM tree, the method raises an ``ElementHandleError``.
        Nr?   r   r@   )r:   rN   r.   r   mousemove)r!   objr?   r@   s       r#   hoverzElementHandle.hover   s       **,,,,,,,,,((********GGCOOGGCOOj##Aq)))))))))))r$   optionskwargsc                 8  K   t          ||          }|                                  d{V  |                                  d{V }|                    dd          }|                    dd          }| j        j                            |||           d{V  dS )a  Click the center of this element.

        If needed, this method scrolls element into view. If the element is
        detached from DOM, the method raises ``ElementHandleError``.

        ``options`` can contain the following fields:

        * ``button`` (str): ``left``, ``right``, of ``middle``, defaults to
          ``left``.
        * ``clickCount`` (int): Defaults to 1.
        * ``delay`` (int|float): Time to wait between ``mousedown`` and
          ``mouseup`` in milliseconds. Defaults to 0.
        Nr?   r   r@   )r   r:   rN   r.   r   rX   click)r!   r\   r]   rZ   r?   r@   s         r#   r_   zElementHandle.click   s       Wf--**,,,,,,,,,((********GGCOOGGCOOj$$Q733333333333r$   	filePathsc                    K   d |D             }| j                             d          }| j                            d||d           d{V S )zUpload files.c                 L    g | ]!}t           j                            |          "S r&   )ospathabspath).0ps     r#   
<listcomp>z,ElementHandle.uploadFile.<locals>.<listcomp>   s&    777##777r$   r*   zDOM.setFileInputFiles)r*   filesN)r   r.   r   r-   )r!   r`   ri   r*   s       r#   
uploadFilezElementHandle.uploadFile   su      77Y777%))*55\&&#!E22
 
 
 
 
 
 
 
 	
r$   c                   K   |                                   d{V  |                                  d{V }|                    dd          }|                    dd          }| j        j                            ||           d{V  dS )zTap the center of this element.

        If needed, this method scrolls element into view. If the element is
        detached from DOM, the method raises ``ElementHandleError``.
        Nr?   r   r@   )r:   rN   r.   r   touchscreentap)r!   centerr?   r@   s       r#   rm   zElementHandle.tap   s       **,,,,,,,,,++--------JJsAJJsAj$((A...........r$   c                 L   K   | j                             d|            d{V  dS )zFocus on this element.zelement => element.focus()Nr6   r7   r'   s    r#   focuszElementHandle.focus   sN      #,,($0 0 	0 	0 	0 	0 	0 	0 	0 	0 	0r$   textc                    K   t          ||          }|                                  d{V  | j        j                            ||           d{V  dS )zqFocus the element and then type text.

        Details see :meth:`pyppeteer.input.Keyboard.type` method.
        N)r   rq   r   keyboardtype)r!   rr   r\   r]   s       r#   ru   zElementHandle.type   sj       Wf--jjllj!&&tW55555555555r$   keyc                    K   t          ||          }|                                  d{V  | j        j                            ||           d{V  dS )a  Press ``key`` onto the element.

        This method focuses the element, and then uses
        :meth:`pyppeteer.input.keyboard.down` and
        :meth:`pyppeteer.input.keyboard.up`.

        :arg str key: Name of key to press, such as ``ArrowLeft``.

        This method accepts the following options:

        * ``text`` (str): If specified, generates an input event with this
          text.
        * ``delay`` (int|float): Time to wait between ``keydown`` and
          ``keyup``. Defaults to 0.
        N)r   rq   r   rt   press)r!   rv   r\   r]   s       r#   rx   zElementHandle.press   sj      " Wf--jjllj!''W55555555555r$   c                   K   |                                   d{V }|sdS |d         d         }t          |d         |d         |d         |d                   }t          |d         |d	         |d
         |d                   }t          |d         |d         |d         |d                   |z
  }t          |d         |d	         |d
         |d                   |z
  }||||dS )a  Return bounding box of this element.

        If the element is not visible, return ``None``.

        This method returns dictionary of bounding box, which contains:

        * ``x`` (int): The X coordinate of the element in pixels.
        * ``y`` (int): The Y coordinate of the element in pixels.
        * ``width`` (int): The width of the element in pixels.
        * ``height`` (int): The height of the element in pixels.
        Nmodelborderr   rR   rA   rU   r>   rS   rT   rV   )r?   r@   widthheight)rP   minmax)r!   rH   rL   r?   r@   r|   r}   s          r#   boundingBoxzElementHandle.boundingBox   s       ((******** 	4gx(Qa$q'4733Qa$q'4733DGT!Wd1gtAw77!;T!Wd1gtAwQ881<Q&AAAr$   c                   K   |                                   d{V }|sdS |                    di           }|                     |                    d                    |                     |                    d                    |                     |                    d                    |                     |                    d                    |                    d          |                    d          d	S )
a8  Return boxes of element.

        Return ``None`` if element is not visible. Boxes are represented as an
        list of points; each Point is a dictionary ``{x, y}``. Box points are
        sorted clock-wise.

        Returned value is a dictionary with the following fields:

        * ``content`` (List[Dict]): Content box.
        * ``padding`` (List[Dict]): Padding box.
        * ``border`` (List[Dict]): Border box.
        * ``margin`` (List[Dict]): Margin box.
        * ``width`` (int): Element's width.
        * ``height`` (int): Element's height.
        Nrz   contentpaddingr{   marginr|   r}   )r   r   r{   r   r|   r}   )rP   r.   rE   )r!   rH   rz   s      r#   boxModelzElementHandle.boxModel  s        ((******** 	4

7B''--eii	.B.BCC--eii	.B.BCC,,UYYx-@-@AA,,UYYx-@-@AAYYw''ii))
 
 	
r$   c                 v  K   t          ||          }d}|                                  d{V }|st          d          t          j        | j        j                  }|d         |d         k    s|d         |d         k    rt          |d         t          j	        |d                             t          |d         t          j	        |d                             d}t          j        |          }|
                    |           | j                            |           d{V  d}|                                  d{V  |                                  d{V }|st          d          | j                            d           d{V }|d	         d
         }	|d	         d         }
i }|
                    |           |d         |	z   |d<   |d         |
z   |d<   d|i}|
                    |           | j                            |           d{V }|r | j                            |           d{V  |S )zTake a screenshot of this element.

        If the element is detached from DOM, this method raises an
        ``ElementHandleError``.

        Available options are same as :meth:`pyppeteer.page.Page.screenshot`.
        FNr=   r|   r}   )r|   r}   TzPage.getLayoutMetricslayoutViewportpageXpageYr?   r@   clip)r   r   r   copydeepcopyr   viewportr   mathceilupdatesetViewportr:   r   r-   
screenshot)r!   r\   r]   needsViewportResetr   original_viewportnewViewportnew_viewport_objr   r   r   opt	imageDatas                 r#   r   zElementHandle.screenshot'  s      Wf--" ,,........ 	D$BD D D !M$**=>> #4W#===H%(9((CCC%g.Ik'233  %h/Ik(344 	 	K  =):;;L,,,*((666666666!%**,,,,,,,,, ,,........ 	D$BD D D \&&'>????????%&w/%&w/K   I%S	I%S	tn

7*//44444444	 	<*(():;;;;;;;;;r$   selectorc                    K   | j                             d| |           d{V }|                                }|r|S |                                 d{V  dS )zReturn first element which matches ``selector`` under this element.

        If no element matches the ``selector``, returns ``None``.
        z6(element, selector) => element.querySelector(selector)N)r6   evaluateHandler(   dispose)r!   r   handleelements       r#   querySelectorzElementHandle.querySelectora  s      
 ,;;D(
 
 
 
 
 
 
 
 ""$$ 	Nnntr$   c                 >  K   | j                             d| |           d{V }|                                 d{V }|                                 d{V  g }|                                D ]-}|                                }|r|                    |           .|S )zReturn all elements which match ``selector`` under this element.

        If no element matches the ``selector``, returns empty list (``[]``).
        z9(element, selector) => element.querySelectorAll(selector)Nr6   r   getPropertiesr   valuesr(   rG   )r!   r   arrayHandle
propertiesrH   propelementHandles          r#   querySelectorAllzElementHandle.querySelectorAllp  s      
 !1@@G(
 
 
 
 
 
 
 
 '4466666666
!!#########%%'' 	- 	-D NN,,M -m,,,r$   pageFunctionargsc                    K   |                      |           d{V }|st          d| d           | j        j        ||g|R   d{V }|                                 d{V  |S )a  Run ``Page.querySelectorEval`` within the element.

        This method runs ``document.querySelector`` within the element and
        passes it as the first argument to ``pageFunction``. If there is no
        element matching ``selector``, the method raises
        ``ElementHandleError``.

        If ``pageFunction`` returns a promise, then wait for the promise to
        resolve and return its value.

        ``ElementHandle.Jeval`` is a shortcut of this method.

        Example:

        .. code:: python

            tweetHandle = await page.querySelector('.tweet')
            assert (await tweetHandle.querySelectorEval('.like', 'node => node.innerText')) == 100
            assert (await tweetHandle.Jeval('.retweets', 'node => node.innerText')) == 10
        Nz1Error: failed to find element matching selector "")r   r   r6   r7   r   )r!   r   r   r   r   rH   s         r#   querySelectorEvalzElementHandle.querySelectorEval  s      , #00:::::::: 	$OHOOO   6t,5-0*.0 0 0 0 0 0 0 0 0##%%%%%%%%%r$   c                    K   | j                             d| |           d{V } | j         j        ||g|R   d{V }|                                 d{V  |S )a+  Run ``Page.querySelectorAllEval`` within the element.

        This method runs ``Array.from(document.querySelectorAll)`` within the
        element and passes it as the first argument to ``pageFunction``. If
        there is no element matching ``selector``, the method raises
        ``ElementHandleError``.

        If ``pageFunction`` returns a promise, then wait for the promise to
        resolve and return its value.

        Example:

        .. code:: html

            <div class="feed">
                <div class="tweet">Hello!</div>
                <div class="tweet">Hi!</div>
            </div>

        .. code:: python

            feedHandle = await page.J('.feed')
            assert (await feedHandle.JJeval('.tweet', '(nodes => nodes.map(n => n.innerText))')) == ['Hello!', 'Hi!']
        zE(element, selector) => Array.from(element.querySelectorAll(selector))N)r6   r   r7   r   )r!   r   r   r   r   rH   s         r#   querySelectorAllEvalz"ElementHandle.querySelectorAllEval  s      4 !1@@S(
 
 
 
 
 
 
 
 6t,5+.(,. . . . . . . . .!!#########r$   
expressionc                 >  K   | j                             d| |           d{V }|                                 d{V }|                                 d{V  g }|                                D ]-}|                                }|r|                    |           .|S )zEvaluate the XPath expression relative to this elementHandle.

        If there are no such elements, return an empty list.

        :arg str expression: XPath string to be evaluated.
        a  (element, expression) => {
                const document = element.ownerDocument || element;
                const iterator = document.evaluate(expression, element, null,
                    XPathResult.ORDERED_NODE_ITERATOR_TYPE);
                const array = [];
                let item;
                while ((item = iterator.iterateNext()))
                    array.push(item);
                return array;

            }Nr   )r!   r   r   r   rH   propertyr   s          r#   xpathzElementHandle.xpath  s       !1@@
 
$ $ $ $ $ $ $ $ '4466666666
!!#########"))++ 	- 	-H$..00M -m,,,r$   c                 H   K   | j                             d|            d{V S )z:Return ``True`` if the element is visible in the viewport.a}  async element => {
            const visibleRatio = await new Promise(resolve => {
                const observer = new IntersectionObserver(entries => {
                    resolve(entries[0].intersectionRatio);
                    observer.disconnect();
                });
                observer.observe(element);
            });
            return visibleRatio > 0;
        }Nrp   r'   s    r#   isIntersectingViewportz$ElementHandle.isIntersectingViewport  sI      *33 	5 	 	 	 	 	 	 	 	 		r$   )r   r   )r   N)N)-__name__
__module____qualname____doc__r	   r   dictr   r   r(   r   r4   r:   r   r0   floatrN   rP   r   intrE   r[   r_   rj   rm   rq   ru   rx   r   r   bytesr   r   r   r   r   JJJJevalJJevalr   Jxboolr   __classcell__)r"   s   @r#   r   r      s         0 * #+.-26        =HW$5 = = = = ,  ,  ,  ,D(tCJ'7 ( ( ( (<	HTN 	 	 	 	
d3i 
Dc3h4H 
 
 
 

* 
* 
* 
*4 44 4# 4$ 4 4 4 4*
3 
4 
 
 
 

/ 
/ 
/ 
/0 0 0 0
6 6s 6T 6C 66 6 6 66 6s 6T 6C 66 6 6 6*B8De,<#= B B B B0
 
 
 
 
>8 8 8s 8u 8 8 8 8tC H_4M    s tO7L    $ 3 '*/2   @!3 !c !*-!25! ! ! !H 	A	BE!Fc d?.C    : 
Bd        r$   r   rL   r   c                     d}t          |           D ]Q\  }}| |         }| |dz   t          |           z           }||d         |d         z  |d         |d         z  z
  dz  z  }R|S )Nr   r>   r?   r@   rR   )	enumeratelen)rL   areai_p1p2s         r#   rF   rF     sw    D$ < <1!W1q5CII%&C2c7"RWr#w%66!;;Kr$   )!r   r   loggingr   os.pathrc   typingr   r   r   r   r   pyppeteer.connectionr   pyppeteer.execution_contextr	   r
   pyppeteer.errorsr   r   pyppeteer.helperr   pyppeteer.utilr   pyppeteer.frame_managerr   r   	getLoggerr   rD   r   r   rF   r&   r$   r#   <module>r      sX         ; ; ; ; ; ; ; ; ; ; ; ; ; ; + + + + + + B B B B B B B B = = = = = = = = ' ' ' ' ' ' % % % % % % <;;;;;;;; 
	8	$	$_ _ _ _ _H _ _ _D4: %      r$   