a
    7ñ»jÔª  ã                   @  sŽ  U d Z 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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 dd	lmZm Z m!Z!m"Z"m#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,m-Z-m.Z. d
dl/m0Z0 e	 1e2¡Z3dd„ Z4dd„ Z5G dd„ dƒZ6e7ƒ Z8de9d< G dd„ dƒZ:G dd„ dƒZ;e <e5¡ dS )zCDP-Driver is based on NoDriveré    )ÚannotationsN)Údefaultdict)Úsuppress©Úconfig)Ú	constants)Úshared_utils)ÚListÚOptionalÚSetÚTupleÚUnioné   )Úcdp_util©Útab)Ú
ContraDict)ÚPathLikeÚConfigÚis_posix)Ú
Connectionc                   C  s   t S ©N)Ú__registered__instances__© r   r   úPE:\soccer\ml_env\Lib\site-packages\seleniumbase/undetected/cdp_driver/browser.pyÚget_registered_instances"   s    r   c                  C  s*  t D �]} | js| jdd� d}t|ƒD ]è}zX| jr‚| jjs‚tj | jj	¡r^t
j| jj	dd� tj | jj	¡sxW  �qn
t d¡ W q( tyž   Y  �qY q( ttf�y } zT||d krät d| jj	|f ¡ W Y d }~ �qt d¡ W Y d }~q(W Y d }~q(d }~0 0 q(t d	| jj	 ¡ qd S )
NT)Údeconstructé   F)Úignore_errorsg¸…ëQ¸¾?r   zaProblem removing data dir %s
Consider checking whether it's there and remove it by hand
error: %szTemp profile %s was removed.)r   ÚstoppedÚstopÚranger   Zuses_custom_data_dirÚosÚpathÚexistsÚuser_data_dirÚshutilÚrmtreeÚtimeÚsleepÚFileNotFoundErrorÚPermissionErrorÚOSErrorÚloggerÚdebugÚlogging)Ú_Úmax_attemptsÚattemptÚer   r   r   Údeconstruct_browser&   s6    
ÿ

ýÿ
$r4   c                   @  sî  e Zd ZU dZded< ded< dZded< dZd	ed
< ded< ded< edhddddddddddœ	ddddddddddd dœdd„ƒZddœdd„Z	e
dd„ ƒZe
ddœd d!„ƒZe
d"dœd#d$„ƒZe
d	dœd%d&„ƒZe
d'd(„ ƒZdid*d d+œd,d-„ZeZd.d/œd0d1„Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Zdjdddd?œd@dA„Zdkd dœdBdC„ZdldDdEdFœdGdH„ZdIdJ„ ZdKdL„ ZdmddNœdOdP„ZdQdœdRdS„ZdTdU„ Z dVdW„ Z!dXdY„ Z"dZd[„ Z#d\d]„ Z$d^d_„ Z%dnd`da„Z&dbdc„ Z'ddde„ Z(dfdg„ Z)dS )oÚBrowsera  
    The Browser object is the "root" of the hierarchy
    and contains a reference to the browser parent process.
    There should usually be only 1 instance of this.
    All opened tabs, extra browser screens,
    and resources will not cause a new Browser process,
    but rather create additional :class:`Tab` objects.
    So, besides starting your instance and first/additional tabs,
    you don't actively use it a lot under normal conditions.
    Tab objects will represent and control:
     - tabs (as you know them)
     - browser windows (new window)
     - iframe
     - background processes
    Note:
    The Browser object is not instantiated by __init__
    but using the asynchronous :meth:`Browser.create` method.
    Note:
    In Chromium based browsers, there is a parent process which keeps
    running all the time, even if there are no visible browser windows.
    Sometimes it's stubborn to close it, so make sure that after using
    this library, the browser is correctly and fully closed/exited/killed.
    zasyncio.subprocess.ProcessÚ_processÚintÚ_process_pidNÚHTTPApiÚ_httpÚ	CookieJarÚ_cookiesr   r   r   Ú
connectionFT©	r%   ÚheadlessÚ	incognitoÚguestÚbrowser_executable_pathÚbrowser_argsÚsandboxÚhostÚportr   Úboolz	List[str]Ústr)r   r%   r?   r@   rA   rB   rC   rD   rE   rF   Úreturnc       	         Ë  s|   |s*t f ||||||pg ||	|
dœ	|¤Ž}z| |ƒ}| ¡ I dH  W n2 tyv   t d¡ | |ƒ}| ¡ I dH  Y n0 |S )z%Entry point for creating an instance.r>   Nç333333Ã?)r   ÚstartÚ	Exceptionr(   r)   )Úclsr   r%   r?   r@   rA   rB   rC   rD   rE   rF   ÚkwargsÚinstancer   r   r   Úcreatee   s,    ÷
ö
zBrowser.creater   c                 K  s‚   zt  ¡  W n$ ty0   td | jj¡ƒ‚Y n0 || _g | _d| _d| _	d| _
d| _d| _t  ¡ | _d| _t dt| ƒ ¡ dS )zn
        Constructor. To create a instance, use :py:meth:`Browser.create(...)`
        :param config:
        z>{0} objects of this class are created using await {0}.create()NzSession object initialized: %s)ÚasyncioÚget_running_loopÚRuntimeErrorÚformatÚ	__class__Ú__name__r   ÚtargetsÚinfoÚ_targetr6   r8   Z_keep_user_data_dirÚEventZ_is_updatingr=   r-   r.   Úvars)Úselfr   rN   r   r   r   Ú__init__Œ   s$    þÿ

zBrowser.__init__c                 C  s   | j jS r   )rX   ÚwebSocketDebuggerUrl©r\   r   r   r   Úwebsocket_url¥   s    zBrowser.websocket_urlztab.Tab)rI   c                 C  s   t | jdd„ dd�d S )z7Returns the target which was launched with the browser.c                 S  s
   | j dkS ©NÚpage©Útype_)Úxr   r   r   Ú<lambda>­   ó    z"Browser.main_tab.<locals>.<lambda>T)ÚkeyÚreverser   )ÚsortedrW   r_   r   r   r   Úmain_tab©   s
    ÿþzBrowser.main_tabzList[tab.Tab]c                 C  s   t dd„ | jƒ}t|ƒS )z5Returns the current targets which are of type "page".c                 S  s
   | j dkS ra   rc   ©Úitemr   r   r   rf   ³   rg   zBrowser.tabs.<locals>.<lambda>)ÚfilterrW   Úlist)r\   Útabsr   r   r   rp   °   s    zBrowser.tabsc                 C  s   | j st| ƒ| _ | j S r   )r<   r;   r_   r   r   r   Úcookies¶   s    
zBrowser.cookiesc                 C  s   | j r| j jd u rdS dS )NFT)r6   Ú
returncoder_   r   r   r   r   ¼   s    zBrowser.stoppedr   zUnion[float, int])r(   rI   c                 Ã  s   t j|| d�I dH S )zwWait for <time> seconds. Important to use,
        especially in between page navigation.
        :param time:
        )ÚresultN)rQ   r)   )r\   r(   r   r   r   ÚwaitÂ   s    zBrowser.waitzsUnion[cdp.target.TargetInfoChanged, cdp.target.TargetDestroyed, cdp.target.TargetCreated, cdp.target.TargetCrashed]©Úeventc              	   ƒ  s¢  t ˆ tjjƒr ˆ j‰tt‡fdd„| jƒƒ}|j}t 	¡ dkržt
 |ˆ¡}d}|D ]*}|\}}}	|d|› d|› d|	› d�7 }qRt d| j |¡|f ¡ ˆ|_nþt ˆ tjjƒ�rPˆ j‰d	| jj› d
| jj› dˆjpÔd› dˆj› �}
tj|
ˆ| d�4 I dH š<}| j |¡ t dt| jƒ|f ¡ W d  ƒI dH  �qž1 I dH �sD0    Y  nNt ˆ tjjƒ�ržtt‡ fdd„| jƒƒ}t d| j |¡|f ¡ | j |¡ dS )zhThis is an internal handler which updates the targets
        when Chrome emits the corresponding event.c                   s   | j ˆ j kS r   ©Ú	target_idrl   )Útarget_infor   r   rf   Ú   rg   z/Browser._handle_target_update.<locals>.<lambda>é
   Ú Ú
z: z => zTarget #%d has changed: %súws://ú:z
/devtools/rb   ú/)r`   ÚtargetÚbrowserNzTarget #%d created => %sc                   s   | j ˆ j kS r   rw   rl   ru   r   r   rf      rg   zTarget removed. id # %d => %s)Ú
isinstanceÚcdpr€   ÚTargetInfoChangedry   Únextrn   rW   r-   ÚgetEffectiveLevelÚutilZcompare_target_infor.   ÚindexÚTargetCreatedr   rE   rF   rd   rx   r   ZTabÚappendÚlenÚTargetDestroyedÚremove)r\   rv   Zcurrent_tabZcurrent_targetÚchangesZchanges_stringZchangerh   ÚoldÚnewr`   Ú
new_targetr   )rv   ry   r   Ú_handle_target_updateË   sp    
þÿÿ
ÿÿÿþÿýÿÿ4
þÿÿÿzBrowser._handle_target_updatec                 C  s   | j jS r   )r   rE   r_   r   r   r   Úget_rd_host
  s    zBrowser.get_rd_hostc                 C  s   | j jS r   )r   rF   r_   r   r   r   Úget_rd_port  s    zBrowser.get_rd_portc                 C  s*   dt jd< | jj}| jj}d|› d|› �S )a1  Returns the remote-debugging URL, which is used for
        allowing the Playwright integration to launch stealthy.
        Also sets an environment variable to hide this warning:
        Deprecation: "url.parse() behavior is not standardized".
        (github.com/microsoft/playwright-python/issues/3016)Ú1ZNODE_NO_WARNINGSzhttp://r~   )r"   Úenvironr   rE   rF   )r\   rE   rF   r   r   r   Ú
get_rd_url  s    
zBrowser.get_rd_urlc                 C  s   |   ¡ S r   )r—   r_   r   r   r   Úget_endpoint_url  s    zBrowser.get_endpoint_urlc                 C  s   |   ¡ S r   )r”   r_   r   r   r   Úget_port  s    zBrowser.get_portc                 ƒ  sv   ddœ‡‡‡fdd„‰ ddœ‡fdd„‰ˆ  tjj‡fdd	„¡ ˆ  tjj‡ fd
d	„¡ ˆ tjjdd�¡I d H  d S )Nzcdp.fetch.AuthRequiredru   c              	   “  s0   ˆ  tjj| jtjjdˆˆ d�d�¡I d H  d S )NZProvideCredentials)ÚresponseÚusernameÚpassword)Ú
request_idZauth_challenge_response)Úsendrƒ   ÚfetchZcontinue_with_authr�   ZAuthChallengeResponseru   )rœ   r   r›   r   r   Úauth_challenge_handler"  s    ýþÿz0Browser.set_auth.<locals>.auth_challenge_handlerzcdp.fetch.RequestPausedc                 “  s    ˆ   tjj| jd�¡I d H  d S )N)r�   )rž   rƒ   rŸ   Zcontinue_requestr�   ru   r   r   r   Ú
req_paused.  s    ÿz$Browser.set_auth.<locals>.req_pausedc                   s   t  ˆ | ƒ¡S r   ©rQ   Úcreate_taskru   )r¡   r   r   rf   5  rg   z"Browser.set_auth.<locals>.<lambda>c                   s   t  ˆ | ƒ¡S r   r¢   ru   )r    r   r   rf   :  rg   T)Zhandle_auth_requests)Úadd_handlerrƒ   rŸ   ZRequestPausedZAuthRequiredrž   Úenable)r\   r›   rœ   r   r   )r    rœ   r¡   r   r›   r   Úset_auth!  s    
þ
þzBrowser.set_authúabout:blank)Únew_tabÚ
new_windowrI   c                 ‹  s  t  d¡I dH  |r$d|vr$d| }|s,|rl| j tjj||dd�¡I dH ‰ tt‡ fdd„| j	ƒƒ}| |_
nVz| j	d	 }| d¡I dH  W n6 tyÀ   ttd
d„ | j	ƒƒ}| d¡I dH  Y n0 d}d}d}d}	d}
d}d}d}d}ttddƒrøtj}ttddƒ�rtj}ttddƒ�r tj}ttddƒ�r4tj}	ttddƒ�rHtj}ttddƒ�r\tj}ttddƒ�rptj}ttddƒ�r„tj}
d|v �r˜|d }nd|v �rª|d }d|v �r¾|d }nd|v �rÐ|d }d|v �rä|d }n&d|v �rø|d }nd|v �r
|d }d|v �r|d }	nd|v �r0|d }	d|v �rB|d }
d|v �rV|d }nd|v �rh|d }d|v �rz|d }d |v �rŒ|d  }d!|v �rž|d! }| d"¡I dH  | tj ¡ ¡I dH  | d"¡I dH  |�rê| |¡I dH  |�r | |¡I dH  |�s|�s|	�r(|j|||	d#�I dH  |�rL| tjjg d$¢d%�¡I dH  |�rb| |¡I dH  |
�r‚| tjjdd&�¡I dH  |�r¨| tjj d'd(d)dd*�¡I dH  ttd+dƒ�rBd,tj!v �rBd-|v�rBtj! "d,¡d. }| "d¡d. }| "d¡d/ }t#| j$d0ƒ�r| j$j%|k�rn,|| j$_%|  &||| j'd. ¡I dH  t( d1¡ d-|v �rÒ|d- �rÒd|d- v �rÒ|d- }| "d¡d. }| "d¡d/ }t#| j$d0ƒ�r¦| j$j%|k�r¦n,|| j$_%|  &||| j'd. ¡I dH  t( d1¡ | d2¡I dH  | tj )|¡¡I dH ^}}}d}z&t*| j+d3  "d4¡d	  "d5¡d. ƒ}W n t�y>   Y n0 |�rÒt#td6ƒ�rntj
d7k�rÒ|�rn|d8k�rÒd.d9l,m-} d:| }| tj .|¡¡I dH  | d1¡I dH  |  /d;¡I dH  | tj0 1|¡¡I dH  ||_2| |_
| d1¡I dH  |  /d;¡I dH  |S )<aT  Top level get. Utilizes the first tab to retrieve given url.
        Convenience function known from selenium.
        This function detects when DOM events have fired during navigation.
        :param url: The URL to navigate to
        :param new_tab: Open new tab
        :param new_window: Open new window
        :return: Page
        g{®Gázt?Nr~   zhttps://T)r©   Zenable_begin_frame_controlc                   s   | j dko| jˆ kS ra   )rd   rx   rl   rw   r   r   rf   Z  s    zBrowser.get.<locals>.<lambda>éÿÿÿÿc                 S  s
   | j dkS ra   rc   rl   r   r   r   rf   i  rg   r{   Ú_cdp_timezoneÚ_cdp_user_agentÚ_cdp_localeÚ_cdp_platformÚ_cdp_geolocationÚ_cdp_mobile_modeÚad_block_onÚdisable_cspÚtimezoneZtzoneÚ
user_agentZagentÚlocaleÚlangZlocale_codeÚplatformÚplatÚgeolocationZgeolocZad_blockÚmobileZrecorderg{®Gáz„?)r´   Zaccept_languager·   ) z*.cloudflareinsights.com*z*.googlesyndication.com*z*.googletagmanager.com*z*.google-analytics.com*z*.amazon-adsystem.com*z*.adsafeprotected.com*z*.ads.linkedin.com*z*.casalemedia.com*z*.doubleclick.net*z*.admanmedia.com*z*.quantserve.com*z*.fastclick.net*z*.snigelweb.com*z*.bidswitch.net*z*.360yield.com*z*.adthrive.com*z*.pubmatic.com*z*.id5-sync.com*z*.moatads.com*z*.dotomi.com*z*.adsrvr.org*z*.atmtd.com*z*.liadm.com*z*.loopme.me*z*.adnxs.com*z*.openx.net*z*.tapad.com*z*.3lift.com*z*.turn.com*z*.2mdn.net*z	*.cpx.to*z*.ad.gt*)Úurls)Úenablediœ  iÜ  é   )ÚwidthÚheightZdevice_scale_factorrº   Ú
_cdp_proxyú@Úauthr   r   Ú
_last_authg      Ð?rJ   r5   r   Ú.r�   ÚchromeéŽ   )Úrecorder_jsz"window.onload = function() { %s };çš™™™™™©?)3rQ   r)   r=   rž   rƒ   r€   Zcreate_targetr…   rn   rW   r�   rL   ÚgetattrÚ	sb_configr«   r¬   r­   r®   r¯   r°   r±   r²   Únetworkr¥   Zset_timezoneZ
set_localeZset_user_agentZset_blocked_urlsZset_geolocationrb   Zset_bypass_cspZ	emulationZset_device_metrics_overriderÀ   ÚsplitÚhasattrrk   rÃ   r¦   rp   r(   Znavigater7   rX   Z seleniumbase.js_code.recorder_jsrÇ   Z&add_script_to_evaluate_on_new_documentrt   ZruntimeÚevaluateÚframe_id)r\   Úurlr¨   r©   rN   r=   r«   r¬   r­   r®   Z_cdp_disable_cspr¯   r°   Z_cdp_recorderZ_cdp_ad_blockZusername_and_passwordZ
proxy_userZ
proxy_passrÏ   Z	loader_idr0   Zmajor_browser_versionrÇ   Zrecorder_coder   rw   r   Úget?  sR   ÿÿ

üÿ
ÿ




















ý
ÿ$ÿÿ

ÿþý
ÿ
þ
"
ÿ
þ

ÿ ÿÿýûùøÿ
ÿ
zBrowser.getc           
   	   Ã  st  | st  d¡ dS | js| jrL| jjdur>| j| jd�I dH S t  d¡ dS d}| jjdurn| jjdurnd}nd| j_t	 
¡ | j_|sÀt d| jj ¡ t | jj¡ ¡ sÀtd	 tr¸d
nd¡ƒ‚t| jddƒrò| j dd dd„ | jjD ƒ¡ ¡ | jj}|  ¡ }t d|d |¡¡ |�shtj|g|¢R tjjtjjtjjtdœŽI dH | _t d¡I dH  | jj| _t d¡I dH  t| jj| jjfƒ| _t d¡I dH  t ƒ  !| ¡ t d¡I dH  d}t"|ƒD ]r}z t#| j $d¡I dH dd�| _%W nD t&f�y.   ||d k�rtjddd� n|  d¡I dH  Y n0  �q:�qÆ| j%�s´d}tt'ddƒ�rrt'j(}|d  )¡ |dd…  }d }|�rŠt*j+ |¡�s’d!| }t,|ƒ}d"| }	t&d#|	||	f ƒ‚t d$¡I dH  t-| j%j.| d%�| _/t d$¡I dH  | jj0�rft d&¡ | j1g| j/j2t3j4j5< | j1g| j/j2t3j4j6< | j1g| j/j2t3j4j7< | j1g| j/j2t3j4j8< | j/ 9t3j4j:dd'�¡I dH  | I dH  dS )(zLaunches the actual browser.z8Use ``await Browser.create()`` to create a new instance!Nr   z6Ignored! This call has no effect when already running!FTz	127.0.0.1zBROWSER EXECUTABLE PATH: %saŽ  
                    ---------------------------------------
                    Could not determine browser executable.
                    ---------------------------------------
                    Browser must be installed in the default location / path!
                    If you are sure about the browser executable,
                    set it using `browser_executable_path='{}` parameter.z /path/to/your/browser/executablezc:/path/to/your/browser.exeÚ_extensionsz--load-extension=%sú,c                 s  s   | ]}t |ƒV  qd S r   )rH   )Ú.0r0   r   r   r   Ú	<genexpr>V  rg   z Browser.start.<locals>.<genexpr>z'Starting
	executable :%s

arguments:
%sz
	)ÚstdinÚstdoutÚstderrÚ	close_fdsrÈ   rJ   é   Úversion)Zsilentr   zCould not start©Úexc_infogš™™™™™É?ZChromiumÚ_cdp_browserr   z Failed to connect to the browserz)%s executable not found. Is it installed?ú-zJ
                %s
                %s
                %s
                g¸…ëQ¸ž?©r�   zEnabling autodiscover targets)Údiscover);ÚwarningsÚwarnr6   r8   rr   rP   r   rE   rF   r‡   Z	free_portr-   r.   rB   ÚpathlibÚPathr$   r*   rT   r   rÉ   Úadd_argumentÚjoinrÒ   rQ   Zcreate_subprocess_execÚ
subprocessÚPIPEr)   Úpidr9   r:   r   Úaddr!   r   rÑ   rX   rL   rÊ   rÞ   Úupperr"   r#   r‹   r   r^   r=   Zautodiscover_targetsr’   Úhandlersrƒ   r€   r„   r‰   rŒ   ZTargetCrashedrž   Zset_discover_targets)
r\   Zconnect_existingÚexeÚparamsr1   r2   ZchromiumÚmessageZdash_lenÚdashesr   r   r   rK   )  sÜ    ÿÿÿÿÿ
ÿõÿÿÿýÿþúÿ

ÿ
ÿüÿÿ

ÿÿÿÿÿ
zBrowser.startzList[str] | strzOptional[str])ÚpermissionsÚoriginc                 Ã  s0   t |tƒr|g}| j tj ||¡¡I dH  dS )zkGrant specific permissions to the current window.
        Applies to all origins if no origin is specified.N)r‚   rH   r=   rž   rƒ   r�   Úgrant_permissions)r\   rò   ró   r   r   r   rô   «  s
    
ÿzBrowser.grant_permissionsc                 Ã  s&   g d¢}| j  tj |¡¡I dH  dS )a…  
        Grant permissions for:
            audioCapture
            backgroundSync
            backgroundFetch
            clipboardReadWrite
            clipboardSanitizedWrite
            displayCapture
            durableStorage
            geolocation
            idleDetection
            localFonts
            midi
            midiSysex
            nfc
            notifications
            paymentHandler
            periodicBackgroundSync
            sensors
            storageAccess
            topLevelStorageAccess
            videoCapture
            wakeLockScreen
            wakeLockSystem
            windowManagement
        )ZaudioCaptureZbackgroundSyncZbackgroundFetchZclipboardReadWriteZclipboardSanitizedWriteZdisplayCaptureZdurableStorager¹   ZidleDetectionZ
localFontsZmidiZ	midiSysexZnfcZnotificationsZpaymentHandlerZperiodicBackgroundSyncZsensorsZstorageAccessZtopLevelStorageAccessZvideoCaptureZwakeLockScreenZwakeLockSystemZwindowManagementN)r=   rž   rƒ   r�   rô   )r\   rò   r   r   r   Úgrant_all_permissions¸  s    zBrowser.grant_all_permissionsc                 Ã  s   | j  tj ¡ ¡I dH  dS )z8Reset permissions for all origins on the current window.N)r=   rž   rƒ   r�   Úreset_permissionsr_   r   r   r   rö   î  s    zBrowser.reset_permissionsr   )Úmax_columnsc                 Ã  s<  dd l }zdd l}W nV tyj   t tjj¡}|� t 	d¡ W d   ƒ n1 sT0    Y  dd l}Y n0 | ¡ }d\}}}	|j
r¬t|j
ƒdkr¬|j
d }|d }|d }	|r¸|r¸|	sÆt d¡ d S | I d H  ttƒ}
|râ|}n| j}|D ]$}| ¡ I d H \}}|
|  |¡ qìt|
ƒ}|�p*t|d ƒ}t|| ƒ}|| |k �rR|d7 }�q8| || d ¡}| |	| ¡}t|
 ¡ ƒ}g }t|ƒD ]¬}t|ƒD ]œ}zt|ƒ}W n t�yÀ   Y �q–Y n0 |�sÌ�q–|d }z2|| || ||g}| |¡ |j|Ž I d H  W n( t�y.   tjd	d
d� Y �q–Y n0 �q–�qŠ|S )Nr   Úmss)NNNr   r¾   r¿   zNo monitors detected!gUUUUUU	@z(Could not set window size. Exception => TrÜ   )Úmathrø   rL   Ú	fastenersZInterProcessLockr   Z
PipInstallZFINDLOCKr   Zpip_installZmonitorsr‹   râ   rã   r   ro   rp   Z
get_windowrŠ   r7   ÚfloorÚiterÚvaluesr!   r…   ÚStopIterationZset_window_sizer-   rX   )r\   Úwindowsr÷   rù   rø   Zpip_find_lockÚmÚscreenZscreen_widthZscreen_heightZdistinct_windowsrp   Ú_tabZ	window_idZboundsZnum_windowsZreq_colsZreq_rowsZbox_wZbox_hZdistinct_windows_iterÚgridre   Úyr   Úposr   r   r   Útile_windowsò  sp    ÿ(




þzBrowser.tile_windowszList[cdp.target.TargetInfo]c                 Ã  s    | j jtj ¡ dd�I d H }|S )NT)Z
_is_update)r=   rž   rƒ   r€   Zget_targets)r\   rX   r   r   r   Ú_get_targets-  s    
ÿzBrowser._get_targetsc              
   Ã  s�   |   ¡ I d H }|D ]h}| jD ]*}|j}|j|jkr|jj |j¡  qq| j td| jj	› d| jj
› d|j› �|| d�¡ qt d¡I d H  d S )Nr}   r~   z/devtools/page/)r€   r�   r   )r  rW   r€   rx   Ú__dict__ÚupdaterŠ   r   r   rE   rF   rQ   r)   )r\   rW   ÚtZexisting_tabZexisting_targetr   r   r   Úupdate_targets3  s"    
þùÿzBrowser.update_targetsc                 Ã  s   | S r   r   r_   r   r   r   Ú
__aenter__J  s    zBrowser.__aenter__c                 Ã  s   |r|r||ƒ‚d S r   r   )r\   Úexc_typeÚexc_valÚexc_tbr   r   r   Ú	__aexit__M  s    zBrowser.__aexit__c                 C  s   | j  | j¡| _| S r   )rp   rˆ   rk   Ú_ir_   r   r   r   Ú__iter__Q  s    zBrowser.__iter__c                 C  s   t t| jƒƒS r   )Úreversedro   rp   r_   r   r   r   Ú__reversed__U  s    zBrowser.__reversed__c              	   C  sÚ   z¤z>| j | j W W t| dƒr@| jt| j ƒkr<|  jd7  _S | `S  tyZ   | `t‚Y n tyr   | `t‚Y n0 W t| dƒrÖ| jt| j ƒkr |  jd7  _qÖ| `n0t| dƒrÔ| jt| j ƒkrÐ|  jd7  _n| `0 d S )Nr  r   )rp   r  rÍ   r‹   Ú
IndexErrorrþ   ÚAttributeErrorr_   r   r   r   Ú__next__X  s*    
ô
ü
zBrowser.__next__c                 C  s8  t tdƒrttjtƒsg t_d }ttƒ� | jjj	j
}W d   ƒ n1 sJ0    Y  d}z(| jr~t ¡  | j ¡ ¡ t d¡ W nJ tyÊ   | jrÆzt | j ¡ ¡ t d¡ W n tyÄ   Y n0 Y n0 tdƒD �]j}zL|tjv�r"| j ¡  t d| jj ¡ |�rtj |¡ d}W  �qBW �n tf�y2   z*| j ¡  t d| jj ¡ W Y  �qBW nÊ tf�y,   z<t | d	ƒ�r®t | jd
¡ t d| jj ¡ W Y Y  �qBW nv tf�yÔ   tjddd� Y nT tf�yò   t d¡ Y n6 tf�y   t d¡ Y n tf�y&   ‚ Y n0 Y n0 Y n0 d | _d | _qÔt tdƒ�r–ttjt ƒ�r–|�r–t tdƒ�r–tj!�r–t jd8  _tjdk �r–dt_t" #¡ �rt tdƒ�rtj!�rt tj!dƒ�rtjdk�rztj! $¡  d t_!dt_%W n& t&�yü   Y n t�y   Y n0 |�r4|�r4|tjv �r4tj '|¡ d S )NÚ_closed_connection_idsFz6Closed connection using get_event_loop().create_task()z)Closed the connection using asyncio.run()r½   z,Terminated browser with pid %d successfully.Tz(Killed browser with pid %d successfully.Zbrowser_process_pidé   z8Killed browser with pid %d using signal 15 successfully.Ú	TypeErrorrÜ   z8Browser already stopped, or no permission to kill. Skip.ÚProcessLookupErrorÚ_xvfb_usersÚ_virtual_displayr   r   r    )(rÍ   rÊ   r‚   r  ro   r   rL   r=   Z	websocketÚidÚhexrQ   Zget_event_loopr£   Úacloser-   r.   rS   Úrunr!   r6   Ú	terminaterê   rŠ   Úkillr"   r8   r  rX   r+   r  r  r7   r  r   Zis_linuxr    Zheadless_activer  r�   )r\   r   Zconnection_idZclose_successr0   r   r   r   r    h  sÖ    ÿ
þ
*ÿ
ÿÿ
ÿÿþÿÿ
ÿ
þýüûÿýü
ûù	

ÿþýzBrowser.stopc                 C  s   |   ¡  d S r   )r    r_   r   r   r   ÚquitÏ  s    zBrowser.quitc                 C  s   |   ¡  ¡ S r   )r  Ú	__await__r_   r   r   r   r%  Ò  s    zBrowser.__await__c                 C  s   d S r   r   r_   r   r   r   Ú__del__Ö  s    zBrowser.__del__)N)r   )r§   FF)N)N)Nr   )F)*rV   Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r:   r<   ÚclassmethodrP   r]   Úpropertyr`   rk   rp   rq   r   rt   r)   r’   r“   r”   r—   r˜   r™   r¦   rÑ   rK   rô   rõ   rö   r  r  r  r  r  r  r  r  r    r$  r%  r&  r   r   r   r   r5   F   s~   
 þô(&

?    ü k  ý6;
gr5   zSet[Browser]r   c                   @  sf   e Zd Zddœdd„Zddddœd	d
„Zddœdd„Zddddœdd„Zddddœdd„Zdd„ ZdS )r;   r5   rà   c                 C  s
   || _ d S r   )Ú_browser)r\   r�   r   r   r   r]   Þ  s    zCookieJar.__init__FrG   z8List[Union[cdp.network.Cookie, 'http.cookiejar.Cookie']])Úrequests_cookie_formatrI   c                 ƒ  sh   d}| j jD ]}t|ddƒrq|} q0q| j j}| tj ¡ ¡I dH }|rdddl‰ ‡ fdd„|D ƒS |S )zñ
        Get all cookies.
        :param requests_cookie_format: when True,
         returns python http.cookiejar.Cookie objects,
         compatible with requests library and many others.
        :type requests_cookie_format: bool
        NÚclosedr   c              
     s0   g | ](}ˆ j j|j|j|j|j|j|jd �‘qS ))ÚnameÚvalueÚdomainr#   ÚexpiresÚsecure)rq   Úcreate_cookier0  r1  r2  r#   r3  r4  )rÔ   Úc©Úrequestsr   r   Ú
<listcomp>÷  s   	øúz%CookieJar.get_all.<locals>.<listcomp>)	r-  rp   rÉ   r=   rž   rƒ   rË   Úget_cookiesZrequests.cookies)r\   r.  r=   r  rq   r   r7  r   Úget_allá  s    

	÷zCookieJar.get_allzList[cdp.network.CookieParam])rq   c                 Ã  sL   d}| j jD ]}t|ddƒrq|} q0q| j j}| tj |¡¡I dH  dS )zF
        Set cookies.
        :param cookies: List of cookies
        Nr/  )r-  rp   rÉ   r=   rž   rƒ   rË   Úset_cookies)r\   rq   r=   r  r   r   r   Úset_all  s    zCookieJar.set_allú.session.datú.*r   rH   )ÚfileÚpatternc           
      Ã  sÒ   t  |¡}t |¡ ¡ }d}| jjD ]}t|ddƒr6q$|} qHq$| jj}| 	t
j ¡ ¡I dH }| jdd�I dH }g }|D ]B}| t|jƒ¡D ],}	t d|j|j|jf ¡ | |¡  qxqŒqxt || d¡¡ dS )ah  
        Save all cookies (or a subset, controlled by `pattern`)
        to a file to be restored later.
        :param file:
        :param pattern: regex style pattern string.
                any cookie that has a  domain, key or value field
                which matches the pattern will be included.
            default = ".*"  (all)
            Eg: the pattern "(cf|.com|nowsecure)" will include cookies which:
                - Have a string "cf" (cloudflare)
                - Have ".com" in them, in either domain, key or value field.
                - Contain "nowsecure"
        :type pattern: str
        Nr/  F)r.  z2Saved cookie for matching pattern '%s' => (%s: %s)zw+b)ÚreÚcompilerä   rå   Úresolver-  rp   rÉ   r=   rž   rƒ   rË   r:  r;  ÚfinditerrH   r  r-   r.   rA  r0  r1  rŠ   ÚpickleÚdumpÚopen)
r\   r@  rA  Ú	save_pathr=   r  rq   Úincluded_cookiesÚcookieÚmatchr   r   r   Úsave  s,    
ÿÿ
zCookieJar.savec           
      Ã  sÀ   t  |¡}t |¡ ¡ }t | d¡¡}g }d}| jj	D ]}t
|ddƒrJq8|} q\q8| jj}|D ]B}| t|jƒ¡D ],}	| |¡ t d|j|j|jf ¡  q`qtq`| tj |¡¡I dH  dS )ax  
        Load all cookies (or a subset, controlled by `pattern`)
        from a file created by :py:meth:`~save_cookies`.
        :param file:
        :param pattern: Regex style pattern string.
               Any cookie that has a  domain, key,
               or value field which matches the pattern will be included.
            Default = ".*"  (all)
            Eg: the pattern "(cf|.com|nowsecure)" will include cookies which:
                - Have a string "cf" (cloudflare)
                - Have ".com" in them, in either domain, key or value field.
                - Contain "nowsecure"
        :type pattern: str
        zr+bNr/  z3Loaded cookie for matching pattern '%s' => (%s: %s))rB  rC  rä   rå   rD  rF  ÚloadrH  r-  rp   rÉ   r=   rE  rH   r  rŠ   r-   r.   rA  r0  r1  rž   rƒ   rË   r<  )
r\   r@  rA  rI  rq   rJ  r=   r  rK  rL  r   r   r   rN  ?  s*    

ÿÿzCookieJar.loadc                 Ã  sd   d}| j jD ]}t|ddƒrq|} q0q| j j}| tj ¡ ¡I dH }|r`| tj 	¡ ¡I dH  dS )zl
        Clear current cookies.
        Note: This includes all open tabs/windows for this browser.
        Nr/  )
r-  rp   rÉ   r=   rž   rƒ   rË   r:  ZstorageZclear_cookies)r\   r=   r  rq   r   r   r   Úcleard  s    zCookieJar.clearN)F)r>  r?  )r>  r?  )	rV   r'  r(  r]   r;  r=  rM  rN  rO  r   r   r   r   r;   Ý  s    ÿ#,%r;   c                   @  sN   e Zd Zddœdd„Zedd„ ƒZddœd	d
„Zdd„ Zddddœdd„ZdS )r9   zTuple[str, int])Úaddrc                 C  s"   |\| _ | _d| j | jf | _d S )Nzhttp://%s:%d)rE   rF   Úapi)r\   rP  r   r   r   r]   w  s    zHTTPApi.__init__c                 C  s"   t j |j¡}| |j|jfƒ}|S r   )ÚurllibÚparseÚurlparser`   ÚhostnamerF   )rM   r€   Zws_urlÚinstr   r   r   Úfrom_target{  s    zHTTPApi.from_targetrH   )Úendpointc                 Ã  s   |   |¡I d H S r   ©Ú_request)r\   rX  r   r   r   rÑ   �  s    zHTTPApi.getc                 Ã  s   |   ||¡I d H S r   rY  )r\   rX  Údatar   r   r   Úpost„  s    zHTTPApi.postÚGETNÚdict)Úmethodr[  c                 ƒ  sž   t j | j|rd|› �nd¡}|r6| ¡ dkr6tdƒ‚|sD| j| }t j |¡‰ |ˆ _d ˆ _	|rrt
 |¡ d¡ˆ _	t ¡  d ‡ fdd„¡I d H }t
 | ¡ ¡S )Nzjson/z/jsonrÑ   z GET requests cannot contain datazutf-8c                     s   t jjˆ dd�S )Nrz   )Útimeout)rR  ÚrequestÚurlopenr   ©ra  r   r   rf   –  rg   z"HTTPApi._request.<locals>.<lambda>)rR  rS  ÚurljoinrQ  ÚlowerÚ
ValueErrorra  ÚRequestr_  r[  ÚjsonÚdumpsÚencoderQ   rR   Zrun_in_executorÚloadsÚread)r\   rX  r_  r[  rÐ   rš   r   rc  r   rZ  ‡  s     ÿ
ÿ
zHTTPApi._request)r]  N)	rV   r'  r(  r]   r+  rW  rÑ   r\  rZ  r   r   r   r   r9   v  s   
r9   )=r)  Ú
__future__r   rQ   Úatexitrú   Úhttp.cookiejarÚhttprh  r/   r"   rä   rF  rB  r&   r(   Úurllib.parserR  Úurllib.requestrâ   Úcollectionsr   Ú
contextlibr   Zseleniumbaser   rÊ   Zseleniumbase.fixturesr   r   Útypingr	   r
   r   r   r   Zmycdprƒ   r{   r   r‡   r   Z_contradictr   r   r   r   r=   r   Ú	getLoggerrV   r-   r   r4   r5   Úsetr   r*  r;   r9   Úregisterr   r   r   r   Ú<module>   sX   
         %