a
    .c^F                     @   s   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 e eZG d	d
 d
ZdS )    N)	b64encode)parse)__version__   )Command)	ErrorCode)utilsc                   @   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je dddZdd Zd#ddZdd  ZdS )$RemoteConnectionzA connection with the Remote WebDriver server.

    Communicates with the server using the WebDriver wire protocol:
    https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocolNc                 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   e/var/www/brookimports/venv/lib/python3.9/site-packages/selenium/webdriver/remote/remote_connection.pyget_timeout2   s    zRemoteConnection.get_timeoutc                 C   s
   || _ dS )z
        Override the default timeout

        :Args:
            - timeout - timeout value for http requests in seconds
        N)r
   )r   timeoutr   r   r   set_timeout:   s    zRemoteConnection.set_timeoutc                 C   s   t j| _dS )zR
        Reset the http request timeout to socket._GLOBAL_DEFAULT_TIMEOUT
        N)r   r   r
   r   r   r   r   reset_timeoutD   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_pathK   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_pathS   s    	z,RemoteConnection.set_certificate_bundle_pathFc                 C   sx   t   }|dkrd}dddt d| dd}|jrbtd	| }|d
d|	  i |rt|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-Agentz{0.username}:{0.password}AuthorizationzBasic 
Connectionz
keep-alive)
platformsystemlowerr   usernamer   formatencodeupdatedecode)r   
parsed_url
keep_aliver"   headersZbase64stringr   r   r   get_remote_connection_headers^   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_url   s    zRemoteConnection._get_proxy_urlc                 C   s>   | j }||dd d  }d|v o<t|d |d dkS )N:   @r   
_proxy_urlfindlen)r3   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 )Nr5   r6   r7   r   r8   )r3   r<   protocolZno_protocolauthZproxy_without_authr   r   r   _seperate_http_proxy_auth   s    z*RemoteConnection._seperate_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)r3   Zpool_manager_init_argsrE   r   r   r   _get_connection_manager   s     

z(RemoteConnection._get_connection_manager)ignore_proxyc                 C   s  || _ || _tjdtjd}|r|dD ]b}| }|dkrLd} qt|}t| j}|j	r~|j	|j	krd} qq0|j
|j	v r0d} qq0|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)rS   z"/session/$sessionId/window/handles)rQ   /session/$sessionId/url)rQ   z/session/$sessionId/forward)rQ   z/session/$sessionId/back)rQ   z/session/$sessionId/refresh)rQ   z /session/$sessionId/execute/sync)rQ   z!/session/$sessionId/execute/async)rS   rU   )rS   z/session/$sessionId/title)rS   z/session/$sessionId/source)rS   z/session/$sessionId/screenshot)rS   z*/session/$sessionId/element/$id/screenshot)rQ   z/session/$sessionId/element)rQ   z/session/$sessionId/elements)rS   z"/session/$sessionId/element/active)rQ   z'/session/$sessionId/element/$id/element)rQ   z(/session/$sessionId/element/$id/elements)rQ   z%/session/$sessionId/element/$id/click)rQ   z%/session/$sessionId/element/$id/clear)rS   z$/session/$sessionId/element/$id/text)rQ   z%/session/$sessionId/element/$id/value)rQ   z/session/$sessionId/se/file)rS   z$/session/$sessionId/element/$id/name)rS   z(/session/$sessionId/element/$id/selected)rS   z'/session/$sessionId/element/$id/enabled)rS   z$/session/$sessionId/element/$id/rect)rS   z//session/$sessionId/element/$id/attribute/$name)rS   z./session/$sessionId/element/$id/property/$name)rS   z,/session/$sessionId/element/$id/computedrole)rS   z-/session/$sessionId/element/$id/computedlabel)rS   z&/session/$sessionId/element/$id/shadow)rQ   z,/session/$sessionId/shadow/$shadowId/element)rQ   z-/session/$sessionId/shadow/$shadowId/elements)rS   /session/$sessionId/cookie)rQ   rV   )rS    /session/$sessionId/cookie/$name)rR   rV   )rR   rW   )rQ   z/session/$sessionId/frame)rQ   z /session/$sessionId/frame/parent)rQ   rT   )rQ   z/session/$sessionId/window/new)rR   rT   )rS   z1/session/$sessionId/element/$id/css/$propertyName)rQ   z!/session/$sessionId/execute_async)rQ   /session/$sessionId/timeouts)rS   rX   )rQ   z!/session/$sessionId/alert/dismiss)rQ   z /session/$sessionId/alert/accept)rQ   /session/$sessionId/alert/text)rS   rY   )rQ   /session/$sessionId/actions)rR   rZ   )rQ   /session/$sessionId/window/rect)rS   r[   )rQ   z#/session/$sessionId/window/maximize)rQ   /session/$sessionId/orientation)rS   r\   )rS   &/session/$sessionId/network_connection)rQ   r]   )rQ   z/session/$sessionId/se/log)rS   z /session/$sessionId/se/log/types)rS   /session/$sessionId/context)rS   z/session/$sessionId/contexts)rQ   r^   )rQ   z%/session/$sessionId/window/fullscreen)rQ   z#/session/$sessionId/window/minimize)rQ   z/session/$sessionId/print)rQ   z*/session/$sessionId/webauthn/authenticator)rR   z;/session/$sessionId/webauthn/authenticator/$authenticatorId)rQ   zF/session/$sessionId/webauthn/authenticator/$authenticatorId/credential)rS   G/session/$sessionId/webauthn/authenticator/$authenticatorId/credentials)rR   zU/session/$sessionId/webauthn/authenticator/$authenticatorId/credentials/$credentialId)rR   r_   )rQ   z>/session/$sessionId/webauthn/authenticator/$authenticatorId/uv)_r*   r-   r/   r0   r1   splitstripr   urlparsenetlocr   r4   r9   rL   _connr   ZNEW_SESSIONZQUITZW3C_GET_CURRENT_WINDOW_HANDLEZW3C_GET_WINDOW_HANDLESrS   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)r3   Zremote_server_addrr*   rM   Z	_no_proxyZnpuZn_urlZ
remote_addr   r   r   __init__   s0   

 zRemoteConnection.__init__c                 C   sv   | j | }|dusJ d| t|d |}t|trJd|v rJ|d= t|}| j | }| j	|d ||dS )av  
        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 %sr   Z	sessionIdr   )body)
re   stringTemplate
substitute
isinstancedictr   Z	dump_jsonr-   _request)r3   commandparamscommand_infor   datar<   r   r   r   executeE  s    

zRemoteConnection.executec              	      s  t | d| d|  t|}| || j}d |rF|dvrFd}| jrh| jj||||d  j}n| 	 }|"}|j||||d W d   n1 s0    Y   j}t
 dst
 jdr҇ fdd _nt
 jdr fd	d _ jd
}	t d j d|	 d j  zd|  kr4dk r^n n&| d dW t d    S d|  k rvdkrn n||	dW t d    S g }
 dr dd}
tdd |
D sjz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rRd|	d< |	W t d    S d|	d}	|	W t d    S W t d    nt d    0 dS )az  
        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)rQ   PUT)rg   r+   	getheaderc                    s    j | S N)r+   ru   xresponser   r   <lambda>x      z+RemoteConnection._request.<locals>.<lambda>r1   c                    s    j | S rv   )r+   r1   rw   ry   r   r   r{   z  r|   zUTF-8zRemote response: status=z | data=z | headers=i,  i0  rS   locationzFinished Requesti  i  )statusvaluer   ;c                 S   s   g | ]}| d qS )z	image/png)r.   ).0rx   r   r   r   
<listcomp>  r|   z-RemoteConnection._request.<locals>.<listcomp>   r   r   )LOGGERdebugr   rb   r,   r*   rd   requestr~   rL   hasattrr+   ru   rq   r(   rm   closer`   anyr   Z	load_jsonra   
ValueErrorr   SUCCESSUNKNOWN_ERROR)r3   methodr<   rg   r)   r+   Z
statuscodeconnhttprq   content_typer~   r   ry   r   rm   Z  sx    
0
 










zRemoteConnection._requestc                 C   s   t | dr| j  dS )zM
        Clean up resources when finished with the remote_connection
        rd   N)r   rd   clearr2   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,   r4   r=   r@   rL   typingOptionalboolrf   rr   rm   r   r   r   r   r   r	   (   s2   

	



   
Br	   )loggingr   rh   r/   r   r   rH   r!   base64r   urllibr   Zseleniumr   rn   r   Zerrorhandlerr    r   	getLoggerr   r   r	   r   r   r   r   <module>   s   
