a
    Šxd½A  ã                   @   sœ   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	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 e  e¡ZG d	d
„ d
ƒZdS )é    N)Ú	b64encode)Úparse)Ú__version__é   )Úutils)ÚCommand)Ú	ErrorCodec                   @   sº   e Zd ZdZdZejZe 	¡ Z
edd„ ƒZedd„ ƒZedd„ ƒZed	d
„ ƒZedd„ ƒZed!dd„ƒZdd„ Zdd„ Zdd„ Zdd„ Zd"eeedœdd„Zdd„ Zd#dd„Zdd „ ZdS )$ÚRemoteConnectionz¹A connection with the Remote WebDriver server.

    Communicates with the server using the WebDriver wire protocol:
    https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol
    Nc                 C   s   | j tjkrdS | j S )zt
        :Returns:
            Timeout value in seconds for all http requests made to the Remote Connection
        N)Ú_timeoutÚsocketÚ_GLOBAL_DEFAULT_TIMEOUT©Úcls© r   úc/var/www/html/Ranjet/env/lib/python3.9/site-packages/selenium/webdriver/remote/remote_connection.pyÚget_timeout1   s    zRemoteConnection.get_timeoutc                 C   s
   || _ dS )zyOverride the default timeout.

        :Args:
            - timeout - timeout value for http requests in seconds
        N)r
   )r   Útimeoutr   r   r   Úset_timeout9   s    zRemoteConnection.set_timeoutc                 C   s   t j| _dS )zAReset the http request timeout to socket._GLOBAL_DEFAULT_TIMEOUT.N)r   r   r
   r   r   r   r   Úreset_timeoutB   s    zRemoteConnection.reset_timeoutc                 C   s   | j S )zv
        :Returns:
            Paths of the .pem encoded certificate to verify connection to command executor
        ©Ú	_ca_certsr   r   r   r   Úget_certificate_bundle_pathG   s    z,RemoteConnection.get_certificate_bundle_pathc                 C   s
   || _ dS )zóSet the path to the certificate bundle to verify connection to
        command executor. Can also be set to None to disable certificate
        validation.

        :Args:
            - path - path of a .pem encoded certificate chain.
        Nr   )r   Úpathr   r   r   Úset_certificate_bundle_pathO   s    	z,RemoteConnection.set_certificate_bundle_pathFc                 C   s€   t  ¡  ¡ }|dkrd}dddt› d|› ddœ}|jrjt|j› d	|j›  ¡ ƒ}| d
d| 	¡ › i¡ |r|| ddi¡ |S )z²Get headers for remote request.

        :Args:
         - parsed_url - The parsed url
         - keep_alive (Boolean) - Is this a keep-alive connection (default: False)
        ÚdarwinÚmaczapplication/jsonzapplication/json;charset=UTF-8z	selenium/z	 (python ú))ÚAcceptúContent-Typez
User-Agentú:ÚAuthorizationzBasic Ú
Connectionz
keep-alive)
ÚplatformÚsystemÚlowerr   Úusernamer   ÚpasswordÚencodeÚupdateÚdecode)r   Ú
parsed_urlÚ
keep_aliver#   ÚheadersZbase64stringr   r   r   Úget_remote_connection_headersZ   s    	ýz.RemoteConnection.get_remote_connection_headersc                 C   sH   | j  d¡r"tj dtj d¡¡S | j  d¡rDtj dtj d¡¡S d S )Nzhttps://Zhttps_proxyZHTTPS_PROXYzhttp://Z
http_proxyZ
HTTP_PROXY)Ú_urlÚ
startswithÚosÚenvironÚget©Úselfr   r   r   Ú_get_proxy_urlv   s    zRemoteConnection._get_proxy_urlc                 C   s>   | j }|| d¡d d … }d|v o<t|d | d¡… ƒdkS )Nr   é   ú@r   ©Ú
_proxy_urlÚfindÚlen)r4   Úurlr   r   r   Ú_identify_http_proxy_auth|   s    z*RemoteConnection._identify_http_proxy_authc                 C   s^   | j }|d | d¡d … }|t|ƒd … }|d | d¡… }||t|ƒd d …  }||fS )Nr   r6   r7   r   r8   )r4   r<   ÚprotocolZno_protocolÚauthZproxy_without_authr   r   r   Ú_separate_http_proxy_auth   s    z*RemoteConnection._separate_http_proxy_authc                 C   s¦   d|   ¡ i}| jr$d|d< | j|d< | jr–| j ¡  d¡rXddlm} || jfi |¤ŽS |  ¡ r‚|  ¡ \| _| _	t
j| j	d|d	< t
j| jfi |¤ŽS t
jf i |¤ŽS )
Nr   ÚCERT_REQUIREDÚ	cert_reqsÚca_certsÚsockr   )ÚSOCKSProxyManager)Úproxy_basic_authÚproxy_headers)r   r   r9   r$   r/   Zurllib3.contrib.socksrE   r=   r@   Z_basic_proxy_authÚurllib3Úmake_headersÚProxyManagerÚPoolManager)r4   Zpool_manager_init_argsrE   r   r   r   Ú_get_connection_manager‰   s    
z(RemoteConnection._get_connection_manager)Úremote_server_addrr+   Úignore_proxyc              œ   C   s’  || _ || _tj dtj d¡¡}|r”| d¡D ]b}| ¡ }|dkrLd} q”t |¡}t | j¡}|j	r~|j	|j	kr’d} q”q0|j
|j	v r0d} q”q0|s |  ¡ nd | _|r´|  ¡ | _tjdtjdtjdtjd	tjd
tjdtjdtjdtjdtjdtjdtjdtjdtjdtjdtjdtj dtj!dtj"dtj#dtj$dtj%dtj&dtj'dtj(dtj)dtj*d tj+d!tj,d"tj-d#tj.d$tj/d%tj0d&tj1d'tj2d(tj3d)tj4d*tj5d+tj6d,tj7d-tj8d.tj9d/tj:d0tj;d1tj<d2tj=d3tj>d4tj?d5tj@d6tjAd7tjBd8tjCd9tjDd:tjEd;tjFd<tjGd=tjHd>tjId?tjJd@tjKdAtjLdBtjMdCtjNdDtjOdEtjPdFtjQdGtjRdHtjSdItjTdJtjUdKtjVdLtjWdMtjXdNtjYdOtjZdPtj[dQtj\dRtj]dSiN| _^d S )TNÚno_proxyZNO_PROXYú,Ú*T)ÚPOSTz/session)ÚDELETEz/session/$sessionId)ÚGETú/session/$sessionId/window)rT   z"/session/$sessionId/window/handles)rR   ú/session/$sessionId/url)rR   z/session/$sessionId/forward)rR   z/session/$sessionId/back)rR   z/session/$sessionId/refresh)rR   z /session/$sessionId/execute/sync)rR   z!/session/$sessionId/execute/async)rT   rV   )rT   z/session/$sessionId/title)rT   z/session/$sessionId/source)rT   z/session/$sessionId/screenshot)rT   z*/session/$sessionId/element/$id/screenshot)rR   z/session/$sessionId/element)rR   z/session/$sessionId/elements)rT   z"/session/$sessionId/element/active)rR   z'/session/$sessionId/element/$id/element)rR   z(/session/$sessionId/element/$id/elements)rR   z%/session/$sessionId/element/$id/click)rR   z%/session/$sessionId/element/$id/clear)rT   z$/session/$sessionId/element/$id/text)rR   z%/session/$sessionId/element/$id/value)rR   z/session/$sessionId/se/file)rT   z$/session/$sessionId/element/$id/name)rT   z(/session/$sessionId/element/$id/selected)rT   z'/session/$sessionId/element/$id/enabled)rT   z$/session/$sessionId/element/$id/rect)rT   z//session/$sessionId/element/$id/attribute/$name)rT   z./session/$sessionId/element/$id/property/$name)rT   z,/session/$sessionId/element/$id/computedrole)rT   z-/session/$sessionId/element/$id/computedlabel)rT   z&/session/$sessionId/element/$id/shadow)rR   z,/session/$sessionId/shadow/$shadowId/element)rR   z-/session/$sessionId/shadow/$shadowId/elements)rT   ú/session/$sessionId/cookie)rR   rW   )rT   ú /session/$sessionId/cookie/$name)rS   rW   )rS   rX   )rR   z/session/$sessionId/frame)rR   z /session/$sessionId/frame/parent)rR   rU   )rR   z/session/$sessionId/window/new)rS   rU   )rT   z1/session/$sessionId/element/$id/css/$propertyName)rR   z!/session/$sessionId/execute_async)rR   ú/session/$sessionId/timeouts)rT   rY   )rR   z!/session/$sessionId/alert/dismiss)rR   z /session/$sessionId/alert/accept)rR   ú/session/$sessionId/alert/text)rT   rZ   )rR   ú/session/$sessionId/actions)rS   r[   )rR   ú/session/$sessionId/window/rect)rT   r\   )rR   z#/session/$sessionId/window/maximize)rR   ú/session/$sessionId/orientation)rT   r]   )rT   ú&/session/$sessionId/network_connection)rR   r^   )rR   z/session/$sessionId/se/log)rT   z /session/$sessionId/se/log/types)rT   ú/session/$sessionId/context)rT   z/session/$sessionId/contexts)rR   r_   )rR   z%/session/$sessionId/window/fullscreen)rR   z#/session/$sessionId/window/minimize)rR   z/session/$sessionId/print)rR   z*/session/$sessionId/webauthn/authenticator)rS   z;/session/$sessionId/webauthn/authenticator/$authenticatorId)rR   zF/session/$sessionId/webauthn/authenticator/$authenticatorId/credential)rT   úG/session/$sessionId/webauthn/authenticator/$authenticatorId/credentials)rS   zU/session/$sessionId/webauthn/authenticator/$authenticatorId/credentials/$credentialId)rS   r`   )rR   z>/session/$sessionId/webauthn/authenticator/$authenticatorId/uv)_r+   r.   r0   r1   r2   ÚsplitÚstripr   ÚurlparseÚnetlocr   r5   r9   rL   Ú_connr   ZNEW_SESSIONZQUITZW3C_GET_CURRENT_WINDOW_HANDLEZW3C_GET_WINDOW_HANDLESrT   Z
GO_FORWARDZGO_BACKZREFRESHZW3C_EXECUTE_SCRIPTZW3C_EXECUTE_SCRIPT_ASYNCZGET_CURRENT_URLZ	GET_TITLEZGET_PAGE_SOURCEZ
SCREENSHOTZELEMENT_SCREENSHOTZFIND_ELEMENTZFIND_ELEMENTSZW3C_GET_ACTIVE_ELEMENTZFIND_CHILD_ELEMENTZFIND_CHILD_ELEMENTSZCLICK_ELEMENTZCLEAR_ELEMENTZGET_ELEMENT_TEXTZSEND_KEYS_TO_ELEMENTZUPLOAD_FILEZGET_ELEMENT_TAG_NAMEZIS_ELEMENT_SELECTEDZIS_ELEMENT_ENABLEDZGET_ELEMENT_RECTZGET_ELEMENT_ATTRIBUTEZGET_ELEMENT_PROPERTYZGET_ELEMENT_ARIA_ROLEZGET_ELEMENT_ARIA_LABELZGET_SHADOW_ROOTZFIND_ELEMENT_FROM_SHADOW_ROOTZFIND_ELEMENTS_FROM_SHADOW_ROOTZGET_ALL_COOKIESZ
ADD_COOKIEZ
GET_COOKIEZDELETE_ALL_COOKIESZDELETE_COOKIEZSWITCH_TO_FRAMEZSWITCH_TO_PARENT_FRAMEZSWITCH_TO_WINDOWZ
NEW_WINDOWZCLOSEZ!GET_ELEMENT_VALUE_OF_CSS_PROPERTYZEXECUTE_ASYNC_SCRIPTZSET_TIMEOUTSZGET_TIMEOUTSZW3C_DISMISS_ALERTZW3C_ACCEPT_ALERTZW3C_SET_ALERT_VALUEZW3C_GET_ALERT_TEXTZW3C_ACTIONSZW3C_CLEAR_ACTIONSZSET_WINDOW_RECTZGET_WINDOW_RECTZW3C_MAXIMIZE_WINDOWZSET_SCREEN_ORIENTATIONZGET_SCREEN_ORIENTATIONZGET_NETWORK_CONNECTIONZSET_NETWORK_CONNECTIONZGET_LOGZGET_AVAILABLE_LOG_TYPESZCURRENT_CONTEXT_HANDLEZCONTEXT_HANDLESZSWITCH_TO_CONTEXTZFULLSCREEN_WINDOWZMINIMIZE_WINDOWZ
PRINT_PAGEZADD_VIRTUAL_AUTHENTICATORZREMOVE_VIRTUAL_AUTHENTICATORZADD_CREDENTIALZGET_CREDENTIALSZREMOVE_CREDENTIALZREMOVE_ALL_CREDENTIALSZSET_USER_VERIFIEDÚ	_commands)r4   rM   r+   rN   Z	_no_proxyZnpuZn_urlZ
remote_addr   r   r   Ú__init__›   sÈ    

©zRemoteConnection.__init__c                 C   sx   | j | }|dus J d|› ƒ‚t |d ¡ |¡}t|tƒrLd|v rL|d= t |¡}| j› |› }| j	|d ||dS )am  Send a command to the remote server.

        Any path substitutions required for the URL mapped to the command should be
        included in the command parameters.

        :Args:
         - command - A string specifying the command to execute.
         - params - A dictionary of named parameters to send with the command as
           its JSON payload.
        NzUnrecognised command r   Z	sessionIdr   )Úbody)
rf   ÚstringÚTemplateÚ
substituteÚ
isinstanceÚdictr   Z	dump_jsonr.   Ú_request)r4   ÚcommandÚparamsÚcommand_infor   Údatar<   r   r   r   Úexecute  s    

zRemoteConnection.executec              	   C   sn  t  |› d|› d|› ¡ t |¡}|  || j¡}d}|rF|dvrFd}| jrh| jj||||d}|j}nD|  	¡ }|"}	|	j||||d}W d  ƒ n1 sœ0    Y  |j}|j
 d¡}
t  d|j› d|
› d|j› ¡ zzd	|  kròd
k r n n*|  d|j dd¡¡W t  d¡ | ¡  S d|  k r8dkrZn n||
dœW t  d¡ | ¡  S g }|j dd¡r‚|j dd¡ d¡}tdd„ |D ƒƒs4zt |
 ¡ ¡}
W n` ty   d|  k rÐd	k rÜn ntj}ntj}||
 ¡ dœ Y W t  d¡ | ¡  S 0 d|
vrd|
d< |
W t  d¡ | ¡  S d|
dœ}
|
W t  d¡ | ¡  S t  d¡ | ¡  0 dS )aq  Send an HTTP request to the remote server.

        :Args:
         - method - A string for the HTTP method to send the request with.
         - url - A string for the URL to send the request to.
         - body - A string for request body. Ignored unless method is POST or PUT.

        :Returns:
          A dictionary with the server's parsed JSON response.
        ú N)rR   ÚPUT)rh   r,   zUTF-8zRemote response: status=z | data=z | headers=i,  i0  rT   ÚlocationzFinished Requesti  iô  )ÚstatusÚvaluer   ú;c                 S   s   g | ]}|  d ¡‘qS )z	image/png)r/   )Ú.0Úxr   r   r   Ú
<listcomp>H  ó    z-RemoteConnection._request.<locals>.<listcomp>éÇ   rx   r   )ÚLOGGERÚdebugr   rc   r-   r+   re   Úrequestrw   rL   rr   r)   r,   rn   r2   Úclosera   Úanyr   Z	load_jsonrb   Ú
ValueErrorr   ÚSUCCESSÚUNKNOWN_ERROR)r4   Úmethodr<   rh   r*   r,   ÚresponseZ
statuscodeÚconnÚhttprr   Úcontent_typerw   r   r   r   rn   $  sn    
0 
ç

é

õ

û

ý  ÿ
zRemoteConnection._requestc                 C   s   t | dƒr| j ¡  dS )z<Clean up resources when finished with the remote_connection.re   N)Úhasattrre   Úclearr3   r   r   r   r‚   ]  s    
zRemoteConnection.close)F)FF)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Zbrowser_namer   r   r
   ÚcertifiÚwherer   Úclassmethodr   r   r   r   r   r-   r5   r=   r@   rL   ÚstrÚboolrg   rs   rn   r‚   r   r   r   r   r	   &   s0   





u
9r	   )Úloggingr0   r"   r   ri   Úbase64r   Úurllibr   r’   rH   Zseleniumr   Ú r   ro   r   Zerrorhandlerr   Ú	getLoggerrŽ   r   r	   r   r   r   r   Ú<module>   s   
