
    $)fD                        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 j&                  e      Zi ej,                  d	ej.                  d
ej0                  dej2                  dej4                  dej6                  dej8                  dej:                  dej<                  dej>                  dej@                  dejB                  dejD                  dejF                  dejH                  dejJ                  dejL                  di ejN                  dejP                  dejR                  dejT                  dejV                  dejX                  dejZ                  d ej\                  d!ej^                  d"ej`                  d#ejb                  d$ejd                  d%ejf                  d&ejh                  d'ejj                  d(ejl                  d)ejn                  d*i ejp                  d+ejr                  d,ejt                  d-ejv                  d.ejx                  d/ejz                  d0ej|                  d1ej~                  d2ej                  d3ej                  d4ej                  d5ej                  d6ej                  d7ej                  d8ej                  d9ej                  d:ej                  d;i ej                  d<ej                  d=ej                  d>ej                  d?ej                  d@ej                  dAej                  dBej                  dCej                  dDej                  dEej                  dFej                  dGej                  dHej                  dIej                  dJej                  dKej                  dLej                  dMej                  dNej                  dOej                  dPej                  dQej                  dRej                  dSej                  dTej                  dUej                  dVej                  dWej                  dXej                  dYiZg G dZ d[      Zhy)\    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                   :   e Zd ZdZdZej                  Zdej                  v r ej                  d      n ej                         Zed        Zed        Zed        Zed        Zed        Zedd	       Zd
 Zd Zd Zd ZddededefdZd ZddZd ZddZy)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                 X    | 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clss    h/var/www/html/flask-app/venv/lib/python3.12/site-packages/selenium/webdriver/remote/remote_connection.pyget_timeoutzRemoteConnection.get_timeout   s$     ||v'E'EEtW3<<W    c                     || _         y)zyOverride the default timeout.

        :Args:
            - timeout - timeout value for http requests in seconds
        N)r   )r"   timeouts     r#   set_timeoutzRemoteConnection.set_timeout   s     r%   c                 .    t         j                  | _        y)zAReset the http request timeout to socket._GLOBAL_DEFAULT_TIMEOUT.N)r   r    r   r!   s    r#   reset_timeoutzRemoteConnection.reset_timeout   s     55r%   c                     | 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!   s    r#   get_certificate_bundle_pathz,RemoteConnection.get_certificate_bundle_path   s     }}r%   c                     || _         y)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"   paths     r#   set_certificate_bundle_pathz,RemoteConnection.set_certificate_bundle_path   s     r%   c                 h   t        j                         j                         }|dk(  rd}dddt         d| dd}|j                  rVt        |j                   d	|j                   j                               }|j                  d
d|j                          i       |r|j                  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_aliver<   headersbase64strings         r#   get_remote_connection_headersz.RemoteConnection.get_remote_connection_headers   s     "((*XF )<%k])F81E
 $
(;(;'<Aj>Q>Q=R%S%Z%Z%\]LNNOvl6I6I6K5L-MNONNL,78r%   c                 d   | j                   j                  d      r=t        j                  j	                  dt        j                  j	                  d            S | j                   j                  d      r=t        j                  j	                  dt        j                  j	                  d            S y )Nzhttps://https_proxyHTTPS_PROXYzhttp://
http_proxy
HTTP_PROXY)_url
startswithosenvirongetselfs    r#   _get_proxy_urlzRemoteConnection._get_proxy_url   so    99
+::>>-1NOO99	*::>>,

|0LMM +r%   c                     | j                   }||j                  d      dz   d  }d|v xr  t        |d |j                  d             dkD  S )Nr8      @r   
_proxy_urlfindlen)rS   urls     r#   _identify_http_proxy_authz*RemoteConnection._identify_http_proxy_auth   sM    oo#((3-!#%&cz;c#o"67!;;r%   c                     | j                   }|d |j                  d      dz    }|t        |      d  }|d |j                  d       }||t        |      dz   d  z   }||fS )Nr8   rV   rW   r   rX   )rS   r\   protocolno_protocolauthproxy_without_auths         r#   _separate_http_proxy_authz*RemoteConnection._separate_http_proxy_auth   sr    oo*#*+#h-/*2[--c23%CIMO(DD!4''r%   c                    d| j                         i}| j                  rd|d<   | j                  |d<   | j                  r| j                  j                         j	                  d      rddlm}  || j                  fi |S | j                         r@| j                         \  | _        | _	        t        j                  | j                        |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_headers )r$   r-   rY   r=   rN   urllib3.contrib.socksri   r]   rc   _basic_proxy_authurllib3make_headersProxyManagerPoolManager)rS   pool_manager_init_argsri   s      r#   _get_connection_managerz(RemoteConnection._get_connection_manager   s    "+T-=-=-?!@>>2A";/15":.??$$&11&9C(S<RSS--/:>:X:X:Z7!7:A:N:N`d`v`v:w&7''R;QRR""<%;<<r%   remote_server_addrrD   ignore_proxyc                 f   || _         || _        t        j                  j	                  dt        j                  j	                  d            }|r|j                  d      D ]  }|j                         }|dk(  rd} n|t        j                  |      }t        j                  | j                        }|j                  r|j                  |j                  k(  svd} n|j                  |j                  v sd} n |s| j                         nd | _        |r| j                         | _        t        | _        y )Nno_proxyNO_PROXY,*T)rD   rM   rO   rP   rQ   splitstripr   urlparsenetlocr0   rT   rY   rt   _connremote_commands	_commands)rS   ru   rD   rv   	_no_proxynpun_url
remote_adds           r#   __init__zRemoteConnection.__init__   s    $&	 JJNN:rzz~~j/IJ	 s+ iik#:#'Ls+"^^DII6
<<!((ELL8'+zzZ%6%66'+  8D$--/557DJ(r%   c                    | j                   |   }|
J d|        |d   }t        j                  |      j                  |      }|j	                  d      D ch c]  }|j                  d      s|dd  }}t        |t              r|r
|D ]  }||=  t        j                  |      }| j                   | }	| j                  |      }
t        j                  d|d   |	t        |
             | j                  |d   |	|      S c c}w )	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%s %s %sr   )body)r   stringTemplate
substituter|   rN   
isinstancedictr   	dump_jsonrM   _trim_large_entriesLOGGERdebugstr_request)rS   commandparamscommand_infopath_stringr0   wordsubstitute_paramsdatar\   trimmeds              r#   executezRemoteConnection.execute  s    ~~g.'J+@	)JJ"1o{+66v>2=2C2CC2Ha$DOO\_L`T!"Xaafd#(9) !4L!v&D6"**62Za#s7|D}}\!_c}== bs   D/Dc                 d   t        j                  |      }| j                  || j                        }d}|r|dvrd}| j                  r,| j                  j                  ||||      }|j                  }n<| j                         }|5 }	|	j                  ||||      }ddd       |j                  }|j                  j                  d      }
t        j                  d|j                  |
|j                         	 d|cxk  rdk  rTn nQ| j                  d|j                  j                  d	d            t        j                  d
       |j                          S d|cxk  rdk  r-n n*||
dt        j                  d
       |j                          S g }|j                  j                  dd      r+|j                  j                  dd      j!                  d      }t#        |D cg c]  }|j%                  d       c}      sT	 t'        j(                  |
j+                               }
d|
vrd|
d<   |
t        j                  d
       |j                          S d|
d}
|
t        j                  d
       |j                          S # 1 sw Y   xY wc c}w # t,        $ rj d|cxk  rdk  rn nt.        j0                  }nt.        j2                  }||
j+                         dcY t        j                  d
       |j                          S w xY w# t        j                  d
       |j                          w xY 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   rE   zUTF-8z1Remote response: status=%s | data=%s | headers=%si,  i0  r   locationzFinished Requesti  i  )statusvaluer7   ;z	image/png   r   r   )r   r~   rG   rD   r   requestr   rt   r   rB   r   r   rE   r   rQ   closer|   anyrN   r   	load_jsonr}   
ValueErrorr	   SUCCESSUNKNOWN_ERROR)rS   methodr\   r   rC   rE   response
statuscodeconnhttpr   content_typexr   s                 r#   r   zRemoteConnection._request0  s    ^^C(
44ZQF/1D??zz))&#D')RH!J//1D Q<<$<PQ!J}}##G,H(//[_aiaqaqr	j&3&}}UH,<,<,@,@T,RS0 LL+,NN1 Z&3&",t<, LL+,NN- L##ND9'//33NDIOOPST<Ha[1HIE ??4::<8D $&$(DM LL+,NN	  $/DLL+,NNAQ Q I " EZ-#-!*!2!2!*!8!8&,tzz|DD LL+,NN!E LL+,NNsb   J 89L L AL !J9L #J $
L L  J
L ALL LL 'L/c                 R    t        | d      r| j                  j                          yy)z<Clean up resources when finished with the remote_connection.r   N)hasattrr   clearrR   s    r#   r   zRemoteConnection.closeh  s!    4!JJ "r%   c                     i }|j                         D ]Z  \  }}t        |t              r| j                  ||      ||<   ,t        |t              rt        |      |kD  r|d| dz   ||<   V|||<   \ |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   r[   )rS   
input_dict
max_lengthoutput_dictionarykeyr   s         r#   r   z$RemoteConnection._trim_large_entriesm  s     $**, 	/JC%&)-)A)A%)T!#&E3'CJ,C).{
);e)C!#&).!#&	/ ! r%   )F)FF)N)d   ) __name__
__module____qualname____doc__browser_namer   r    r   rO   rP   getenvcertifiwherer-   classmethodr$   r(   r*   r.   r1   rG   rT   r]   rc   rt   r   boolr   r   r   r   r   rl   r%   r#   r   r      s    L--H3G2::3U			./[h[b[h[h[jIX X   6 6      6N<
(=$)3 )D )X\ )8>26p
!r%   r   )iloggingrO   r;   r   r   base64r   urllibr   r   ro   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_FILESr   r   rl   r%   r#   <module>r      s  $  	            #			8	$[-[LL3[ ))+P[ ""$Q	[
 KK4[ ?[ OO9[ OO<[  L[ $$&S[ ?[ ;[ B[ A[  U[  A![" C#[$ ""$Q%[&  S'[( !U)[* L+[, L-[. M/[0   "S1[2   "Q3[4 !T5[6  R7[8 M9[: !!#];[<   "[=[> !!#Z?[@ ""$\A[B NC[D ))+cE[F **,eG[H BI[J >K[L CM[N  HO[P IQ[R BS[T ""$PU[V DW[X BY[Z MM;[[\ --/k][^   "O_[` Ba[b Ac[d Le[f Jg[h !Ki[j  Ik[l @m[n Ho[p Hq[r Gs[t !Pu[v ""$Ow[x ""$Ny[z ""$U{[| ""$V}[~ OO;[@ ##%PA[B ""$JC[D DE[F FG[H PI[J L=%%'](( + no   "" % i@""$KC%%'Qu[|z! z!r%   