
    >ip5                      U 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
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mZmZmZmZmZmZmZmZ d dlZd dlm 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,m-Z- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3 d dl4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZD d dlEmFZF d dlGmHZHmIZImJZJ d dlKmLZL d dlMmNZNmOZO d dlPmQZQmRZR d dlSmTZT d dlUmVZV d dlWmXZXmYZY d dlZm[Z[m\Z\m]Z] d dl^m_Z_ d dl`maZa d dlbmcZcmdZd d dlemfZfmgZgmhZhmiZimjZj erxd dlkmlZl d dlmmnZn d dlompZpmqZq d d lrmsZsmtZt d d!lumvZvmwZwmxZx d d"lymzZzm{Z{m|Z| d d#l}m~Z~ d d$lmZ d d%lmZ d d&lSmZmZmZmZ d d'lUmZ d d(lmZmZmZmZmZ d d)lZm[Z[m\Z\ d d$lmZ d d*lmZmZ  ej&                  e      Zd+Zd,ed-<    ed.d/0      Zd1Zd2e d3Zd4Z G d5 d+e/      Z G d6 d7      Zy)8    )annotationsN)asynccontextmanager)partial)Path)mkdtemp)TYPE_CHECKINGAnyAsyncGenerator	AwaitableCallableOptional	TypeAliasTypeVarUnioncastoverload)Request)DomCommandsFetchCommandsNetworkCommandsPageCommandsRuntimeCommandsStorageCommandsTargetCommands)ConnectionHandler)ByPageLoadState)FindElementsMixin)
ShadowRoot)
WebElement)CommandExecutionTimeoutDownloadTimeoutIFrameNotFoundInvalidFileExtensionInvalidIFrameInvalidScriptWithElementInvalidTabInitializationMissingScreenshotPathNavigationErrorNetworkEventsNotEnabledNoDialogPresentNotAnIFramePageLoadTimeoutTopLevelTargetRequiredWaitElementTimeoutWebSocketConnectionClosed)ExtractionEngine)KeyboardAPIMouseAPI	ScrollAPI)IFrameContext)DownloadBehaviorDownloadProgressState)NodeShadowRootType)ResourceType)	PageEvent)FrameResourceTreeScreenshotFormat)CallFunctionOnResponseEvaluateResponseSerializationOptions)CallArgument)
TargetInfo)decode_base64_to_byteshas_return_outside_function)build_asset_filenamecollect_frame_resourcesfilter_fetchable_resourcesinline_all_assetsrewrite_html_urls)Browser)ExtractionModel)EmptyResponseResponse)DownloadProgressEventDownloadWillBeginEvent)DescribeNodeResponseGetDocumentResponseResolveNodeResponse)AuthChallengeResponseTypeHeaderEntryRequestStage)RequestWillBeSentEvent)GetCookiesResponse)GetResponseBodyResponse)CookieCookieParamErrorReasonRequestMethod)FileChooserOpenedEvent)CaptureScreenshotResponseGetResourceContentResponseGetResourceTreeResponseNavigateResponsePrintToPDFResponse)r>   r?   )AttachToTargetResponseGetTargetsResponseTabr   IFrameTrK   )boundzchallenges.cloudflare.comziframe[src*="z"]z	span.cb-ic                  $   e Zd ZdZ	 	 	 	 dX	 	 	 	 	 	 	 	 	 dYdZedZd       ZedZd       ZedZd       ZedZd       Z	edZd       Z
ed[d	       Zed\d
       Zed]d       Zed^d       Zed_d       Zddd	 	 	 	 	 	 	 d`dZddd	 	 	 	 	 	 	 	 	 dadZedZd       Zedbd       Zedbd       Zedbd       Zd Zd Z	 	 	 dc	 	 	 	 	 dddZd Zd Zd Z	 	 	 de	 	 	 	 	 dfdZd Zd Zd  Zd! Z d" Z!d# Z"d$ Z#d% Z$dgd&Z%dhdid'Z&djd(Z'dkd)Z(dld*Z)	 	 	 	 	 	 dmd+Z*	 	 	 	 	 	 	 	 	 	 	 	 dnd,Z+	 	 	 	 	 	 	 	 dod-Z,e-dpd.       Z.d/ Z/dqd0Z0drd1Z1dsdtd2Z2dud3Z3d4 Z4dvdwd5Z5	 	 dx	 	 	 dyd6Z6	 	 	 	 dz	 	 	 	 	 	 	 	 	 d{d7Z7	 	 	 	 	 	 d|	 	 	 	 	 	 	 	 	 	 	 	 	 d}d8Z8d~dd9Z9dd:Z:	 	 	 	 	 	 dd;Z;dZd<Z<dbd=Z=dsdd>Z>e?dddddddddddddddd?	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd@       Z@e?ddddddddddddA	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddB       Z@	 dsddddddddddddddddddC	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddDZ@	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddEZAddFZB	 	 	 d	 	 	 	 	 	 	 	 	 ddGZC	 	 d	 	 	 	 	 	 	 ddHZDeE	 	 	 	 ddI       ZFeE	 	 	 de	 	 	 	 	 	 	 ddJ       ZGeE	 	 d	 	 	 	 	 ddK       ZH	 	 	 	 	 	 	 	 	 	 	 	 ddLZIe?	 d~	 	 	 	 	 	 	 ddM       ZJe?	 d~	 	 	 	 	 	 	 ddN       ZJ	 d~	 ddOZJddPZKdQ ZLddRZMe-dddddddddddddddd?	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddS       ZNe-ddT       ZOePj                  eRj                  ePj                  eRj                  iZVeEdvddU       ZWddVZX	 d	 	 	 	 	 ddWZYy)re   a  
    Controls a browser tab via Chrome DevTools Protocol.

    Primary interface for web page automation including navigation, DOM manipulation,
    JavaScript execution, event handling, network monitoring, and specialized tasks
    like Cloudflare bypass.
    Nc           
        t        |||g      s
t               || _        || _        || _        || _        || _        | j                         | _        d| _	        d| _
        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        t'        |       | _        d| _        t,        j/                  d| j                   dt1        | j
                         d| j                   d| j                          y)a{  
        Initialize tab controller for existing browser tab.

        Args:
            browser: Browser instance that created this tab.
            connection_port: CDP WebSocket port.
            target_id: CDP target identifier for this tab.
            browser_context_id: Optional browser context ID.
            ws_address: Optional WebSocket address for this tab.
        FNzTab initialized: target_id=z, ws_address_set=z, context_id=z, port=)anyr'   _browser_connection_port
_target_id_ws_address_browser_context_id_get_connection_handler_connection_handler_page_events_enabled_network_events_enabled_fetch_events_enabled_dom_events_enabled_runtime_events_enabled&_intercept_file_chooser_dialog_enabled_cloudflare_captcha_callback_id_request_scroll	_keyboardr3   _mouse_extraction_engineloggerdebugbool)selfbrowserconnection_port	target_idbrowser_context_id
ws_addresss         X/var/www/python/tenders/Scrapper/venv/lib/python3.12/site-packages/pydoll/browser/tab.py__init__zTab.__init__   s   $ OY
;<*,, /#%#5 #'#?#?#A $)!',$%*"#( ',$6;3>B,+/,004 (>B-doo-> ?""&t'7'7"8!9 :"667wt?T?T>UW	
    c                    | j                   S )z+Whether CDP Page domain events are enabled.)rs   r   s    r   page_events_enabledzTab.page_events_enabled   s     (((r   c                    | j                   S )z.Whether CDP Network domain events are enabled.)rt   r   s    r   network_events_enabledzTab.network_events_enabled        +++r   c                    | j                   S )zCWhether CDP Fetch domain events (request interception) are enabled.)ru   r   s    r   fetch_events_enabledzTab.fetch_events_enabled   s     )))r   c                    | j                   S )z*Whether CDP DOM domain events are enabled.)rv   r   s    r   dom_events_enabledzTab.dom_events_enabled   s     '''r   c                    | j                   S )z.Whether CDP Runtime domain events are enabled.)rw   r   s    r   runtime_events_enabledzTab.runtime_events_enabled   r   r   c                R    | j                   t        |       | _         | j                   S )z
        Get the request object for making HTTP requests using the browser's fetch API.

        Returns:
            Request: An instance of the Request class for making HTTP requests.
        )rz   r   r   s    r   requestzTab.request   s#     == #DMDM}}r   c                R    | j                   t        |       | _         | j                   S )z
        Get the scroll API for controlling page scroll behavior.

        Returns:
            ScrollAPI: An instance of the ScrollAPI class for scroll operations.
        )r{   r4   r   s    r   scrollz
Tab.scroll   s#     <<$T?DL||r   c                R    | j                   t        |       | _         | j                   S )z
        Get the keyboard API for controlling keyboard input at page level.

        Returns:
            KeyboardAPI: An instance of the KeyboardAPI class for keyboard operations.
        )r|   r2   r   s    r   keyboardzTab.keyboard   s$     >>!(.DN~~r   c                    | j                   S )z
        Get the mouse API for controlling mouse input.

        Returns:
            MouseAPI: An instance of the MouseAPI class for mouse operations.
        )r}   r   s    r   mousez	Tab.mouse   s     {{r   c                R    | j                   t        |       | _         | j                   S )z#Lazy-initialized extraction engine.)r~   r1   r   s    r   
_extractorzTab._extractor  s)     ""*&6t&<D#&&&r   r   scopetimeoutc               Z   K   | j                   j                  |||       d{   S 7 w)a  Extract structured data from the page into a typed model.

        Args:
            model: ExtractionModel subclass defining the extraction schema.
            scope: Optional CSS/XPath selector to limit extraction region.
            timeout: Seconds to wait for elements (0 = no wait).

        Returns:
            Populated model instance with extracted data.

        Raises:
            FieldExtractionFailed: If a required field cannot be extracted.
            InvalidExtractionModel: If model definition is invalid.
        r   N)r   extract)r   modelr   r   s       r   r   zTab.extract  s*     * __,,U%,QQQQs   "+)+)r   limitc               \   K   | j                   j                  ||||       d{   S 7 w)aA  Extract multiple items from repeated containers on the page.

        Each element matching the scope selector generates one model instance.
        Fields are resolved relative to each scope container.

        Args:
            model: ExtractionModel subclass defining the extraction schema.
            scope: CSS/XPath selector for the repeated container (required).
            timeout: Seconds to wait for elements (0 = no wait).
            limit: Maximum number of items to extract (None = all).

        Returns:
            List of populated model instances.
        )r   r   r   N)r   extract_all)r   r   r   r   r   s        r   r   zTab.extract_all&  s-     , __00eW\a0bbbbs   #,*,c                    | j                   S )z3Whether file chooser dialog interception is active.)rx   r   s    r   %intercept_file_chooser_dialog_enabledz)Tab.intercept_file_chooser_dialog_enabled>  s     :::r   c                |   K   | j                  t        j                  d             d{   }|d   d   d   S 7 w)zEGet current page URL (reflects redirects and client-side navigation).zwindow.location.hrefNresultvalue_execute_commandr   evaluater   responses     r   current_urlzTab.current_urlC  sH      ,0+@+@$$%;<,
 &
 !(+G44&
   (<:<c                |   K   | j                  t        j                  d             d{   }|d   d   d   S 7 w)z:Get complete HTML source of current page (live DOM state).z"document.documentElement.outerHTMLNr   r   r   r   s     r   page_sourcezTab.page_sourceK  sH      ,0+@+@$$%IJ,
 &
 !(+G44&
r   c                   K   | j                  t        j                  d             d{   }|d   d   j                  dd      S 7 w)zGet current page title.zdocument.titleNr   r    )r   r   r   getr   s     r   titlez	Tab.titleS  sP      ,0+@+@$$%56,
 &
 !(+//<<&
s   (A	AA	c                   K   t         j                  d       | j                  t        j                                d{   }d| _        t         j                  d       |S 7 "w)z@Enable CDP Page domain events (load, navigation, dialogs, etc.).zEnabling Page eventsNTzPage events enabled)r   r   r   r   enablers   r   s     r   enable_page_eventszTab.enable_page_events[  sO     +,..|/B/B/DEE$(!*+ F   <A#A!#A#c                   K   t         j                  d       | j                  t        j                                d{   }d| _        t         j                  d       |S 7 "w)z=Enable CDP Network domain events (requests, responses, etc.).zEnabling Network eventsNTzNetwork events enabled)r   r   r   r   r   rt   r   s     r   enable_network_eventszTab.enable_network_eventsc  O     ./../E/E/GHH'+$-. Ir   c                   K   t         j                  d| d| d|        | j                  t        j                  |||             d{   }d| _        t         j                  d       |S 7 "w)al  
        Enable CDP Fetch domain for request interception.

        Args:
            handle_auth: Intercept authentication challenges.
            resource_type: Filter by resource type (all if None).
            request_stage: When to intercept (Request/Response).

        Note:
            Intercepted requests must be explicitly continued or timeout.
        z#Enabling Fetch events: handle_auth=z, resource_type=z, stage=)handle_auth_requestsresource_typerequest_stageNTzFetch events enabled)r   r   r   r   r   ru   )r   handle_authr   r   r   s        r   enable_fetch_eventszTab.enable_fetch_eventsk  s     " 	1+>N}o ^"O%	
 372G2G  %0++3
 -
 &*"+,-
s   A	A0A.#A0c                   K   t         j                  d       | j                  t        j                                d{   }d| _        t         j                  d       |S 7 "w)z:Enable CDP DOM domain events (document structure changes).zEnabling DOM eventsNTzDOM events enabled)r   r   r   r   r   rv   r   s     r   enable_dom_eventszTab.enable_dom_events  sO     *+..{/A/A/CDD#' )* Er   c                   K   t         j                  d       | j                  t        j                                d{   }d| _        t         j                  d       |S 7 "w)z!Enable CDP Runtime domain events.zEnabling Runtime eventsNTzRuntime events enabled)r   r   r   r   r   rw   r   s     r   enable_runtime_eventszTab.enable_runtime_events  r   r   c                   K   t         j                  d       | j                  t        j                  d             d{   }d| _        t         j                  d       |S 7 "w)z
        Enable file chooser dialog interception for automated uploads.

        Note:
            Use expect_file_chooser context manager for convenience.
        z"Enabling file chooser interceptionTNz!File chooser interception enabledr   infor   r   !set_intercept_file_chooser_dialogrx   r   r   s     r   $enable_intercept_file_chooser_dialogz(Tab.enable_intercept_file_chooser_dialog  sT      	89..|/]/]^b/cdd6:389 e   =A$A" #A$c                  K   |t        j                  dt        d       |t        j                  dt        d       t        j	                  d       | j
                  s| j                          d{    t        | j                  |      }| j                  t        j                  |       d{   | _        t        j                  d| j                          y7 k7 .w)	u  
        Enable automatic Cloudflare Turnstile captcha bypass.

        Args:
            custom_selector: Deprecated — ignored. Cloudflare Turnstile is now
                detected automatically via shadow root inspection.
            time_before_click: Deprecated — ignored. The checkbox is now
                located via shadow root polling and clicked immediately.
            time_to_wait_captcha: Timeout for captcha detection (default 5s).
        Nycustom_selector is deprecated and ignored. Cloudflare Turnstile is now detected automatically via shadow root inspection.   
stacklevelytime_before_click is deprecated and ignored. The checkbox is now located via shadow root polling and clicked immediately.z&Enabling Cloudflare captcha auto-solvetime_to_wait_captchaz.Cloudflare auto-solve callback registered: id=)warningswarnDeprecationWarningr   r   r   r   r   _bypass_cloudflareonr;   LOAD_EVENT_FIREDry   r   )r   custom_selectortime_before_clickr   callbacks        r   $enable_auto_solve_cloudflare_captchaz(Tab.enable_auto_solve_cloudflare_captcha  s       &MME"	 (MMK"	 	<=''))+++##!5

 6:WWY=W=WYa5b/b,<T=a=a<bc	
 , 0cs$   A1C#3C4>C#2C!3-C#!C#c                   K   t         j                  d       | j                  t        j                                d{   }d| _        t         j                  d       |S 7 "w)z5Disable CDP Fetch domain and release paused requests.zDisabling Fetch eventsNFzFetch events disabled)r   r   r   r   disableru   r   s     r   disable_fetch_eventszTab.disable_fetch_events  sO     -...}/D/D/FGG%*",- Hr   c                   K   t         j                  d       | j                  t        j                                d{   }d| _        t         j                  d       |S 7 "w)zDisable CDP Page domain events.zDisabling Page eventsNFzPage events disabled)r   r   r   r   r   rs   r   s     r   disable_page_eventszTab.disable_page_events  sO     ,-..|/C/C/EFF$)!+, Gr   c                   K   t         j                  d       | j                  t        j                                d{   }d| _        t         j                  d       |S 7 "w)z"Disable CDP Network domain events.zDisabling Network eventsNFzNetwork events disabled)r   r   r   r   r   rt   r   s     r   disable_network_eventszTab.disable_network_events  O     /0../F/F/HII',$./ Jr   c                   K   t         j                  d       | j                  t        j                                d{   }d| _        t         j                  d       |S 7 "w)zDisable CDP DOM domain events.zDisabling DOM eventsNFzDOM events disabled)r   r   r   r   r   rv   r   s     r   disable_dom_eventszTab.disable_dom_events  sO     +,..{/B/B/DEE#( *+ Fr   c                   K   t         j                  d       | j                  t        j                                d{   }d| _        t         j                  d       |S 7 "w)z"Disable CDP Runtime domain events.zDisabling Runtime eventsNFzRuntime events disabled)r   r   r   r   r   rw   r   s     r   disable_runtime_eventszTab.disable_runtime_events  r   r   c                   K   t         j                  d       | j                  t        j                  d             d{   }d| _        t         j                  d       |S 7 "w)z)Disable file chooser dialog interception.z#Disabling file chooser interceptionFNz"File chooser interception disabledr   r   s     r   %disable_intercept_file_chooser_dialogz)Tab.disable_intercept_file_chooser_dialog  sW     9:..::5A
 
 7<39:
r   c                   K   t         j                  d       | j                  j                  | j                         d{    d| _        y7 w)z6Disable automatic Cloudflare Turnstile captcha bypass.z'Disabling Cloudflare captcha auto-solveN)r   r   rr   remove_callbackry   r   s    r   %disable_auto_solve_cloudflare_captchaz)Tab.disable_auto_solve_cloudflare_captcha  sA     =>&&66t7[7[\\\/3, 	]s   >A AAc                4  K   t         j                  d| j                          | j                  t	        j
                                d{   }| j                  j                  j                  | j                         t         j                  d       |S 7 Jw)z|
        Close this browser tab.

        Note:
            Tab instance becomes invalid after calling this method.
        zClosing tab: target_id=Nz,Tab closed and removed from browser registry)
r   r   rn   r   r   closerl   _tabs_openedpopr   )r   r   s     r   r   z	Tab.close  sq      	-doo->?@,,\-?-?-ABB""&&t7CD Cs   A	BBABc                  K   t        j                  dt        d       t        j	                  d|j
                          |j
                  dk(  st        |j                  d      t        j	                  d        st        d      | j                  j                          d	{   }t        fd
|D        d	      }|st        d      |d   }|| j                  j                  v r1t        j	                  d|        | j                  j                  |   S t        | j                  || j                        }|| j                  j                  |<   t        j	                  d|        |S 7 ɭw)a4  
        .. deprecated:: ?.?.?
            Use iframe `WebElement` instances directly; this method will be removed in
            a future version.

        Get Tab object for interacting with iframe content.

        Args:
            frame: Tab representing the iframe tag.

        Returns:
            Tab instance configured for iframe interaction.

        Raises:
            NotAnIFrame: If element is not an iframe.
            InvalidIFrame: If iframe lacks valid src attribute.
            IFrameNotFound: If iframe target not found in browser.
        zqTab.get_frame() is deprecated and will be removed in a future version. Interact with iframe WebElements directly.r   r   zResolving iframe: tag=iframesrczIframe src resolved: z.The iframe does not have a valid src attributeNc              3  4   K   | ]  }|d    k(  s|  yw)urlN ).0target	frame_urls     r   	<genexpr>z Tab.get_frame.<locals>.<genexpr>>  s     YfUmy>XfYs   z'The target for the iframe was not foundtargetIdzIframe tab already tracked: )r   r   z#Iframe tab created and registered: )r   r   r   r   r   tag_namer,   get_attributer%   rl   get_targetsnextr#   r   re   rm   )r   frametargetsiframe_targetr   tabr  s         @r   	get_framezTab.get_frame  sM    & 	9		
 	-enn-=>?~~)''.	,YK89 PQQ1133Y7Y[_` !JKK!*-	222LL7	{CD==--i88MM 11

 14""9-:9+FG
# 4s   B'E6*E4+C
E6c                  K   t         j                  d|       |s| j                  |       d{   S t        j                         j                         }	 | j                  |       d{   }|r|S t        j                         j                         |z
  |kD  rt        d| d      t        j                  d       d{    r7 7 _7 	w)a  
        Find all shadow roots in the page.

        Traverses the entire DOM tree (including iframes and nested shadow DOMs)
        to collect all shadow roots found. This is especially useful when the
        shadow host element selector is unknown or dynamic (e.g., Cloudflare
        challenge pages).

        Args:
            deep: If True, also traverses cross-origin iframes (OOPIFs) to
                discover shadow roots inside them. The returned ShadowRoot
                objects will automatically route CDP commands through the
                correct OOPIF session.
            timeout: Maximum seconds to wait for shadow roots to appear.
                When > 0, repeatedly polls the DOM (every 0.5s) until at least
                one shadow root is found or the timeout expires. Useful when
                shadow hosts are injected asynchronously (e.g., Cloudflare
                Turnstile loading inside an OOPIF).

        Returns:
            List of ShadowRoot instances found in the page.

        Raises:
            WaitElementTimeout: If timeout > 0 and no shadow roots are found
                within the specified duration.
        z-Finding all shadow roots in page (timeout=%s)NTimed out after z"s waiting for shadow roots in page      ?)r   r   _collect_all_shadow_rootsasyncioget_event_looptimer/   sleep)r   deepr   
start_timeshadow_rootss        r   find_shadow_rootszTab.find_shadow_rootsP  s     6 	DgN77===++-224
!%!?!?!EEL##%%',,.;gE(&wi/QR  --$$$  > F %s4   -CC	;C+C,ACCCCCc           	       K   | j                  t        j                  dd             d{   }|j                  di       j                  di       }g }| j	                  ||       g }|D ]  \  }}|j                  d      }|s	 | j                  t        j
                  |             d{   }	|	d   d	   d
   }
	 | j                  |       d{   }t        |j                  dd            }|j                  t        |
| j                  ||              |r)| j!                          d{   }|j#                  |       t        j                  dt%        |       d       |S 7 @7 # t        t        t        f$ r t        j                  d|        Y 5w xY w7 # t        t        t        f$ r t        j                  d|        d}Y w xY w7 w)zBCollect shadow roots from the main document and optionally OOPIFs.TdepthpierceNr   rootbackendNodeIdbackend_node_idobjectobjectIdz/Failed to resolve shadow root: backend_node_id=z/Failed to resolve shadow host: backend_node_id=shadowRootTypeopen	object_idconnection_handlermodehost_elementFound z shadow roots)r   r   get_documentr   _collect_shadow_roots_from_treeresolve_noder!   r0   KeyErrorr   r   _resolve_shadow_hostr9   appendr   rr   _collect_oopif_shadow_rootsextendlen)r   r  r   	root_nodeshadow_root_entriesr  shadow_datahost_backend_idr"  resolve_responseshadow_object_idr+  r*  oopif_rootss                 r   r  zTab._collect_all_shadow_roots}  s    .2.C.C$$2d;/
 )
 LL2.2262>	=?,,Y8KL)+,? 	(K)ooo>O">B>S>S,,_M? 9  $4H#=h#G
#S 
$%)%>%>%OO "+//2BF"KLD.'+'?'?!-	)	:  $ @ @ BBK,vc,/0>?W)
9 ,-FQ NN_`a
  P+-FQ $NN_`a#$ Cs   *GE,AG(E1.E//E1?F&F$F&AG2G3:G/E11,F!G F!!G$F&&.GGGGc                  K   |sy| j                  t        j                  |             d{   }|d   d   d   }| j                  |       d{   }t	        || j
                  || j                        S 7 L7 )w)z9Resolve the host element for a shadow root (best-effort).Nr!  r   r#  r$  r(  attributes_listr   )r   r   r/  _get_object_attributesr    rr   r}   )r   r9  host_responsehost_object_id
host_attrss        r   r1  zTab._resolve_shadow_host  s     373H3H$$_E4
 .
 'x0::F666PP
D44jX\XcXc
 	
.
 Qs!   ,A?A;$A?A=(A?=A?c                  K   t        | j                        }|j                  t        j                                d{   }|j                  di       j                  dg       }|D cg c]  }|j                  d      dk(  s| }}|st        j                  d       g S g }|D ]-  }| j                  ||       d{   }|j                  |       / t        j                  dt        |       d	       |S 7 c c}w 7 Bw)
z;Discover shadow roots inside cross-origin iframes (OOPIFs).)r   Nr   targetInfostyper   zNo OOPIF targets foundr,  z shadow roots in OOPIFs)r   rm   execute_commandr   r  r   r   r   '_collect_shadow_roots_from_oopif_targetr4  r5  )	r   browser_handlertargets_responsetarget_infostiframe_targetsr  r  rootss	            r   r3  zTab._collect_oopif_shadow_roots  s     +D<Q<QR5D5T5T&&(6
 0
 (++Hb9==mRP%1OQUU6]h5N!OOLL12I)+$ 	'FFFv__E&	' 	vc,/00GHI#0

 P `s4   =DC; *D*C=C=7D?D <D=Dc                  K   |j                  dd      }	 |j                  t        j                  |d             d{   }|j                  di       j                  d      }|sg S 	 	 t        j                  d	d
      }||d<   |j                  |       d{   }|j                  di       j                  di       }g }	| j                  ||	       t        |||      }
g }|	D ]6  \  }}| j                  |||||
       d{   }|s&|j                  |       8 |S 7 # t        t
        f$ r t        j                  d|        g cY S w xY w7 # t        t
        f$ r t        j                  d|        g cY S w xY w7 ~w)z0Collect shadow roots from a single OOPIF target.r  r   T)r   flattenNr   	sessionIdz"Failed to attach to OOPIF target: r  r  r  z*Failed to get document from OOPIF target: )frame_idsession_handler
session_id)r   rH  r   attach_to_targetr!   r0   r   r   r   r-  r.  r5   _resolve_oopif_shadow_entryr2  )r   r  rJ  r   attach_responserU  get_doc_commanddoc_responser6  entriesiframe_contextresultsr8  r9  srs                  r   rI  z+Tab._collect_shadow_roots_from_oopif_target  s     JJz2.			<K<[<[//)TR= 7O ),,Xr:>>{KJ	 		)66RMO+5OK(6E6U6U7 1L %((26::62FI
 24,,Y@&+!
 %',3 	#(K77_oz> B r"	# K7 ()BC 	LL=i[IJI	1 ()BC 	LLEi[QRI	s   F)D% D# (D% (F+0E E&E AFFFF#D% %)EFEFE )F?FFFc                  K   |j                  d      }|sy	 t        j                  |      }||d<   |j                  |       d{   }|d   d   d   }	| j                  |||       d{   }
|
r||
_
        t        |j                  d	d
            }t        |	| j                  ||
      }|
s||_
        |S 7 r# t        t
        t        f$ r t        j                  d|        Y yw xY w7 w)z1Resolve a single shadow root entry from an OOPIF.r   Nr!  rR  r   r#  r$  z5Failed to resolve OOPIF shadow root: backend_node_id=r%  r&  r'  )r   r   r/  rH  r!   r0   r0  r   r   _resolve_oopif_shadow_host_iframe_contextr9   r   rr   )r   r8  r9  rJ  rU  r\  r"  resolve_commandr:  r;  r+  r*  r^  s                r   rW  zTab._resolve_oopif_shadow_entry  s     &///:		)66WO+5OK(:I:Y:Y; 5  09(CJO
 "<<_j
 
 +9L(koo.>GH&#77%	
 !/B	55 ()BHM 	LLPQ`Pabc	
sG   C0/B< B:B< C0-C..AC0:B< <,C+(C0*C++C0c                x  K   |sy	 t        j                  |      }||d<   |j                  |       d{   }|d   d   d   }t        j                  |      }||d<   |j                  |       d{   }|j	                  di       j	                  di       }	|	j	                  d	g       }
|	j	                  d
d      j                         }|
j                  d|g       t        || j                  |
| j                        S 7 7 # t        t        t        f$ r t        j                  d|        Y yw xY ww)zIResolve the host element for a shadow root inside an OOPIF (best-effort).Nr!  rR  r   r#  r$  r>  node
attributesnodeNamer   r  r?  z5Failed to resolve OOPIF shadow host: backend_node_id=)r   r/  rH  describe_noder   lowerr4  r    rr   r}   r!   r0   r0  r   r   )r   r9  rJ  rU  rb  rB  rC  describe_commanddescribe_response	node_infore  r  s               r   r`  zTab._resolve_oopif_shadow_host+  sL     	)66WO+5OK(7F7V7V8 2M +84X>zJN*88>R,6[)<K<[<[ = 7 *--h;??KI"|R8J }}Z4::<Hz845(( *kk	 27 ()BHM 	LLPQ`Pabc	sK   D:/D D>D 5D6BD D:D D ,D74D:6D77D:c                T   | j                  d      }| j                  dg       D ]+  }|j                  ||f       t        j                  ||       - | j                  dg       D ]  }t        j                  ||        | j                  d      }|rt        j                  ||       yy)z;Recursively walk a DOM tree collecting shadow root entries.r   shadowRootschildrencontentDocumentN)r   r2  re   r.  )rd  r]  r9  shadow_rootchildcontent_docs         r   r.  z#Tab._collect_shadow_roots_from_treeQ  s     ((?388M26 	FKNNK9://WE	F XXj"- 	@E//w?	@ hh01//WE r   c                   K   t         j                  d       | j                  t        j                                d{   S 7 w)zBrings the page to front.zBringing page to frontN)r   r   r   r   bring_to_frontr   s    r   rt  zTab.bring_to_front`  s3     ,-**<+F+F+HIIIIs   <AAAc                  K   t         j                  d       | j                  rb| j                  t	        j
                  | j                               d{   }|d   d   }t         j                  dt        |       d       |S | j                  t        j
                                d{   }|d   d   }t         j                  dt        |       d       |S 7 7 2w)z-Get all cookies accessible from current page.z!Fetching cookies for current pageNr   cookieszFetched z cookies)r   r   rp   r   r   get_cookiesr5  r   )r   response_storagerv  response_networks       r   rw  zTab.get_cookiese  s     89##@D@U@U++D,D,DEA ; 'x0;GLL8CL>:;N<@<Q<Q'')=
 7
 #8,Y7xG~X67;7
s%   AC!CAC!,C-1C!C!c                   K   | j                   st        d      | j                  t        j                  |             d{   }t
        j                  d|        |d   d   S 7 $w)a2  
        Get the response body for a given request ID.

        Args:
            request_id: Request ID to get the response body for.

        Returns:
            The response body for the given request ID.

        Raises:
            NetworkEventsNotEnabled: If network events are not enabled.
        z3Network events must be enabled to get response bodyNz/Retrieved network response body for request_id=r   body)r   r*   r   r   get_response_bodyr   r   )r   
request_idr   s      r   get_network_response_bodyzTab.get_network_response_bodyw  sk      **)*_``262G2G--j93
 -
 	FzlST!&))	-
s   ?A(A&%A(c                @  K   | j                   st        d      | j                  j                  }|r7|D cg c],  }||d   j	                  di       j	                  dd      v s+|. }}t
        j                  dt        |       dt        |       d       |S c c}w w)	z
        Get network logs.

        Args:
            filter: Filter to apply to the network logs.

        Returns:
            The network logs.

        Raises:
            NetworkEventsNotEnabled: If network events are not enabled.
        z2Network events must be enabled to get network logsparamsr   r   r   z
Returning z network logs (filtered=))	r   r*   rr   network_logsr   r   r   r5  r   )r   filterlogslogs       r   get_network_logszTab.get_network_logs  s      **)*^__''44#vX1B1B9b1Q1U1UV[]_1`'`D  	z#d),DT&\NRSTU	s   4B,B#B'7Bc                   K   t         j                  dt        |       d       | j                  t	        j
                  || j                               d{   S 7 w)z
        Set multiple cookies for current page.

        Args:
            cookies: Cookie parameters (name/value required, others optional).

        Note:
            Defaults to current page's domain if not specified.
        zSetting z cookies on current pageN)r   r   r5  r   r   set_cookiesrp   )r   rv  s     r   r  zTab.set_cookies  sU      	hs7|n,DEF**''1I1IJ
 
 	
 
s   AAAAc                   K   t         j                  d       | j                  t        j                  | j
                               d{   S 7 w)z0Delete all cookies from current browser context.z1Clearing all cookies from current browser contextN)r   r   r   r   clear_cookiesrp   r   s    r   delete_all_cookieszTab.delete_all_cookies  s;     GH**?+H+HIaIa+bccccs   AA	A
Ac                  K   t         j                  d| d| d       | j                  |      4 d{    | j                  t	        j
                  |             d{   }|d   j                  d      }|rt        ||      ddd      d{    t         j                  d|        y7 {7 Q7 !# 1 d{  7  sw Y   1xY ww)	am  
        Navigate to URL and wait for loading to complete.

        Args:
            url: Target URL to navigate to.
            timeout: Maximum seconds to wait for page load (default 300).

        Raises:
            NavigationError: If the navigation fails (e.g., DNS error).
            PageLoadTimeout: If page doesn't finish loading within timeout.
        zNavigating to URL: 
 (timeout=s)r   Nr   	errorTextzNavigation complete: )r   r   _wait_page_loadr   r   navigater   r)   )r   r   r   r   
error_texts        r   go_toz	Tab.go_to  s      	)#j	DE'''8 	7 	7/3/D/D\EZEZ[^E_/`)`H!(+//<J%c:66		7 	7
 	+C512	7)`	7 	7 	7 	7sV   3CB1C(B7!B3"&B7CB5C3B75C7C	=C >C	Cc                d  K   t         j                  d| dt        |       d       | j                         4 d{    | j	                  t        j                  ||             d{    ddd      d{    t         j                  d       y7 X7 ,7 # 1 d{  7  sw Y   .xY ww)a,  
        Reload current page and wait for completion.

        Args:
            ignore_cache: Bypass browser cache if True.
            script_to_evaluate_on_load: JavaScript to execute after load.

        Raises:
            PageLoadTimeout: If page doesn't finish loading within timeout.
        zReloading page (ignore_cache=z, script_on_load=r  N)ignore_cachescript_to_evaluate_on_loadzPage reloaded successfully)r   r   r   r  r   r   reload)r   r  r  s      r   refreshzTab.refresh  s      	+L> :"#=>?qB	
 '') 	 	''##!-/I  	 	 	01		 	 	 	sW   :B0BB0 *B*B+B/B0:B;B0BB0B-!B$"B-)B0c           
       K   |s|s
t               |r%t        |t              r|j                  d      d   }n>|r,t        |t              r|j
                  j                  d      }nt        j                  }|dk(  r|j                  dd      n|}t        j                  |      st        | d      t        j                  |      }t        j                  d| d| d| d	|        | j                  t!        j"                  |||
             d{   }	 |d   d   }|rt        j                  d       |S |rtt)        |      }	t+        j,                  t        |      d      4 d{   }
|
j/                  |	       d{    ddd      d{    t        j                  d|        y7 # t$        $ r t'        d      w xY w7 `7 I7 ;# 1 d{  7  sw Y   KxY ww)a  
        Capture screenshot of current page.

        Args:
            path: File path for screenshot (extension determines format).
            quality: Image quality 0-100 (default 100).
            beyond_viewport: The page will be scrolled to the bottom and the screenshot will
                include the entire page
            as_base64: Return as base64 string instead of saving file.

        Returns:
            Base64 screenshot data if as_base64=True, None otherwise.

        Raises:
            InvalidFileExtension: If file extension not supported.
            MissingScreenshotPath: If path is None and as_base64 is False.
        .r  jpgjpegz extension is not supported.zTaking screenshot: path=z
, quality=z, beyond_viewport=, as_base64=)formatqualitycapture_beyond_viewportNr   datazvCommand can only be executed on top-level targets. Please use take_screenshot method on the WebElement object instead.z*Screenshot captured and returned as base64wbzScreenshot saved to: )r(   
isinstancestrsplitr   suffixlstripr=   JPEGreplace	has_valuer$   	get_valuer   r   r   r   capture_screenshotr0  r.   rC   aiofilesr&  write)r   pathr  beyond_viewport	as_base64output_extensionoutput_formatr   screenshot_datascreenshot_bytesfiles              r   take_screenshotzTab.take_screenshot  s    0 I'))JtS)#zz#r2jt,#{{11#6/44
  5( $$UF3! 	  ))*:;&*:);;W'XYY(223CD&tfJwi @./|I;H	
 594I4I++$(75
 /
	&x08O KKDE""5oF}}SY5 3 3jj!12223 3KK/v675/
  	(K 	323 3 3 3s   DG%F0G%F2  A	G%)G
*G%-GGGG%GG%2GG%GG%G"GG"G%c                &  K   t         j                  d| d| d| d| d| d|        | j                  t        j                  ||||             d{   }|d	   d
   }|rt         j                  d       |S |t        d      t        |      }	t        j                  |d      4 d{   }
|
j                  |	       d{    ddd      d{    t         j                  d|        y7 7 H7 17 ## 1 d{  7  sw Y   3xY ww)aC  
        Generate PDF of current page.

        Args:
            path: File path for PDF output. Required if as_base64=False.
            landscape: Use landscape orientation.
            display_header_footer: Include header/footer.
            print_background: Include background graphics.
            scale: Scale factor (0.1-2.0).
            as_base64: Return as base64 string instead of saving.

        Returns:
            Base64 PDF data if as_base64=True, None otherwise.

        Raises:
            ValueError: If path is not provided when as_base64=False.
        zGenerating PDF: path=z, landscape=z, header_footer=z, print_bg=z, scale=r  )	landscapedisplay_header_footerprint_backgroundscaleNr   r  z$PDF generated and returned as base64z%path is required when as_base64=Falser  zPDF saved to: )
r   r   r   r   print_to_pdf
ValueErrorrC   r  r&  r  )r   r  r  r  r  r  r  r   pdf_data	pdf_bytesr  s              r   r  zTab.print_to_pdf7  s.    4 	#D6i[ A23;?O>P QG<	{4	

 .2-B-B%%#&;!1	.
 (
 H%f-KK>?O<DEE*84	==t, 	( 	(**Y'''	( 	(nTF+,+(
"	('	( 	( 	( 	(sm   ADC4AD-C6.D1C<C8C<DC:D6D8C<:D<DDD
Dc                  K   t        |      }|j                  j                         dk7  rt        d|j                        t        j                  d| d|        | j                  }|s| j                          d{    	 | j                  t        j                                d{   }|d   d   }|d   d	   }| j                  |       d{   }| j                  ||       d{   }t        j                         }	t        j                   |	d
t        j"                        5 }
|rt%        ||      }nt'        ||      }|
j)                  d|j+                  d             |s2|j-                         D ]  \  }\  }}}}|
j)                  d| |       ! ddd       t/        j0                  |d      4 d{   }|j3                  |	j5                                d{    ddd      d{    t        j                  d|        |s| j7                          d{    yy7 7 7 a7 J# 1 sw Y   xY w7 7 b7 T# 1 d{  7  sw Y   dxY w7 9# |s| j7                          d{  7   w w xY ww)a  
        Save current page and its assets as a .zip bundle for offline viewing.

        Captures the page HTML along with CSS, JS, images, fonts, and media
        into a single zip archive. The archive contains an ``index.html`` with
        URLs rewritten to reference local asset files.

        Args:
            path: Destination path for the ``.zip`` file.
            inline_assets: When True, embed all assets directly into
                ``index.html`` using data URIs, ``<style>``, and ``<script>``
                tags instead of saving them as separate files.

        Raises:
            InvalidFileExtension: If path does not end with ``.zip``.
        z.zipzExpected .zip extension, got zSaving page bundle: path=z	, inline=Nr   	frameTreer	  r   wz
index.htmlutf-8zassets/r  zPage bundle saved to: )r   r  rh  r$   r   r   r   r   r   r   get_resource_tree_fetch_document_html_fetch_bundle_assetsioBytesIOzipfileZipFileZIP_DEFLATEDrH   rI   writestrencodeitemsr  r&  r  getvaluer   )r   r  inline_assetspage_was_enabledtree_response
frame_treepage_urlhtml	asset_mapbufzf_urlfilenamer  _mime_rtypefs                    r   save_bundlezTab.save_bundlem  sV    " Dz;;&(&)Ft{{o'VWW/vY}oNO33))+++	1;?;P;P..0< 6M -:(,CK,PJ!'*51H22:>>D"77
HMMI**,Cc7+?+?@ @B ,T9=D,T9=DL$++g*>?$AJAR @==xufghZ$8$?@@  }}T40 . .Aggclln---. .KK078#..000 $5 ,6
 ?M@ @.-. . . .
 1 $..000 $s   A=J?H/ J&I$ +H2,(I$ H5I$ .H8/=I$ ,A1H;"I$ ?I I$ #I&I	'I+I$ 6I7I$ J(I")J2I$ 5I$ 8I$ ;I I$ 	II$ IIII$ "J$J:I=;JJc                  K   |d   d   }|d   d   }	 | j                  t        j                  ||             d{   }|d   }|d   }|j                  d      r&t	        j
                  |      j                  dd	
      }|S 7 G# t        $ rK t        j                  d       | j                  d       d{  7  }t        t        |d   d   d         cY S w xY ww)z1Fetch the main document HTML from the frame tree.r	  idr   Nr   contentbase64Encodedr  r  )errorsz:getResourceContent failed for document, falling back to JSz)return document.documentElement.outerHTMLr   )r   r   get_resource_contentr   _b64	b64decodedecode	Exceptionr   r   execute_scriptr   r  )r   r  rS  r  rZ  r   r  r   s           r   r  zTab._fetch_document_html  s     g&t,g&u-	D=A=R=R11(HE> 8L "(+F)$Dzz/*~~d+22792MK8  	DLLUV!001\]]]HXh/9'BCC	DsE   C(B BAB CB 2C8B;9CCCCc                  K   t        |      }t        ||      }|D cg c]-  \  }}| j                  t        j                  ||d               / }}}t        j                  |ddi d{   }i }	t        t        ||            D ]  \  }
\  \  }}}t        |t              rt        j                  d|d    d|        ;|}|j                  d      }|.t        j                  d|d    d|j                  d	              ~|d
   }|j                  dd      }|rt        j                  |      n|j!                  d      }t#        |d   |d   |
      }|||d   |d   f|	|d   <    |	S c c}}w 7 w)z7Fetch all bundleable resources and return an asset map.r   return_exceptionsTNzFailed to fetch resource z: r   zNo result for resource errorr  r  Fr  mimeTyperG  )rF   rG   r   r   r  r  gather	enumeratezipr  BaseExceptionr   warningr   r  r  r  rE   )r   r  r  all_resources	fetchablefidresfetch_tasksr]  r  idx_fidr   r   content_resultraw_content	is_base64r  r  s                      r   r  zTab._fetch_bundle_assets  s     0
;.}hG	 &D
S !!,"C"CCU"TUD
 D
  LtLLEG	*3C	74K*L 	S&C&+4v&-0!:3u:,bQR39H%\\(3N%!8UBx||T[G\F]^_-i8K,00%HI2;4>>+.ASAST[A\D+CJJMH%-tS_c&k$RIc%j!	S +D
 Ms   E72E.E7,E4-DE7c                d   K   | j                   j                  rt        j                  d       yyw)z
        Check if JavaScript dialog is currently displayed.

        Note:
            Page events must be enabled to detect dialogs.
        zDialog presentTF)rr   dialogr   r   r   s    r   
has_dialogzTab.has_dialog  s*      ##**LL)*s   .0c                   K   | j                          d{   s
t               | j                  j                  d   d   }t        j                  d|        |S 7 Dw)z
        Get message text from current JavaScript dialog.

        Raises:
            NoDialogPresent: If no dialog is currently displayed.
        Nr  messagezDialog message retrieved: )r  r+   rr   r   r   r   )r   r  s     r   get_dialog_messagezTab.get_dialog_message  sZ      __&&&!##**11(;IF1';<	 's   AAAAc                   K   | j                          d{   s
t               t        j                  d| dt	        |              | j                  t        j                  ||             d{   S 7 `7 w)au  
        Respond to JavaScript dialog.

        Args:
            accept: Accept/confirm dialog if True, dismiss/cancel if False.
            prompt_text: Text for prompt dialogs (ignored for alert/confirm).

        Raises:
            NoDialogPresent: If no dialog is currently displayed.

        Note:
            Page events must be enabled to handle dialogs.
        NzHandling dialog: accept=z, has_prompt_text=)acceptprompt_text)r  r+   r   r   r   r   r   handle_javascript_dialog)r   r  r  s      r   handle_dialogzTab.handle_dialog  su      __&&&!##.vh6HkIZH[\]**11[Y
 
 	
 '
s"   A;A7AA;2A93A;9A;object_groupinclude_command_line_apisilent
context_idreturn_by_valuegenerate_previewuser_gestureawait_promisethrow_on_side_effectr   disable_breaks	repl_mode allow_unsafe_eval_blocked_by_cspunique_context_idserialization_optionsc                  K   y wNr   )r   scriptr  r  r  r  r  r  r  r  r  r   r  r  r  r  r  s                    r   r  zTab.execute_script  s     (    	argumentsr  r  r  r  r  execution_context_idr  r  r  r  c                  K   y wr  r   )r   r  elementr  r  r  r  r  r  r  r  r  r  r  s                 r   r  zTab.execute_script  s     " "%r  )r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  c                 K   t         j                  dt        |       dt        |              |At	        j
                  dt        d       |j                  |||||	|
||||||       d{   S t        |      rd| d	}| j                  |||||||	|
||||||||
      }t         j                  dt        |              | j                  |       d{   }| j                  |       |S 7 7 w)as  
        Execute JavaScript in page context.

        Args:
            script (str): JavaScript code to execute.
            element (Optional[WebElement]): Optional WebElement to execute script on.
            arguments (Optional[list[CallArgument]]): Arguments to pass to the function.
            object_group (Optional[str]): Symbolic group name for the result (Runtime.evaluate).
            include_command_line_api (Optional[bool]): Whether to include command line API
                (Runtime.evaluate).
            silent (Optional[bool]): Whether to silence exceptions (Runtime.evaluate).
            context_id (Optional[int]): ID of the execution context to evaluate in
                (Runtime.evaluate).
            return_by_value (Optional[bool]): Whether to return the result by value instead of
                reference (Runtime.evaluate).
            generate_preview (Optional[bool]): Whether to generate a preview for the result
                (Runtime.evaluate).
            user_gesture (Optional[bool]): Whether to treat evaluation as initiated by user
                gesture (Runtime.evaluate).
            await_promise (Optional[bool]): Whether to await promise result (Runtime.evaluate).
            execution_context_id (Optional[int]): ID of the execution context to call the
                function in.
            throw_on_side_effect (Optional[bool]): Whether to throw if side effect cannot be
                ruled out (Runtime.evaluate).
            timeout (Optional[float]): Timeout in milliseconds (Runtime.evaluate).
            disable_breaks (Optional[bool]): Whether to disable breakpoints during evaluation
                (Runtime.evaluate).
            repl_mode (Optional[bool]): Whether to execute in REPL mode (Runtime.evaluate).
            allow_unsafe_eval_blocked_by_csp (Optional[bool]): Allow unsafe evaluation
                (Runtime.evaluate).
            unique_context_id (Optional[str]): Unique context ID for evaluation
                (Runtime.evaluate).
            serialization_options (Optional[SerializationOptions]): Serialization options for
                the result (Runtime.evaluate).

        Returns:
            Union[EvaluateResponse, CallFunctionOnResponse]: The result of the script execution.

        Raises:
            InvalidScriptWithElement: If script uses 'argument' keyword but no element is provided.

        Examples:
            # Execute a simple script to log a message
            await page.execute_script('console.log("Hello World")')

            # Execute a script that returns the page title
            await page.execute_script('return document.title')

            # Execute a script on an element to click it
            await page.execute_script('argument.click()', element)

            # Execute a script on an element to set its value
            await page.execute_script('argument.value = "Hello"', element)
        zExecuting script: with_element=z	, length=NzdPassing a WebElement to Tab.execute_script() is deprecated. Use WebElement.execute_script() instead.r   r   r  z(function(){ z })()r
  z)Executing script without element: length=)r   r   r   r5  r   r   r   r  rD   _get_evaluate_commandr   _validate_argument_error)r   r  r!  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  commandr   s                         r   r  zTab.execute_script-  s@    Z 	6tG}oYsSY{m\]MM;"	 !//# /!1)+%9)%9"3&; 0    'v.%fXV4F,,%%=!+-%'!5)-M/"7! - 
$ 	@VNOHLH]H]I
 C
 	%%f-SJC
s%   A,C6.C2/A+C6C4C64C6c           
        K   t         j                  d|        | j                  t        j                  ||||||             d{   S 7 w)z@
        Continue paused request without modifications.
        zContinue request on tab: id=)r}  r   method	post_dataheadersintercept_responseN)r   r   r   r   continue_request)r   r}  r   r'  r(  r)  r*  s          r   r+  zTab.continue_request  sY      	3J<@A****%##5	
 	
 		
 	
s   AAA	Ac                   K   t         j                  d| d|        | j                  t        j                  ||             d{   S 7 w)zFail request with error code.zFail request on tab: id=z	, reason=N)r   r   r   r   fail_request)r   r}  error_reasons      r   r-  zTab.fail_request  sE     /
|9\NST**=+E+EjR^+_````s   AAAAc                   K   t         j                  d| d| dt        |       dt        |              | j                  t	        j
                  |||||             d{   S 7 w)z#Fulfill request with response data.zFulfill request on tab: id=z, code=z, headers_set=z, body_set=)r}  response_coderesponse_headersr{  response_phraseN)r   r   r   r   r   fulfill_request)r   r}  r0  r1  r{  r2  s         r   r3  zTab.fulfill_request  s      	)*W]O L 012+d4j\K	
 **))%+!1 /
 
 	
 
s   A A)"A'#A)c           
        K   t         j                  d| d| dt        |              | j                  t	        j
                  ||||             d{   S 7 w)zContinue a paused request replying to an authentication challenge.

        Useful for proxy auth (407) or server auth (401) when Fetch is enabled
        with handle_auth=True.
        zContinue with auth on tab: id=z, response=z, user_set=)r}  auth_challenge_responseproxy_usernameproxy_passwordN)r   r   r   r   r   continue_request_with_auth)r   r}  r5  r6  r7  s        r   continue_with_authzTab.continue_with_auth  sr      	,ZLD[C\ ]^,-/	
 **44%(?--	
 
 	
 
s   AAAAc                  K   d fd} j                   du rd} j                          d{    nd} j                  du r j                          d{    t        j                  d        j                  t        j                  t        t        t        gt        f   |      d       d{    d  j                  du r j                          d{    |du r j                          d{    yy7 7 7 Q7 (7 w)z
        Context manager for automatic file upload handling.

        Args:
            files: File path(s) for upload.
        c                H  K   t         j                  d       t        t              rD cg c]  }t	        |       c}nt	              g}j                  t        j                  || d   d                d {    t         j                  d|        y c c}w 7 "w)Nz"File chooser opened; setting filesr  r   )filesr"  zFiles set on input: )	r   r   r  listr  r   r   set_file_input_filesr   )eventr  	file_listr<  r   s      r   event_handlerz.Tab.expect_file_chooser.<locals>.event_handler  s     KK<=9CE49Pu5tT5WZ[`WaVbI''00#$)(OO$D   LL/	{;< 6s   *B"B>B"=B >#B"FNTz Waiting for file chooser to open)	temporary)r?  r]   )r   r   r   r   r   r   r   r;   FILE_CHOOSER_OPENEDr   r   dictr	   r   r   )r   r<  rA  _before_page_events_enableds   ``  r   expect_file_chooserzTab.expect_file_chooser  s    		= ##u,*/'))+++*.'55>;;===67gg))4&#+&6  
 	
 	
 	55=<<>>>&%/**,,, 0' ,
 >	
 ? -sX   +DD(DDAD3D4*DDD:D	;DDDD	Dc                  K   |t        j                  dt        d       |t        j                  dt        d       t        j                         d fd} j
                  }|s j                          d{    t        j                  d        j                  t        j                  |       d{   }	 d j                          d{     j                  j                  |       d{    |s j                          d{    yy7 7 c7 G7 &7 #  j                  j                  |       d{  7   |s j                          d{  7   w w xY ww)	u  
        Context manager for automatic Cloudflare captcha bypass.

        Args:
            custom_selector: Deprecated — ignored. Cloudflare Turnstile is now
                detected automatically via shadow root inspection.
            time_before_click: Deprecated — ignored. The checkbox is now
                located via shadow root polling and clicked immediately.
            time_to_wait_captcha: Timeout for captcha detection (default 5s).
        Nr   r   r   r   c                   K   	 j                  |        d {    j                          y 7 # j                          w xY ww)Nr   )r   set)_captcha_processedr   r   s    r   bypass_cloudflarezCTab.expect_and_bypass_cloudflare_captcha.<locals>.bypass_cloudflareM  sQ     (--)= .   
 "%%'
 "%%'s%   A3 13 A3 AAz5Expecting and bypassing Cloudflare captcha if presentrJ  rD  )r   r   r   r  Eventr   r   r   r   r   r;   r   waitrr   r   r   )r   r   r   r   rL  rE  callback_idrK  s   `  `   @r   $expect_and_bypass_cloudflare_captchaz(Tab.expect_and_bypass_cloudflare_captcha*  sC    " &MME"	 (MMK"	 $MMO	( '+&>&>#*))+++KL GGI$>$>@QRR	1#((*****::;GGG...000 / , S +G0 **::;GGG...000 /s   A:E-?D <E-<D =E-D( D"D( E-=D$>E-D&E- E-"D( $E-&E-(E*E
E*"E%#E**E-c           	      K   |dn
t        |      }d}|t        d      d}n0t        t        |            t              j	                  dd       t
        j                  d d	| d
       | j                  j                  t        j                  | j                         d{    d}| j                  sd}| j                          d{    t        j                         }|j!                         |j!                         ddddddfd}dfd}| j#                  t$        j&                  t)        t*        t,        gt.        t0           f   |      d       d{    | j#                  t$        j2                  t)        t*        t,        gt.        t0           f   |      d       d{   }	t5        |      }
	 |
 	 t        j6                  |       d{    	 | j=                  |	||       d{    y7 d7 ?7 7 `7 -# t        j8                  $ r}t;               |d}~ww xY w7 7# | j=                  |	||       d{  7   w xY ww)a  
        Context manager for handling a file download triggered inside the block.

        Behavior:
        - If keep_file_at is provided, configure browser to save into that directory and keep file.
        - Otherwise, a temporary directory is used and cleaned up after the context.

        Args:
            keep_file_at: Directory to persist the file. If None, uses a temporary
                directory and cleans it up afterwards.
            timeout: Max seconds to wait for download completion. Defaults to 60.

        Yields:
            _DownloadHandle: Handle to read the downloaded file (bytes/base64) and check its path.
        Ng      N@Fzpydoll-download-)prefixT)parentsexist_okzExpecting download (dir=z
, timeout=r  )behaviordownload_pathr   )guidr   suggestedFilenamefilePathdirc                   K   | d   }|d   d<   |d   d<   |d   d<   j                         sj                  d       t        j                  dd    dd           y w)Nr  rX  r   rY  TzDownload will begin: url=z, filename=)done
set_resultr   r   )r?  r  state
will_begins     r   on_will_beginz*Tab.expect_download.<locals>.on_will_begin  sz     8_F"6NE&M!%=E%L)/0C)DE%&??$%%d+KK+E%L>UK^E_D`as   A!A$c                X  K   | d   }|d   }j                  d      r|d   k7  s|d   t        j                  k7  ry |j                  d      }|st        t	              d   z        }|d<   j                         sj                  d       t        j                  d|        y w)Nr  rX  r_  rZ  rY  TzDownload completed: )	r   r7   	COMPLETEDr  r   r]  r^  r   r   )r?  r  rX  	file_pathr]  download_dirr_  s       r   on_progressz(Tab.expect_download.<locals>.on_progress  s     8_F&>D		&!E&M)'?&;&E&EE

:.I\ 2U;N5O OP	 )E*99;%KK.yk:;s   B'B*)r_  will_begin_futuredone_futurer   r  )r?  rO   )r?  rN   )floatr   r  r   mkdirr   r   rl   set_download_behaviorr6   ALLOWrp   rs   r   r  r  create_futurer   r;   DOWNLOAD_WILL_BEGINr   r   rD  r   r	   DOWNLOAD_PROGRESS_DownloadHandlewait_forTimeoutErrorr"   _cleanup_download_context)r   keep_file_atr   download_timeoutcleanup_dir_page_events_was_enabledloopra  rf  cb_id_progresshandleexcr]  re  r_  r`  s               @@@@r   expect_downloadzTab.expect_downloadf  sp    * $+?4g"*<=LKtL12L$$TD$A.|nJGWFXXZ[\mm11%++&#77 2 
 	
 	
 $( ((',$))+++%%'+/+=+=+?
%)%7%7%9!%!
			<" gg))4&)C.01=A
 	
 	

  $ww''4&)C.01;? 
 
 !($	
	L1&&t5EFFF 00(  W	
 ,R	


  G'' 1%'S01$00(  s   B(I).H/'I)HBI)-H.AI)9H:I)I H .H/H 4I)II)I)I)I)H I1H<<II I)I&I" I&&I)c                r  K   | j                  |       d {    | j                  j                  t        j                  | j
                         d {    |r:|d   }|sy t        |      j                  d       t        j                  |d       |s| j                          d {    y y 7 7 ^7 
w)N)rV  r   rZ  T)
missing_ok)ignore_errors)r   rl   rk  r6   DEFAULTrp   r   unlinkshutilrmtreer   )r   ry  page_events_was_enabledrv  r_  re  rd  s          r   rs  zTab._cleanup_download_context  s      "">222mm11%--#77 2 
 	
 	

 j)IO""d"3MM,d;&**,,, ' 	3	
 -s4   B7B1<B7B3AB7*B5+B73B75B7c                   K   y wr  r   r   
event_namer   rB  s       r   r   zTab.on        r  c                   K   y wr  r   r  s       r   r   zTab.on  r  r  c           
        K   fd}t        j                        r|}n}t        j                  d| d| dt        j                                | j                  j                  |||       d{   S 7 w)a  
        Register CDP event listener.

        Callback runs in background task to prevent blocking.

        Args:
            event_name: CDP event name (e.g., 'Page.loadEventFired').
            callback: Function called on event (sync or async).
            temporary: Remove after first invocation.

        Returns:
            Callback ID for removal.

        Note:
            Corresponding domain must be enabled before events fire.
        c                D   K   t        j                   |              y wr  )r  create_task)r?  r   s    r   callback_wrapperz Tab.on.<locals>.callback_wrapper  s     0s    z#Registering callback on tab: event=z, temporary=z, async=N)r  iscoroutinefunctionr   r   rr   register_callback)r   r  r   rB  r  function_to_registers     `   r   r   zTab.on  s     .	1 &&x0#3 #+ 1*\) U00:;=	
 --??,i
 
 	
 
s   A1A;4A95A;c                   K   t         j                  d|        | j                  j                  |       d{   S 7 w)zRemove callback from tab.zRemoving callback from tab: id=N)r   r   rr   r   )r   rP  s     r   r   zTab.remove_callback   s7     6{mDE--==kJJJJs   7A >A c                ~   K   t         j                  d       | j                  j                          d{    y7 w)z%Clear all registered event callbacks.zClearing all callbacks from tabN)r   r   rr   clear_callbacksr   s    r   r  zTab.clear_callbacks%  s+     67&&66888   3=;=c                   | j                   r+t        j                  d       t        | j                         S t        j                  d| j                   d| j
                          t        | j                  | j
                        S )Nz.Using WebSocket address for connection handler)r   z/Using port/target for connection handler: port=z, target_id=)ro   r   r   r   rm   rn   r   s    r   rq   zTab._get_connection_handler*  sp    LLIJ$0@0@AA))*,t6GI	
 !!6!6HHr   c                   t        j                  di d| d|d|d|d|d|d|d|d	|d
|	d|
d|d|d|d|d|S )z5Create an evaluate command with the given parameters.
expressionr  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r   )r   r   )r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  s                   r   r#  zTab._get_evaluate_command4  s    * '' 

%
 &>
 	

 "
 ,
 .
 &
 (
 "6
 
 *
  
 .N
 0
  #8!
 	
r   c                H   | j                  d      }t        |t              sy|j                  d      }t        |t              sy|j                  d      dk(  r(|j                  d      dk(  r|j                  d      dk(  sy|j                  d	d
      }d|v rt        d      y)z
        Validate that script didn't fail with ReferenceError about 'argument' being undefined.

        Raises:
            InvalidScriptWithElement: If script uses 'argument' keyword but no element was provided.
        r   NrG  r#  subtyper  	classNameReferenceErrordescriptionr   zargument is not definedz6Script contains "argument" but no element was provided)r   r  rD  r&   )r   evaluate_resultremote_objectr  s       r   r$  zTab._validate_argument_error\  s     #,,x0/40'++H5-. f%1!!),7!!+.2BB#''r:$3*+cdd 4r   c                 K   | j                   j                  j                  }t        j                         | j
                  |   }| j                   }|r| j                          d{    d
fd}| j                  ||       d{   }t        j                  d| d| d       	 d t        j                  j                         |       d{    t        j                  d|        	 t!        j"                  t$              5  | j'                  |       d{    ddd       |r;t!        j"                  t$              5  | j)                          d{    ddd       yy7 7 7 # t        j                  $ r& t        j                  d| d	|        t               w xY w7 # 1 sw Y   xY w7 _# 1 sw Y   yxY w# t!        j"                  t$              5  | j'                  |       d{  7   ddd       n# 1 sw Y   nxY w|rHt!        j"                  t$              5  | j)                          d{  7   ddd       w # 1 sw Y   w xY ww xY ww)u?  Wait for page to reach the configured load state using CDP events.

        Registers a CDP event listener **before** yielding so the navigation
        command can be issued inside the ``async with`` block without race
        conditions.  This replaces the former ``document.readyState`` polling
        loop, eliminating the dependency on ``Runtime.evaluate`` during page
        load and the risk of inner command timeouts.

        The CDP event used depends on ``browser.options.page_load_state``:

        * ``INTERACTIVE`` — waits for ``Page.domContentEventFired``.
        * ``COMPLETE`` — waits for ``Page.loadEventFired``.

        Args:
            timeout: Maximum seconds to wait for the target load state.

        Raises:
            PageLoadTimeout: If the page doesn't reach the target state in time.
        Nc                &    j                          y r  )rI  )rJ  page_loadeds    r   	on_loadedz&Tab._wait_page_load.<locals>.on_loaded  s    OOr   zWaiting for page load via r  r  r  zPage load event received: zPage load timeout after zs waiting for rM  )rl   optionspage_load_stater  rN  _PAGE_LOAD_EVENT_MAPrs   r   r   r   r   rq  rO  rr  r  r-   
contextlibsuppressr  r   r   )r   r   target_stater  cleanup_page_eventsr  rP  r  s          @r   r  zTab._wait_page_load|  s    * }},,<<mmo..|<
"&";";;))+++	 !GGJ	::1*ZyPRST	5"";#3#3#5wGGGLL5j\BC
 $$Y/ 8**;7778"((3 5224445 5 #% ,
 ;
 H## 	$LL3G9N:,WX!##	$
 88 8 55 5 $$Y/ 8**;7778 8 8"((3 5224445 5 5 #s   A&I&)E/*I&	E2
 I&+-E6 E4E6 6I&F4$F2%F4)#I&G G !G%I&2I&4E6 69F//G 2F44F=9I& GGI&I#(H=H 
>H	I#H"I#3II

I	I#II##I&c                  K   t        j                         j                         }	 | j                  d       d{   }|D ]"  }|j                   d{   }t
        |v s |c S  t        j                         j                         |z
  |kD  rt        d| d      t        j                  d       d{    7 7 i7 	w)a  Poll for the Cloudflare Turnstile shadow root.

        Repeatedly calls ``find_shadow_roots(deep=False)`` and checks each
        shadow root's ``inner_html`` for the Cloudflare challenge domain.

        Args:
            timeout: Maximum seconds to wait for the shadow root.

        Returns:
            The first ShadowRoot whose inner HTML contains
            ``challenges.cloudflare.com``.

        Raises:
            WaitElementTimeout: If no matching shadow root is found within
                *timeout* seconds.
        F)r  Nr  z.s waiting for Cloudflare Turnstile shadow rootr  )r  r  r  r  
inner_html_CLOUDFLARE_CHALLENGE_DOMAINr/   r  )r   r   r  r  r^  r  s         r   _find_cloudflare_shadow_rootz Tab._find_cloudflare_shadow_root  s     " ++-224
!%!7!7U!7!CCL" ]]*/47I
 %%',,.;gE(&wi/]^  --$$$ C* %s:   9CB<CB>C"AC6C 7C>C Cc                  K   	 t        |      }| j                  |       d{   }|j                  t        |       d{   }|j	                  d|       d{   }|j                  |       d{   }|j                  t        |       d{   }|j                          d{    y7 7 s7 Z7 B7 %7 # t        $ r"}	t        j                  d|	        Y d}	~	yd}	~	ww xY ww)zAttempt to bypass Cloudflare Turnstile captcha via shadow root traversal.

        Traverses shadow roots to locate the Cloudflare iframe, navigates into
        it, and clicks the actual checkbox element (``span.cb-i``).
        r  Nr{  )r  r   zError in cloudflare bypass: )intr  query_CLOUDFLARE_IFRAME_SELECTORfindget_shadow_root_CLOUDFLARE_CHECKBOX_SELECTORclickr  r   r  )
r   r?  r   timeout_intrp  r   r{  inner_shadowcheckboxr{  s
             r   r   zTab._bypass_cloudflare  s     	?23K $ A A, !B ! K ',,-HR],^^FfkJJD!%!5!5>R!5!SSL)//0MWb/ccH..""" _JSc" 	?LL7u=>>	?s   C/ C B5C B7C B9C 8B;9C B=C /B?0C 4C/5C 7C 9C ;C =C ?C 	C,
C'"C/'C,,C/)NNNN)
r   rJ   r   Optional[int]r   Optional[str]r   r  r   r  )returnr   )r  r   )r  r4   )r  r2   )r  r3   )r  r1   )r   type[T]r   r  r   r  r  rg   )
r   r  r   r  r   r  r   r  r  zlist[T]r  r  )FNN)r   r   r   zOptional[ResourceType]r   zOptional[RequestStage])NN   )r   Optional[tuple[By, str]]r   Optional[float]r   ri  )r	  z'WebElement'r  rf   )Fr   )r  r   r   ri  r  list[ShadowRoot])r  r   r  r  )r9  
int | Noner  WebElement | None)r  r  )r  rB   rJ  r   r  r  )r8  r8   r9  r  rJ  r   rU  r  r\  r5   r  zShadowRoot | None)r9  r  rJ  r   rU  r  r  r  )rd  r8   r]  zlist[tuple[Node, int | None]]r  None)r  zlist[Cookie])r}  r  r  r  r  )r  r  r  zlist[RequestWillBeSentEvent])rv  zlist[CookieParam])i,  )r   r  r   r  )FN)r  r   r  r  )Nd   FF)
r  Optional[str | Path]r  r  r  r   r  r   r  r  )NFFTg      ?F)r  r  r  r   r  r   r  r   r  ri  r  r   r  r  )F)r  z
str | Pathr  r   r  r  )r  r<   r  r  )r  r<   r  r  r  z/dict[str, tuple[str, bytes, str, ResourceType]])r  r   r  r  )"r  r  r  r  r  Optional[bool]r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  Optional[SerializationOptions]r  r?   )r  r  r!  r    r  Optional[list[CallArgument]]r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r>   )(r  r  r!  zOptional[WebElement]r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  z/Union[EvaluateResponse, CallFunctionOnResponse])NNNNN)r}  r  r   r  r'  zOptional[RequestMethod]r(  r  r)  Optional[list[HeaderEntry]]r*  r  )r}  r  r.  r[   )NNN)
r}  r  r0  r  r1  r  r{  r  r2  r  )NN)r}  r  r5  rS   r6  r  r7  r  )r<  zstr | Path | list[str | Path]r  AsyncGenerator[None, None])r   r  r   r  r   ri  r  r  )rt  zOptional[Union[str, Path]]r   r  r  z%AsyncGenerator[_DownloadHandle, None])ry  r  r  r   rv  r   r_  dict[str, Any]re  r  r  r  )r  r  r   zCallable[[dict], Any]rB  r   r  r  )r  r  r   z Callable[[dict], Awaitable[Any]]rB  r   r  r  )r  r  )rP  r  )r  r   ) r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  )r   r?   r  r  )r   r  )r   ri  r  r   )r  )r?  rD  r   ri  r  r  )Z__name__
__module____qualname____doc__r   propertyr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r1  r3  rI  rW  r`  staticmethodr.  rt  rw  r~  r  r  r  r  r  r  r  r  r  r  r  r  r	  r   r  r+  r-  r3  r9  r   rF  rQ  r|  rs  r   r   r  rq   r#  r$  r   INTERACTIVEr;   DOM_CONTENT_EVENT_FIREDCOMPLETEr   r  r  r  r   r   r   r   re   re      s
    *.#',0$(-
-
 '-
 !	-

 *-
 "-
^ ) ) , , * * ( ( , , 	 	 	 	 	 	   ' '  $RR 	R
 R 
R8 #cc 	c
 c c 
c0 ; ; 5 5 5 5 = = "0404	 . .	@ 59-1&'	,
1,
 +,
 $	,
\43j+%Z-^
,-- +- 
	-^** $* +	*
 * &* 
*X$#$ +$ 	$
 
$L F FJ
$*,0
d
3, #4822 %22< &* %L"L L 	L
 L 
L` &*&+!%4"4 4  $	4
 4 4 4 
4l41lD$%  
9	@
* 
 '+37!%$(*.+/'+(,/3#')-$(;?+/@D% $	
 #1  " ( ) % & - ! ' "  +9!" )#$  >%& 
' *  37!%*.+/'+(,.2&*/3+/@D%% %
 0% % (% )% %% &% ,% $% -% )%  >%  
 !% %* )-
 37&*37!%$(*.+/'+(,.2/3#')-$(;?+/@D+ &
 0 $ #1  " ( ) % & , -  !!" '#$ "%& +9'( ))*  >+, 
9-J "*.#'/3-1

 
 (	

 !
 -
 +
0a 9=")-

 
 6	

 
 '
6 )-(,

 ";
 &	

 &
2 +-2+-	#+- +-Z  59-1&'	91191 +91 $	91
 
$91 91v  48#'p0p !p 
/	p pd-- "&- 	-
 - - 
-0 RW)>KO	  ]b)IVZ	  	%

 
%
NK
9
I  '+37!%$(*.+/'+(,/3#')-$(;?+/@D#%
%
 $%
 #1	%

 %
 "%
 (%
 )%
 %%
 &%
 -%
 !%
 '%
 "%
 +9%
  )!%
"  >#%
 %
N e e6 	!!9#D#D	 : :
 /5 /5b%D '(?? $? 
	?r   c                  b    e Zd ZdZ	 	 	 	 	 	 	 	 	 	 d	dZed
d       ZdddZdddZddZ	ddZ
y)rp  zAHandle returned by expect_download to access the downloaded file.c                <    || _         || _        || _        || _        y r  )_state_will_begin_future_done_future_timeout)r   r_  rg  rh  r   s        r   r   z_DownloadHandle.__init__  s"     "3'r   c                8    | j                   j                  d      S )NrZ  )r  r   r   s    r   rd  z_DownloadHandle.file_path  s    {{z**r   Nc                ~   K   t        j                  | j                  |xs | j                         d {    y 7 wNr  )r  rq  r  r  r   r   s     r   wait_startedz_DownloadHandle.wait_started  s+     t66@X4==YYYr  c                ~   K   t        j                  | j                  |xs | j                         d {    y 7 wr  )r  rq  r  r  r  s     r   wait_finishedz_DownloadHandle.wait_finished  s+     t00':RT]]SSSr  c                F  K   | j                          d {    | j                  st        d      t        j                  | j                  d      4 d {   }|j                          d {   cd d d       d {    S 7 m7 /7 7 # 1 d {  7  sw Y   y xY ww)Nz Download file path not availablerb)r  rd  FileNotFoundErrorr  r&  read)r   r  s     r   
read_bytesz_DownloadHandle.read_bytes  s       """~~#$FGG==6 	" 	"!>	" 	" 	" 	#	"!	" 	" 	" 	"si   B!B?B!BB!B.B/B2B!>B
?B!B!B
B!BBBB!c                   K   | j                          d {   }t        j                  |      j                  d      S 7 (w)Nascii)r  r  	b64encoder  )r   r  s     r   read_base64z_DownloadHandle.read_base64  s4     __&&~~d#**733 's   A?)A)
r_  r  rg  asyncio.Future[bool]rh  r  r   ri  r  r  )r  r  r  )r   r  r  r  )r  bytesr  )r  r  r  r  r   r  rd  r  r  r  r  r   r   r   rp  rp    sd    K
 
  0
  *	
 
 
  

  + +ZT"4r   rp  )
__future__r   r  base64r  r  r  loggingr  r   r  r   	functoolsr   pathlibr   tempfiler   typingr   r	   r
   r   r   r   r   r   r   r   r   r  pydoll.browser.requestsr   pydoll.commandsr   r   r   r   r   r   r   pydoll.connectionr   pydoll.constantsr   r   pydoll.elements.mixinsr   pydoll.elements.shadow_rootr   pydoll.elements.web_elementr    pydoll.exceptionsr!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   pydoll.extractor.enginer1   pydoll.interactionsr2   r3   r4   pydoll.interactions.iframer5   pydoll.protocol.browser.typesr6   r7   pydoll.protocol.dom.typesr8   r9   pydoll.protocol.network.typesr:   pydoll.protocol.page.eventsr;   pydoll.protocol.page.typesr<   r=   pydoll.protocol.runtime.methodsr>   r?   r@   pydoll.protocol.runtime.typesrA   pydoll.protocol.target.typesrB   pydoll.utilsrC   rD   pydoll.utils.bundlerE   rF   rG   rH   rI   pydoll.browser.chromium.baserJ   pydoll.extractor.modelrK   pydoll.protocol.baserL   rM   pydoll.protocol.browser.eventsrN   rO   pydoll.protocol.dom.methodsrP   rQ   rR   pydoll.protocol.fetch.typesrS   rT   rU   pydoll.protocol.network.eventsrV   pydoll.protocol.network.methodsrW   NetworkGetCookiesResponserX   rY   rZ   r[   r\   r]   pydoll.protocol.page.methodsr^   r_   r`   ra   rb   pydoll.protocol.storage.methodsStorageGetCookiesResponsepydoll.protocol.target.methodsrc   rd   	getLoggerr  r   rf   __annotations__rg   r  r  r  re   rp  r   r   r   <module>r     st   "    	     *        +   0 . 4 2 2    $ 5 @ @ 4 Q : 6 1 J 
 7 3  46< 
 a`E_G  C  Y_Y			8	$	 C():  -.J-K2N  + Y?
 Y?x:"4 "4r   