o
    VhD                     @   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i 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i 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*i ej8d+ej9d,ej:d-ej;d.ej<d/ej=d0ej>d1ej?d2ej@d3ejAd4ejBd5ejCd6ejDd7ejEd8ejFd9ejGd:ejHd;i ejId<ejJd=ejKd>ejLd?ejMd@ejNdAejOdBejPdCejQdDejRdEejSdFejTdGejUdHejVdIejWdJejXdKejYdLejZdMej[dNej\dOej]dPej^dQej_dRej`dSejadTejbdUejcdVejddWejedXejfdYiZgG 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jZdej	v re
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(dededefddZdd Zd)d d!Zd"d# Zd*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/JsonWireProtocol
    N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    h/home/air/yokohama/back/venv/lib/python3.10/site-packages/selenium/webdriver/remote/remote_connection.pyget_timeout   s   zRemoteConnection.get_timeoutc                 C   
   || _ 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   r#   )zSet 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r5t|j d	|j  }|d
d|	  i |r>|ddi |S )zGet 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_aliver5   headers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r"tjdtjdS d S )Nzhttps://https_proxyHTTPS_PROXYzhttp://
http_proxy
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 )Nr1      @r   
_proxy_urlfindlen)rK   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 )Nr1   rM   rN   r   rO   )rK   rS   protocolno_protocolauth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rK| j dr,ddlm} || jfi |S |  rA|  \| _| _	t
j| j	d|d	< t
j| jfi |S t
jd
i |S )Nr$   CERT_REQUIRED	cert_reqsca_certssockr   )SOCKSProxyManager)proxy_basic_authproxy_headersr    )r"   r(   rP   r6   rF   urllib3.contrib.socksr^   rT   rY   _basic_proxy_authurllib3make_headersProxyManagerPoolManager)rK   pool_manager_init_argsr^   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}|rJ|dD ]1}| }|dkr&d} n$t|}t| j}|j	r?|j	|j	kr>d} nq|j
|j	v rId} nq|sP|  nd | _|rZ|  | _t| _d S )Nno_proxyNO_PROXY,*T)r=   rE   rG   rH   rI   splitstripr   urlparsenetlocr*   rL   rP   rh   _connremote_commands	_commands)rK   ri   r=   rj   	_no_proxynpun_url
remote_addr    r    r!   __init__   s0   


zRemoteConnection.__init__c                 C   s   | j | }|dusJ d| |d }t||}dd |dD }t|tr5|r5|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rF   ).0wordr    r    r!   	<setcomp>&  s   " z+RemoteConnection.execute.<locals>.<setcomp>/z%s %s %sr   )body)ru   stringTemplate
substitutero   
isinstancedictr   	dump_jsonrE   _trim_large_entriesLOGGERdebugstr_request)rK   commandparamscommand_infopath_stringr*   substitute_paramsr~   datarS   trimmedr    r    r!   execute  s   


zRemoteConnection.executec              	   C   s0  t |}| || j}d}|r|dvrd}| jr'| jj||||d}|j}n"|  }|}	|	j||||d}W d   n1 sAw   Y  |j}|j	d}
t
d|j|
|j zd|  krddk r{n n| d|jd	dW t
d
 |  S d|  k rdkrn n||
dW t
d
 |  S g }|jddr|jddd}tdd |D sz	t|
 }
W n- ty   d|  k rdk rn ntj}ntj}||
 d Y W t
d
 |  S w d|
vrd|
d< |
W t
d
 |  S d|
d}
|
W t
d
 |  S t
d
 |  w )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)r   r>   zUTF-8z1Remote response: status=%s | data=%s | headers=%si,  i0  r   locationzFinished Requesti  i  )statusvaluer0   ;c                 S   s   g | ]}| d qS )z	image/pngr|   )r}   xr    r    r!   
<listcomp>S  s    z-RemoteConnection._request.<locals>.<listcomp>   r   r   )r   rq   r@   r=   rs   requestr   rh   r   r;   r   r   r>   r   rI   closero   anyr   	load_jsonrp   
ValueErrorr   SUCCESSUNKNOWN_ERROR)rK   methodrS   r   r<   r>   response
statuscodeconnhttpr   content_typer   r    r    r!   r   0  sb   








	






zRemoteConnection._requestc                 C   s   t | dr| j  dS dS )z<Clean up resources when finished with the remote_connection.rs   N)hasattrrs   clearrJ   r    r    r!   r   h  s   
zRemoteConnection.closed   c                 C   sj   i }|  D ],\}}t|tr| ||||< 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...)itemsr   r   r   r   rR   )rK   
input_dict
max_lengthoutput_dictionarykeyr   r    r    r!   r   m  s   

z$RemoteConnection._trim_large_entries)F)FF)N)r   ) __name__
__module____qualname____doc__browser_namer   r   r   rG   rH   getenvcertifiwherer(   classmethodr"   r%   r&   r)   r+   r@   rL   rT   rY   rh   r   boolrz   r   r   r   r   r    r    r    r!   r      s4    



	


8r   )iloggingrG   r4   r   r   base64r   urllibr   r   rc   seleniumr    r   r   r   errorhandlerr   	getLoggerr   r   NEW_SESSIONQUITW3C_GET_CURRENT_WINDOW_HANDLEW3C_GET_WINDOW_HANDLESr   
GO_FORWARDGO_BACKREFRESHW3C_EXECUTE_SCRIPTW3C_EXECUTE_SCRIPT_ASYNCGET_CURRENT_URL	GET_TITLEGET_PAGE_SOURCE
SCREENSHOTELEMENT_SCREENSHOTFIND_ELEMENTFIND_ELEMENTSW3C_GET_ACTIVE_ELEMENTFIND_CHILD_ELEMENTFIND_CHILD_ELEMENTSCLICK_ELEMENTCLEAR_ELEMENTGET_ELEMENT_TEXTSEND_KEYS_TO_ELEMENTGET_ELEMENT_TAG_NAMEIS_ELEMENT_SELECTEDIS_ELEMENT_ENABLEDGET_ELEMENT_RECTGET_ELEMENT_ATTRIBUTEGET_ELEMENT_PROPERTYGET_ELEMENT_ARIA_ROLEGET_ELEMENT_ARIA_LABELGET_SHADOW_ROOTFIND_ELEMENT_FROM_SHADOW_ROOTFIND_ELEMENTS_FROM_SHADOW_ROOTGET_ALL_COOKIES
ADD_COOKIE
GET_COOKIEDELETE_ALL_COOKIESDELETE_COOKIESWITCH_TO_FRAMESWITCH_TO_PARENT_FRAMESWITCH_TO_WINDOW
NEW_WINDOWCLOSE!GET_ELEMENT_VALUE_OF_CSS_PROPERTYEXECUTE_ASYNC_SCRIPTSET_TIMEOUTSGET_TIMEOUTSW3C_DISMISS_ALERTW3C_ACCEPT_ALERTW3C_SET_ALERT_VALUEW3C_GET_ALERT_TEXTW3C_ACTIONSW3C_CLEAR_ACTIONSSET_WINDOW_RECTGET_WINDOW_RECTW3C_MAXIMIZE_WINDOWSET_SCREEN_ORIENTATIONGET_SCREEN_ORIENTATIONGET_NETWORK_CONNECTIONSET_NETWORK_CONNECTIONGET_LOGGET_AVAILABLE_LOG_TYPESCURRENT_CONTEXT_HANDLECONTEXT_HANDLESSWITCH_TO_CONTEXTFULLSCREEN_WINDOWMINIMIZE_WINDOW
PRINT_PAGEADD_VIRTUAL_AUTHENTICATORREMOVE_VIRTUAL_AUTHENTICATORADD_CREDENTIALGET_CREDENTIALSREMOVE_CREDENTIALREMOVE_ALL_CREDENTIALSSET_USER_VERIFIEDUPLOAD_FILEGET_DOWNLOADABLE_FILESDOWNLOAD_FILEDELETE_DOWNLOADABLE_FILESrt   r   r    r    r    r!   <module>   sL  
	
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDE^