
    hgU                         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 j        e          Z G d	 d
e          ZdS )    N)	b64encode)parse)__version__   )Command)	ErrorCode)utilsc                       e Zd ZdZdZej        Z 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dZd ZddZ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                 >    | j         t          j        k    rdn| j         S )zt
        :Returns:
            Timeout value in seconds for all http requests made to the Remote Connection
        N)_timeoutsocket_GLOBAL_DEFAULT_TIMEOUTclss    d/var/www/fb-scrape/myenv/lib/python3.11/site-packages/selenium/webdriver/remote/remote_connection.pyget_timeoutzRemoteConnection.get_timeout0   s     |v'EEEtt3<W    c                     || _         dS )z
        Override the default timeout

        :Args:
            - timeout - timeout value for http requests in seconds
        N)r   )r   timeouts     r   set_timeoutzRemoteConnection.set_timeout8   s     r   c                 (    t           j        | _        dS )zR
        Reset the http request timeout to socket._GLOBAL_DEFAULT_TIMEOUT
        N)r   r   r   r   s    r   reset_timeoutzRemoteConnection.reset_timeoutB   s    
 5r   c                     | j         S )zv
        :Returns:
            Paths of the .pem encoded certificate to verify connection to command executor
        	_ca_certsr   s    r   get_certificate_bundle_pathz,RemoteConnection.get_certificate_bundle_pathI   s     }r   c                     || _         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   paths     r   set_certificate_bundle_pathz,RemoteConnection.set_certificate_bundle_pathQ   s     r   Fc                    t          j                                                    }|dk    rd}ddd                    t          |          d}|j        rpt          d                    |                                                    }|                    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/{} (python {}))AcceptContent-Typez
User-Agentz{0.username}:{0.password}AuthorizationzBasic {}
Connectionz
keep-alive)
platformsystemlowerformatr   usernamer   encodeupdatedecode)r   
parsed_url
keep_aliver)   headersbase64strings         r   get_remote_connection_headersz.RemoteConnection.get_remote_connection_headers\   s     ""((**XF )<3::;OO
 
  	$%@%G%G
%S%S%Z%Z%\%\]]LNN!2!2<3F3F3H3H!I!I     	NNl    r   c                 b   | 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selfs    r   _get_proxy_urlzRemoteConnection._get_proxy_url}   s    9
++ 	N:>>-1N1NOOOY!!),, 	N:>>,
|0L0LMMM	N 	Nr   c                     d| j         i}| j        rd|d<   | j        |d<   | j        st          j        di |nt          j        | j        fi |S )Nr   CERT_REQUIRED	cert_reqsca_certs )r   r   
_proxy_urlurllib3PoolManagerProxyManager)r@   pool_manager_init_argss     r   _get_connection_managerz(RemoteConnection._get_connection_manager   sw    t}"
 > 	@2A";/15":.DHO Lw"<<%;<<< KK4JKK	Lr   c                    |rdd l }|                    dt                     || _        || _        t
          j                            dt
          j                            d                    }|r|                    d          D ]{}|	                                }|dk    rd} n\t          j        |          }t          j        | j                  }	|j        r|	j        |j        k    rd} ni|j        |	j        v rd} n||s|                                 nd | _        |r|                                 | _        i 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i 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$          j0        d%t$          j1        d&t$          j2        d't$          j3        d(t$          j4        d)i t$          j5        d*t$          j6        d+t$          j7        d,t$          j8        d-t$          j9        d.t$          j:        d/t$          j;        d0t$          j<        d1t$          j=        d2t$          j>        d3t$          j?        d4t$          j@        d5t$          jA        d6t$          jB        d7t$          jC        d8t$          jD        d9t$          jE        d:i t$          jF        d;t$          jG        d<t$          jH        d=t$          jI        d>t$          jJ        d?t$          jK        d@t$          jL        dAt$          jM        dBt$          jN        dCt$          jO        dDt$          jP        dEt$          jQ        dFt$          jR        dGt$          jS        dHt$          jT        dIt$          jU        dJt$          jV        dKi t$          jW        dLt$          jX        dMt$          jY        dNt$          jZ        dOt$          j[        dPt$          j\        dQt$          j]        dRt$          j^        dSt$          j_        dTt$          j`        dUt$          ja        dVt$          jb        dWt$          jc        dXt$          jd        dYt$          je        dZt$          jf        d[t$          jg        d\i t$          jh        d]t$          ji        d^t$          jj        d_t$          jk        d`t$          jl        dat$          jm        dbt$          jn        dct$          jo        ddt$          jp        det$          jq        dft$          jr        dgt$          js        dht$          jt        dit$          ju        djt$          jv        dkt$          jw        dlt$          jx        dmi t$          jy        dnt$          jz        dot$          j{        dpt$          j|        dqt$          j}        drt$          j~        dst$          j        dtt$          j        dut$          j        dvt$          j        dwt$          j        dxt$          j        dyt$          j        dzt$          j        d{t$          j        d|t$          j        d}t$          j        d~t$          j        dt$          j        dt$          j        dt$          j        dt$          j        dt$          j        dt$          j        dt$          j        dt$          j        di	| _        d S )Nr   zM'resolve_ip' option removed; ip addresses are now always resolved by urllib3.no_proxyNO_PROXY,*T)GETz/status)POSTz/session)rR   z	/sessions)DELETEz/session/$sessionId)rR   z!/session/$sessionId/window_handle)rR   /session/$sessionId/window)rR   z"/session/$sessionId/window_handles)rR   z"/session/$sessionId/window/handles)rS   /session/$sessionId/url)rS   z/session/$sessionId/forward)rS   z/session/$sessionId/back)rS   z/session/$sessionId/refresh)rS   z/session/$sessionId/execute)rS   z /session/$sessionId/execute/sync)rS   z!/session/$sessionId/execute/async)rR   rV   )rR   z/session/$sessionId/title)rR   z/session/$sessionId/source)rR   z/session/$sessionId/screenshot)rR   z*/session/$sessionId/element/$id/screenshot)rS   z/session/$sessionId/element)rS   z/session/$sessionId/elements)rR   "/session/$sessionId/element/active)rS   rW   )rS   z'/session/$sessionId/element/$id/element)rS   z(/session/$sessionId/element/$id/elements)rS   z%/session/$sessionId/element/$id/click)rS   z%/session/$sessionId/element/$id/clear)rS   z&/session/$sessionId/element/$id/submit)rR   z$/session/$sessionId/element/$id/text)rS   %/session/$sessionId/element/$id/value)rS   z/session/$sessionId/keys)rS   z/session/$sessionId/se/file)rR   rX   )rR   z$/session/$sessionId/element/$id/name)rR   (/session/$sessionId/element/$id/selected)rS   rY   )rR   z'/session/$sessionId/element/$id/enabled)rR   z)/session/$sessionId/element/$id/displayed)rR   z(/session/$sessionId/element/$id/location)rR   z0/session/$sessionId/element/$id/location_in_view)rR   z$/session/$sessionId/element/$id/size)rR   z$/session/$sessionId/element/$id/rect)rR   z//session/$sessionId/element/$id/attribute/$name)rR   z./session/$sessionId/element/$id/property/$name)rR   z,/session/$sessionId/element/$id/computedrole)rR   z-/session/$sessionId/element/$id/computedlabel)rR   z&/session/$sessionId/element/$id/shadow)rS   z,/session/$sessionId/shadow/$shadowId/element)rS   z-/session/$sessionId/shadow/$shadowId/elements)rR   /session/$sessionId/cookie)rS   rZ   )rR    /session/$sessionId/cookie/$name)rT   rZ   )rT   r[   )rS   z/session/$sessionId/frame)rS   z /session/$sessionId/frame/parent)rS   rU   )rS   z/session/$sessionId/window/new)rT   rU   )rR   z1/session/$sessionId/element/$id/css/$propertyName)rS   z*/session/$sessionId/timeouts/implicit_wait)rS   z!/session/$sessionId/execute_async)rS   z)/session/$sessionId/timeouts/async_script)rS   /session/$sessionId/timeouts)rR   r\   )rS   z!/session/$sessionId/dismiss_alert)rS   z!/session/$sessionId/alert/dismiss)rS   z /session/$sessionId/accept_alert)rS   z /session/$sessionId/alert/accept)rS   /session/$sessionId/alert_text)rS   /session/$sessionId/alert/text)rR   r]   )rR   r^   )rS   z%/session/$sessionId/alert/credentials)rS   z/session/$sessionId/click)rS   /session/$sessionId/actions)rT   r_   )rS   z/session/$sessionId/doubleclick)rS   z/session/$sessionId/buttondown)rS   z/session/$sessionId/buttonup)rS   z/session/$sessionId/moveto)rR   -/session/$sessionId/window/$windowHandle/size)rS   r`   )rR   1/session/$sessionId/window/$windowHandle/position)rS   ra   )rS   /session/$sessionId/window/rect)rR   rb   )rS   z1/session/$sessionId/window/$windowHandle/maximize)rS   z#/session/$sessionId/window/maximize)rS   /session/$sessionId/orientation)rR   rc   )rS   z/session/$sessionId/touch/click)rS   z/session/$sessionId/touch/down)rS   z/session/$sessionId/touch/up)rS   z/session/$sessionId/touch/move)rS   z /session/$sessionId/touch/scroll)rS   z%/session/$sessionId/touch/doubleclick)rS   z#/session/$sessionId/touch/longclick)rS   z/session/$sessionId/touch/flick)rS   z/session/$sessionId/execute_sql)rR   /session/$sessionId/location)rS   rd   )rR   z%/session/$sessionId/application_cache)rR   z,/session/$sessionId/application_cache/status)rT   z+/session/$sessionId/application_cache/clear)rR   &/session/$sessionId/network_connection)rS   re   )rR   */session/$sessionId/local_storage/key/$key)rT   rf   )rR   !/session/$sessionId/local_storage)rS   rg   )rT   rg   )rR   z&/session/$sessionId/local_storage/size)rR   ,/session/$sessionId/session_storage/key/$key)rT   rh   )rR   #/session/$sessionId/session_storage)rS   ri   )rT   ri   )rR   z(/session/$sessionId/session_storage/size)rS   z/session/$sessionId/se/log)rR   z /session/$sessionId/se/log/types)rR   /session/$sessionId/context)rR   z/session/$sessionId/contexts)rS   rj   )rS   z%/session/$sessionId/window/fullscreen)rS   z#/session/$sessionId/window/minimize)rS   z/session/$sessionId/print)warningswarnDeprecationWarningr1   r:   r<   r=   r>   splitstripr   urlparsenetlocr   rA   rG   rL   _connr   STATUSNEW_SESSIONGET_ALL_SESSIONSQUITGET_CURRENT_WINDOW_HANDLEW3C_GET_CURRENT_WINDOW_HANDLEGET_WINDOW_HANDLESW3C_GET_WINDOW_HANDLESrR   
GO_FORWARDGO_BACKREFRESHEXECUTE_SCRIPT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GET_ACTIVE_ELEMENTFIND_CHILD_ELEMENTFIND_CHILD_ELEMENTSCLICK_ELEMENTCLEAR_ELEMENTSUBMIT_ELEMENTGET_ELEMENT_TEXTSEND_KEYS_TO_ELEMENTSEND_KEYS_TO_ACTIVE_ELEMENTUPLOAD_FILEGET_ELEMENT_VALUEGET_ELEMENT_TAG_NAMEIS_ELEMENT_SELECTEDSET_ELEMENT_SELECTEDIS_ELEMENT_ENABLEDIS_ELEMENT_DISPLAYEDGET_ELEMENT_LOCATION,GET_ELEMENT_LOCATION_ONCE_SCROLLED_INTO_VIEWGET_ELEMENT_SIZE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IMPLICIT_WAITEXECUTE_ASYNC_SCRIPTSET_SCRIPT_TIMEOUTSET_TIMEOUTSGET_TIMEOUTSDISMISS_ALERTW3C_DISMISS_ALERTACCEPT_ALERTW3C_ACCEPT_ALERTSET_ALERT_VALUEW3C_SET_ALERT_VALUEGET_ALERT_TEXTW3C_GET_ALERT_TEXTSET_ALERT_CREDENTIALSCLICKW3C_ACTIONSW3C_CLEAR_ACTIONSDOUBLE_CLICK
MOUSE_DOWNMOUSE_UPMOVE_TOGET_WINDOW_SIZESET_WINDOW_SIZEGET_WINDOW_POSITIONSET_WINDOW_POSITIONSET_WINDOW_RECTGET_WINDOW_RECTMAXIMIZE_WINDOWW3C_MAXIMIZE_WINDOWSET_SCREEN_ORIENTATIONGET_SCREEN_ORIENTATION
SINGLE_TAP
TOUCH_DOWNTOUCH_UP
TOUCH_MOVETOUCH_SCROLL
DOUBLE_TAP
LONG_PRESSFLICKEXECUTE_SQLGET_LOCATIONSET_LOCATIONGET_APP_CACHEGET_APP_CACHE_STATUSCLEAR_APP_CACHEGET_NETWORK_CONNECTIONSET_NETWORK_CONNECTIONGET_LOCAL_STORAGE_ITEMREMOVE_LOCAL_STORAGE_ITEMGET_LOCAL_STORAGE_KEYSSET_LOCAL_STORAGE_ITEMCLEAR_LOCAL_STORAGEGET_LOCAL_STORAGE_SIZEGET_SESSION_STORAGE_ITEMREMOVE_SESSION_STORAGE_ITEMGET_SESSION_STORAGE_KEYSSET_SESSION_STORAGE_ITEMCLEAR_SESSION_STORAGEGET_SESSION_STORAGE_SIZEGET_LOGGET_AVAILABLE_LOG_TYPESCURRENT_CONTEXT_HANDLECONTEXT_HANDLESSWITCH_TO_CONTEXTFULLSCREEN_WINDOWMINIMIZE_WINDOW
PRINT_PAGE	_commands)
r@   remote_server_addrr1   
resolve_ipignore_proxyrk   	_no_proxynpun_url
remote_adds
             r   __init__zRemoteConnection.__init__   s
    	$OOOMM_"$ $ $ %&	 JNN:rz~~j/I/IJJ	 	 s++  iikk#::#'LEs++"^DI66
< !(EL88'+ 9 zZ%666'+ 7 8DM$--/// 	85577DJb
N.b
!5b
 $&:b
 L;	b

 -<b
 15b
 &=b
 *=b
 K<b
  Gb
 OAb
  OD!b
" "$K#b
$ &<'b
( ,=+b
, #%G-b
. C/b
 b
0 #%J1b
2  I3b
4 &(]5b
6  "I7b
8 !#K9b
: *,Y;b
< &>?b
@ &CCb
D 'DGb
H !#TIb
J !#TKb
L "$VMb
N $&UOb
P (ASb
T /4Wb
X !HYb
Z %@]b
 b
 b
^ (?ab
b 'Ceb
f (Dib
j &Bmb
n (Dqb
r (Cub
v @Kyb
z $?}b
~ $?Ab
B )JEb
F (IIb
J )GMb
N *HQb
R #AUb
V 1HYb
Z 2I]b
^ #%J_b
 b
 b
`  Fab
b  Kcb
d &8gb
h !>kb
l #%Jmb
n *,Xob
p $&Lqb
r  Jsb
t MCub
v 5Lyb
z !F}b
~ (*Wb
@ &ECb
D  8Gb
H  7Kb
L !=Ob
P %=Sb
 b
 b
T  <Wb
X $<[b
\ #:_b
` ':cb
d "9gb
h &9kb
l )Aob
p M5sb
t 7wb
x %9{b
|  ;b
@ :Cb
D 8Gb
H O6Kb
L #HOb
P #ISb
T 'LWb
 b
 b
X 'M[b
\ #;_b
` #:cb
d #Mgb
h '?kb
l *;ob
p *:sb
t ;wb
x :{b
| 8b
@ :Cb
D  <Gb
H AKb
L ?Ob
P M;Sb
T ;Wb
X  7[b
 b
 b
\  8_b
` !@cb
d (Ggb
h #Ikb
l *Aob
p *Bsb
t *Ewb
x -H{b
| *<b
@ *=Cb
D '?Gb
H *AKb
L ,GOb
P /JSb
T ,>Wb
X ,?[b
\ )A_b
 b
` ,CO6+;*6#7%7%A#?5Cb
 b
r   c                 F   | j         |         }|J d|z              t          j        |d                                       |          }t	          |t
                    rd|v r|d= t          j        |          }| j         | }| 	                    |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   	sessionIdr   )body)
r   stringTemplate
substitute
isinstancedictr	   	dump_jsonr:   _request)r@   commandparamscommand_infor   dataurls          r   executezRemoteConnection.execute  s     ~g.'')BW)L'''|A//::6BBfd## 	$v(=(={#v&&"D""}}\!_c}===r   c                 &   t                               | d| d|            t          j        |          }|                     || j                  }d|r|dk    r|dk    rd}| j        r&| j                            ||||          j        }n| 	                                }|5 }|                    ||||          ddd           n# 1 swxY w Y   j        }t          d          s?t          j        d          rfd_        nt          j        d          r
fd	_        j                            d
          }		 d|cxk    rdk     rZn nW|                     d                    d                    t                               d                                            S d|cxk     rdk    r6n n3||	dt                               d                                            S g }
                    d          r(                    d                              d          }
t%          d |
D                       s	 t'          j        |	                                          }	n~# t,          $ rq d|cxk     rdk     rn nt.          j        }nt.          j        }||	                                dcY t                               d                                            S w xY wd|	vrd|	d<   |	t                               d                                            S d|	d}	|	t                               d                                            S # t                               d                                            w xY w)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.
         NrS   PUT)r   r2   	getheaderc                 8    j                             |           S N)r2   r  xresps    r   <lambda>z+RemoteConnection._request.<locals>.<lambda>  s    t|/E/Ea/H/H r   r>   c                 8    j                             |           S r  )r2   r>   r  s    r   r  z+RemoteConnection._request.<locals>.<lambda>  s    t|/?/?/B/B r   zUTF-8i,  i0  rR   locationzFinished Requesti  i  )statusvaluer%   ;c                 8    g | ]}|                     d           S )z	image/png)r;   ).0r  s     r   
<listcomp>z-RemoteConnection._request.<locals>.<listcomp>  s$    HHHa[11HHHr      r  r   )LOGGERdebugr   rp   r4   r1   rr   requestr  rL   hasattrr2   r  r  r/   r  closern   anyr	   	load_jsonro   
ValueErrorr   SUCCESSUNKNOWN_ERROR)r@   methodr	  r   r0   r2   
statuscodeconnhttpr  content_typer  r  s               @r   r  zRemoteConnection._request  s    	----t--...^C((
44ZQQ 	Ff$$5D? 	C:%%fcg%NNDJJ//11D M||FCdG|LLM M M M M M M M M M M M M M M J4-- C4<55 C%H%H%H%HDNNT\511 C%B%B%B%BDNy((	j&&&&3&&&&&}}UDNN:,F,FGG4 LL+,,,JJLLLL5 Z&&&&3&&&&&",t<<0 LL+,,,JJLLLL1 L~~n-- I#~~n==CCCHHHH<HHHII E ?4::<<88DD! E E EZ----#-----!*!2!*!8&,tzz||DDDD LL+,,,JJLLLL#E $&&$(DM
 LL+,,,JJLLLL	 #$d33LL+,,,JJLLLL LL+,,,JJLLLLsV   (CCC
8M  1M  4AM  &I4 3M  4A
K/>M  .K//M  +M   0Nc                 \    t          | d          r| j                                         dS dS )zM
        Clean up resources when finished with the remote_connection
        rr   N)r!  rr   clearr?   s    r   r"  zRemoteConnection.close  s:     4!! 	J	 	r   )F)FNFr  )__name__
__module____qualname____doc__browser_namer   r   r   certifiwherer   classmethodr   r   r   r   r    r4   rA   rL   r   r
  r  r"  rF   r   r   r   r   &   sY       D D
 L-HIX X [X   [ 6 6 [6   [   [    [@N N N	L 	L 	LB
 B
 B
 B
H> > >*@ @ @ @D    r   r   )loggingr   r   r<   r4  rH   r(   base64r   urllibr   seleniumr   r  r   errorhandlerr    r	   	getLoggerr/  r  objectr   rF   r   r   <module>r?     s  $    				                                  # # # # # #      		8	$	$H H H H Hv H H H H Hr   