U
    PÖýfME  ã                ¢   @   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ejd	ejd
ejdejdejdejdejdejdejdejdej dej!dej"dej#dej$dej%dej&dej'dej(dej)dej*dej+dej,dej-d ej.d!ej/d"ej0d#ej1d$ej2d%ej3d&ej4d'ej5d(ej6d)ej7d*ej8d+ej9d,ej:d-ej;d.ej<d/ej=d0ej>d1ej?d2ej@d3ejAd4ejBd5ejCd6ejDd7ejEd8ejFd9ejGd:ejHd;ejId<ejJd=ejKd>ejLd?ejMd@ejNdAejOdBejPdCejQdDejRdEejSdFejTdGejUdHejVdIejWdJejXdKejYdLejZdMej[dNej\dOej]dPej^dQej_dRej`dSejadTejbdUejcdVejddWejedXejfdYiQZgG dZd[„ d[ƒZhdS )\é    N)Ú	b64encode)Úparse)Ú__version__é   )Úutils)ÚCommand)Ú	ErrorCode)ÚPOSTz/session)ÚDELETEz/session/$sessionId)ÚGETú/session/$sessionId/window)r   z"/session/$sessionId/window/handles)r	   ú/session/$sessionId/url)r	   z/session/$sessionId/forward)r	   z/session/$sessionId/back)r	   z/session/$sessionId/refresh)r	   z /session/$sessionId/execute/sync)r	   z!/session/$sessionId/execute/async)r   r   )r   z/session/$sessionId/title)r   z/session/$sessionId/source)r   z/session/$sessionId/screenshot)r   z*/session/$sessionId/element/$id/screenshot)r	   z/session/$sessionId/element)r	   z/session/$sessionId/elements)r   z"/session/$sessionId/element/active)r	   z'/session/$sessionId/element/$id/element)r	   z(/session/$sessionId/element/$id/elements)r	   z%/session/$sessionId/element/$id/click)r	   z%/session/$sessionId/element/$id/clear)r   z$/session/$sessionId/element/$id/text)r	   z%/session/$sessionId/element/$id/value)r   z$/session/$sessionId/element/$id/name)r   z(/session/$sessionId/element/$id/selected)r   z'/session/$sessionId/element/$id/enabled)r   z$/session/$sessionId/element/$id/rect)r   z//session/$sessionId/element/$id/attribute/$name)r   z./session/$sessionId/element/$id/property/$name)r   z,/session/$sessionId/element/$id/computedrole)r   z-/session/$sessionId/element/$id/computedlabel)r   z&/session/$sessionId/element/$id/shadow)r	   z,/session/$sessionId/shadow/$shadowId/element)r	   z-/session/$sessionId/shadow/$shadowId/elements)r   ú/session/$sessionId/cookie)r	   r   )r   ú /session/$sessionId/cookie/$name)r
   r   )r
   r   )r	   z/session/$sessionId/frame)r	   z /session/$sessionId/frame/parent)r	   r   )r	   z/session/$sessionId/window/new)r
   r   )r   z1/session/$sessionId/element/$id/css/$propertyName)r	   z!/session/$sessionId/execute_async)r	   ú/session/$sessionId/timeouts)r   r   )r	   z!/session/$sessionId/alert/dismiss)r	   z /session/$sessionId/alert/accept)r	   ú/session/$sessionId/alert/text)r   r   )r	   ú/session/$sessionId/actions)r
   r   )r	   ú/session/$sessionId/window/rect)r   r   )r	   z#/session/$sessionId/window/maximize)r	   ú/session/$sessionId/orientation)r   r   )r   ú&/session/$sessionId/network_connection)r	   r   )r	   z/session/$sessionId/se/log)r   z /session/$sessionId/se/log/types)r   ú/session/$sessionId/context)r   z/session/$sessionId/contexts)r	   r   )r	   z%/session/$sessionId/window/fullscreen)r	   z#/session/$sessionId/window/minimize)r	   z/session/$sessionId/print)r	   z*/session/$sessionId/webauthn/authenticator)r
   z;/session/$sessionId/webauthn/authenticator/$authenticatorId)r	   zF/session/$sessionId/webauthn/authenticator/$authenticatorId/credential)r   úG/session/$sessionId/webauthn/authenticator/$authenticatorId/credentials)r
   zU/session/$sessionId/webauthn/authenticator/$authenticatorId/credentials/$credentialId)r
   r   )r	   z>/session/$sessionId/webauthn/authenticator/$authenticatorId/uv)r	   z/session/$sessionId/se/file)r   ú/session/$sessionId/se/files)r	   r   )r
   r   c                   @   s   e Zd ZdZdZe d¡dk	r6ee dee	 
¡ ƒ¡ƒne	 
¡ ZdejkrRe d¡n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)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
    NZGLOBAL_DEFAULT_TIMEOUTÚREQUESTS_CA_BUNDLEc                 C   s   | j tjkrdS | j S )zp:Returns:

        Timeout value in seconds for all http requests made to the
        Remote Connection
        N)Ú_timeoutÚsocketÚ_GLOBAL_DEFAULT_TIMEOUT©Úcls© r    úO/tmp/pip-unpacked-wheel-ds5t_0qj/selenium/webdriver/remote/remote_connection.pyÚget_timeout’   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_timeout›   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_timeout¤   s    zRemoteConnection.reset_timeoutc                 C   s   | j S )zÂ:Returns:

        Paths of the .pem encoded certificate to verify connection to
        command executor. Defaults to certifi.where() or
        REQUESTS_CA_BUNDLE env variable if set.
        ©Ú	_ca_certsr   r    r    r!   Úget_certificate_bundle_path©   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_path³   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_aliver4   Ú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|ko<t|d | d¡… ƒdkS )Nr0   é   ú@r   ©Ú
_proxy_urlÚfindÚlen)rE   Ú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 )Nr0   rG   rH   r   rI   )rE   rM   Ú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¡rTddlm} || jf|ŽS |  ¡ r~|  ¡ \| _| _	t
j| j	d|d	< t
j| jf|ŽS t
jf |ŽS )
Nr#   ÚCERT_REQUIREDÚ	cert_reqsÚca_certsÚsockr   )ÚSOCKSProxyManager)Úproxy_basic_authÚproxy_headers)r"   r'   rJ   r5   r@   Zurllib3.contrib.socksrV   rN   rQ   Z_basic_proxy_authÚurllib3Úmake_headersÚProxyManagerÚPoolManager)rE   Zpool_manager_init_argsrV   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	kr0d} q”q0|s |  ¡ nd | _|r´|  ¡ | _t| _d S )NÚno_proxyZNO_PROXYú,Ú*T)r<   r?   rA   rB   rC   ÚsplitÚstripr   ÚurlparseÚnetlocr)   rF   rJ   r]   Ú_connÚremote_commandsÚ	_commands)rE   r^   r<   r_   Z	_no_proxyZnpuZn_urlZ
remote_addr    r    r!   Ú__init__ÿ   s,    

zRemoteConnection.__init__c                 C   s¸   | j | }|dk	s td|› ƒ‚|d }t |¡ |¡}dd„ | d¡D ƒ}t|tƒrj|rj|D ]
}||= q^t 	|¡}| j
› |› }	|  |¡}
t d|d |	t|
ƒ¡ | 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   c                 S   s"   h | ]}|  d ¡r|dd… ’qS )ú$r   N©r@   )Ú.0Úwordr    r    r!   Ú	<setcomp>*  s     
 z+RemoteConnection.execute.<locals>.<setcomp>ú/z%s %s %sr   )Úbody)ri   ÚAssertionErrorÚstringÚTemplateÚ
substituterc   Ú
isinstanceÚdictr   Z	dump_jsonr?   Ú_trim_large_entriesÚLOGGERÚdebugÚstrÚ_request)rE   ÚcommandÚparamsÚcommand_infoZpath_stringr)   Zsubstitute_paramsrn   ÚdatarM   Ztrimmedr    r    r!   Úexecute  s    


zRemoteConnection.executec              	   C   sà  t  |¡}|  || j¡}d}|r,|dkr,d}| jrN| jj||||d}|j}n0|  ¡ }|}	|	j||||d}W 5 Q R X |j}|j 	d¡}
t
 d|j|
|j¡ z&d|  kr¶dk rÔn n|  d	|j d
d¡¡W ¢öS d|  k rèdkrún n||
dœW ¢ÐS g }|j dd¡r"|j dd¡ d¡}tdd„ |D ƒƒs¶zt |
 ¡ ¡}
W nR tk
rš   d|  k rrdk r~n ntj}ntj}||
 ¡ dœ Y W ¢0S X d|
kr®d|
d< |
W ¢S d|
dœ}
|
W ¢S t
 d¡ | ¡  X 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)r	   ÚPUT)rq   r=   zUTF-8z1Remote response: status=%s | data=%s | headers=%szFinished Requesti,  i0  r   Úlocationi  iô  )ÚstatusÚvaluer/   ú;c                 S   s   g | ]}|  d ¡‘qS )z	image/pngrl   )rm   Úxr    r    r!   Ú
<listcomp>W  s     z-RemoteConnection._request.<locals>.<listcomp>éÇ   r…   r   )r   re   r>   r<   rg   Úrequestr„   r]   r€   r:   ry   rz   r=   Úcloser|   rC   rc   Úanyr   Z	load_jsonrd   Ú
ValueErrorr   ÚSUCCESSÚUNKNOWN_ERROR)rE   ÚmethodrM   rq   r;   r=   ÚresponseZ
statuscodeÚconnÚhttpr€   Úcontent_typer„   r    r    r!   r|   4  sJ    



zRemoteConnection._requestc                 C   s   t | dƒr| j ¡  dS )z<Clean up resources when finished with the remote_connection.rg   N)Úhasattrrg   ÚclearrD   r    r    r!   r‹   l  s    
zRemoteConnection.closeéd   c                 C   sj   i }|  ¡ D ]X\}}t|tƒr0|  ||¡||< qt|tƒr\t|ƒ|kr\|d|… d ||< q|||< q|S )a  Truncate string values in a dictionary if they exceed max_length.

        :param dict: Dictionary with potentially large values
        :param max_length: Maximum allowed length of string values
        :return: Dictionary with truncated string values
        Nz...)Úitemsrv   rw   rx   r{   rL   )rE   Z
input_dictÚ
max_lengthZoutput_dictionaryÚkeyr…   r    r    r!   rx   q  s    

z$RemoteConnection._trim_large_entries)F)FF)N)r—   )!Ú__name__Ú
__module__Ú__qualname__Ú__doc__Zbrowser_namerA   ÚgetenvÚfloatr{   r   Úgetdefaulttimeoutr   rB   ÚcertifiÚwherer'   Úclassmethodr"   r$   r%   r(   r*   r>   rF   rN   rQ   r]   Úboolrj   r   r|   r‹   rx   r    r    r    r!   r   ƒ   s8   ÿý



	


8r   )iÚloggingrA   r3   r   rs   Úbase64r   Úurllibr   r¢   rY   Zseleniumr   Ú r   r}   r   Zerrorhandlerr   Ú	getLoggerr›   ry   ZNEW_SESSIONZQUITZW3C_GET_CURRENT_WINDOW_HANDLEZW3C_GET_WINDOW_HANDLESr   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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_VERIFIEDZUPLOAD_FILEZGET_DOWNLOADABLE_FILESZDOWNLOAD_FILEZDELETE_DOWNLOADABLE_FILESrh   r   r    r    r    r!   Ú<module>   sb  
                                                                                 ¦^