
    g~                        d 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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 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 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" 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+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1 dd l2m3Z3 dd!l4m5Z5 dd"l6m7Z7 dd#l8m9Z9 dd$l:m;Z; dd%l:m<Z< dd&l=m>Z> dd'l?m@Z@ dd(lAmBZB dd)lCmDZD dd*lEmFZF dd+lGmHZH dd,lImJZJ dd-lKmLZL daMdaNd. ZOd/ ZP	 d>d0eQd1eeReBf   d2eSd3eSd4ee3   d5eBfd6ZTd7ee#   d5efd8ZU G d9 d:e;      ZV G d< d=eV      ZWy)?zThe WebDriver implementation.    N)ABCMeta)	b64decode)urlsafe_b64encode)asynccontextmanager)contextmanager)import_module)Dict)List)Optional)Union)InvalidArgumentException)JavascriptException)NoSuchCookieException)NoSuchElementException)WebDriverException)Script)By)
ArgOptions)BaseOptions)PrintOptions)Timeouts)
Credential)VirtualAuthenticatorOptions)required_virtual_authenticator)
RelativeBy   )Dialog   )BidiConnection)ClientConfig)Command)ErrorHandler)FedCM)FileDetector)LocalFileDetector)LocatorConverter)Mobile)RemoteConnection)	ScriptKey)
ShadowRoot)SwitchTo)
WebElement)WebSocketConnectionc                  (    t         st        d      a y y )Nz"selenium.webdriver.common.bidi.cdp)cdpr        V/var/www/html/venv/lib/python3.12/site-packages/selenium/webdriver/remote/webdriver.py
import_cdpr3   N   s    @A r1   c                 z    t        j                  |       } i }| j                         D ]
  \  }}|||<    di g|diS )a  Makes a W3C alwaysMatch capabilities object.

    Filters out capability names that are not in the W3C spec. Spec-compliant
    drivers will reject requests containing unknown capability names.

    Moves the Firefox profile, if present, from the old location to the new Firefox
    options object.

    :Args:
     - caps - A dictionary of capabilities requested by the caller.
    capabilities)
firstMatchalwaysMatch)copydeepcopyitems)capsalways_matchkvs       r2   _create_capsr?   T   sK     ==DL

 1QB4MNNr1   r5   command_executor
keep_aliveignore_local_proxyclient_configreturnc                      t        |t              r#|xs t        |      }||_        t	        |      }ddlm} ddlm} ddl	m
} ddlm} ||||g}	t         fd|	D        t              }
 |
||||	      S )
N)remote_server_addr)rC   r   )ChromeRemoteConnection)EdgeRemoteConnection)FirefoxRemoteConnection)SafariRemoteConnectionc              3   `   K   | ]%  }|j                   j                  d       k(  s"| ' yw)browserNameN)browser_nameget).0cr5   s     r2   	<genexpr>z(get_remote_connection.<locals>.<genexpr>x   s(     _!Q^^|?O?OP]?^-^A_s   #..)rF   rA   ignore_proxyrC   )
isinstancestrr    rF   r(   +selenium.webdriver.chrome.remote_connectionrG   )selenium.webdriver.edge.remote_connectionrH   ,selenium.webdriver.firefox.remote_connectionrI   +selenium.webdriver.safari.remote_connectionrJ   next)r5   r@   rA   rB   rC   rG   rH   rI   rJ   
candidateshandlers   `          r2   get_remote_connectionr\   g   s|     "C(%ZIY)Z+;(+-HRNTR(*>@VXopJ_z_aqrG+'#	 r1   optionsc                    di i}g }| D ]!  }|j                  |j                                # t        |      }i }t        |      D ]n  }|}|dz   |k  s||   j	                         }|D ]I  }	|	||dz      j	                         v s||   |	   ||dz      |	   k(  s1|j                  |	||   |	   i       K p i }
|j                         D ]
  \  }}||
|<    |D ]  }|
D ]  }||=   |
|d   d<   ||d   d<   |S )Nr5   r   r7   r6   )appendto_capabilitieslenrangekeysupdater:   )r]   r5   optsopt	opts_sizesamesiesi	min_index
first_keyskysalwaysr=   r>   s                r2   create_matchesrn      sW   "B'LD +C'')*+D	IH 9 E	q59i--/J! E$q1u+**,,Is+tAE{3/?? d9oc.B(CDEE F  1q	   	A!	 39L /15L .r1   c                       e Zd ZdZy)BaseWebDriverzAbstract Base Class for all Webdriver subtypes.

    ABC's allow custom implementations of Webdriver to be registered so
    that isinstance type checks will succeed.
    N)__name__
__module____qualname____doc__r0   r1   r2   rp   rp      s    r1   rp   )	metaclassc                      e Zd ZdZeZeZ	 	 	 	 	 	 	 dvdee	e
f   dedee   deeeee   f      dee   dee   d	ee   d
dfdZd Zd Zdej                  ej.                  e      dej                  e   dej                  ej4                     fdZed        Zed
efd       Z ed
e	fd       Z!d Z"d Z#de$d
dfdZ%d Z&de	d
efdZ'd Z(dwde	de$d
e$fdZ)d e	d
dfd!Z*ed
e	fd"       Z+dwd#e	d
e,fd$Z-d%e,d
dfd&Z.d
ee	   fd'Z/d( Z0d#e	fd)Z1ed
e	fd*       Z2ed
e	fd+       Z3dxd,Z4dxd-Z5ed
e	fd.       Z6ed
ee	   fd/       Z7dxd0Z8dxd1Z9dxd2Z:dwd3ee;   d
e	fd4Z<ed
e=fd5       Z>dxd6Z?dxd7Z@dxd8ZAd
ee$   fd9ZBd
ej                  ej                     fd:ZDdxd;ZEdxd<ZFdxd=ZGd>eHd
dfd?ZId>eHd
dfd@ZJd>eHd
dfdAZKed
eLfdB       ZMeMj                  dxdC       ZMeOj                  dfdDee	   d
efdEZQeOj                  dfdDee	   d
ee   fdFZRed
e$fdG       ZSd
efdHZTd
efdIZUd
eVfdJZWd
e	fdKZXdydLe	d
dfdMZYdydLe	d
e$fdNZZdydOeHdPeHdLe	d
e$fdQZ[dyd
e$fdRZ\dLe	d
dfdSZ]d
e$fdTZ^dzd
e$fdUZ_ed
efdV       Z`e`j                  dxdW       Z`edX        Zaeaj                  dxdY       ZaedZ        Zbd[ Zcd\ Zdeed]        Zfed^        Zgd_ Zhd` Zidejd
dfdaZked
e	fdb       Zlemdxdc       Znemddeod
dfde       Zpemd
eeo   fdf       Zqemdgee	erf   d
dfdh       Zsemdxdi       Ztemdjed
dfdk       Zud
e$fdlZvdme	dne	d
dfdoZwdxdpZxed
eyfdq       Zzed
efdr       Z{ds Z|edt        Z}d{duZ~y)|	WebDrivera  Controls a browser by sending commands to a remote server. This server
    is expected to be running the WebDriver wire protocol as defined at
    https://www.selenium.dev/documentation/legacy/json_wire_protocol/.

    :Attributes:
     - session_id - String ID of the browser session started and controlled by this WebDriver.
     - capabilities - Dictionary of effective capabilities of this browser session as returned
         by the remote server. See https://www.selenium.dev/documentation/legacy/desired_capabilities/
     - command_executor - remote_connection.RemoteConnection object used to execute commands.
     - error_handler - errorhandler.ErrorHandler object used to handle errors.
    Nr@   rA   file_detectorr]   locator_converterweb_element_clsrC   rD   c                    t        |t              rt        |      }d}	n|j                         }|j                  }	|| _        t        | j
                  t        t        f      rt        ||||	|      | _        d| _	        d| _
        i | _        i | _        t               | _        t        |       | _        t#        |       | _        |xs
 t'               | _        |xs
 t+               | _        |xs | j.                  | _        d| _        | j3                          | j5                  |       t7        |       | _        d| _        d| _        y)a  Create a new driver that will issue commands using the wire
        protocol.

        :Args:
         - command_executor - Either a string representing URL of the remote server or a custom
             remote_connection.RemoteConnection object. Defaults to 'http://127.0.0.1:4444/wd/hub'.
         - keep_alive - (Deprecated) Whether to configure remote_connection.RemoteConnection to use
             HTTP keep-alive. Defaults to True.
         - file_detector - Pass custom file detector object during instantiation. If None,
             then default LocalFileDetector() will be used.
         - options - instance of a driver options.Options class
         - locator_converter - Custom locator converter to use. Defaults to None.
         - web_element_cls - Custom class to use for web elements. Defaults to WebElement.
         - client_config - Custom client configuration to use. Defaults to None.
        F)r@   rA   rB   rC   TN)rS   listrn   r`   _ignore_local_proxyr@   rT   bytesr\   
_is_remote
session_idr;   pinned_scriptsr"   error_handlerr+   
_switch_tor'   _mobiler%   rx   r&   ry   _web_element_cls_authenticator_idstart_clientstart_sessionr#   _fedcm_websocket_connection_script)
selfr@   rA   rx   r]   ry   rz   rC   r5   r}   s
             r2   __init__zWebDriver.__init__   s    4 gt$)'2L"'"224L")"="= 0d++c5\:$9!1%#6+%D! 	 )^"4.d|*A.?.A!2!H6F6H / H43H3H!%<(Dk%)"r1   c                 z    dt        |       j                   dt        |       j                   d| j                   dS )N<.z (session="z")>)typerr   rq   r   r   s    r2   __repr__zWebDriver.__repr__   s9    4:(()4:+>+>*?{4??J[[^__r1   c                     | S Nr0   r   s    r2   	__enter__zWebDriver.__enter__   s    r1   exc_typeexc	tracebackc                 $    | j                          y r   )quit)r   r   r   r   s       r2   __exit__zWebDriver.__exit__   s     			r1   c              /      K   d}t        | j                  |      s| j                  } ||i || _        	 d |r|| _        yy# |r|| _        w w xY ww)a  Overrides the current file detector (if necessary) in limited
        context. Ensures the original file detector is set afterwards.

        Example::

            with webdriver.file_detector_context(UselessFileDetector):
                someinput.send_keys('/etc/hosts')

        :Args:
         - file_detector_class - Class of the desired file detector. If the class is different
             from the current file_detector, then the class is instantiated with args and kwargs
             and used as a file detector during the duration of the context manager.
         - args - Optional arguments that get passed to the file detector class during
             instantiation.
         - kwargs - Keyword arguments, passed the same way as args.
        N)rS   rx   )r   file_detector_classargskwargslast_detectors        r2   file_detector_contextzWebDriver.file_detector_context  sc     $ $,,.AB ..M!4d!Ef!ED	3%2" }%2" s   2AA AAAc                     | j                   S r   )r   r   s    r2   mobilezWebDriver.mobile!  s    ||r1   c                 R    d| j                   v r| j                   d   S t        d      )zReturns the name of the underlying browser for this instance.

        :Usage:
            ::

                name = driver.name
        rL   z1browserName not specified in session capabilities)r;   KeyErrorr   s    r2   namezWebDriver.name%  s+     DII%99]++JKKr1   c                      y)zxCalled before starting a new session.

        This method may be overridden to define custom startup behavior.
        Nr0   r   s    r2   r   zWebDriver.start_client2  s    
 	r1   c                      y)zCalled after executing a quit command.

        This method may be overridden to define custom shutdown
        behavior.
        Nr0   r   s    r2   stop_clientzWebDriver.stop_client9  s     	r1   r5   c                     t        |      }| j                  t        j                  |      d   }|j	                  d      | _        |j	                  d      | _        y)zCreates a new session with the desired capabilities.

        :Args:
         - capabilities - a capabilities dict to start the session with.
        value	sessionIdr5   N)r?   executer!   NEW_SESSIONrN   r   r;   )r   r5   r;   responses       r2   r   zWebDriver.start_sessionA  sI     L)<< 3 3T:7C",,{3LL0	r1   c                 `    t        |t              r0i }|j                         D ]  \  }} j                  |      ||<    |S t        | j                        rd|j
                  iS t        | j                        rd|j
                  iS t        |t              rt         fd|D              S |S )N#element-6066-11e4-a52e-4f735466cecf"shadow-6066-11e4-a52e-4f735466cecfc              3   @   K   | ]  }j                  |        y wr   )_wrap_valuerO   itemr   s     r2   rQ   z(WebDriver._wrap_value.<locals>.<genexpr>X  s     A4((.A   )rS   dictr:   r   r   id_shadowroot_clsr|   )r   r   	convertedkeyvals   `    r2   r   zWebDriver._wrap_valueM  s    eT"I!KKM 7S!%!1!1#!6	#7eT2239588DDeT1128%((CCeT"A5AAAr1   
element_idc                 &    | j                  | |      S )z6Creates a web element with the specified `element_id`.)r   )r   r   s     r2   create_web_elementzWebDriver.create_web_element[  s    $$T:66r1   c                 .    t        |t              r_d|v r j                  |d         S d|v r j                   |d         S |j	                         D ]  \  }} j                  |      ||<    |S t        |t              rt         fd|D              S |S )Nr   r   c              3   @   K   | ]  }j                  |        y wr   )_unwrap_valuer   s     r2   rQ   z*WebDriver._unwrap_value.<locals>.<genexpr>i  s     CT**40Cr   )rS   r   r   r   r:   r   r|   )r   r   r   r   s   `   r2   r   zWebDriver._unwrap_value_  s    eT"4=..u5Z/[\\3u<++D%8\2]^^!KKM 5S!//4c
5LeT"CUCCCr1   driver_commandparamsc                 b   | j                  |      }| j                  r$|sd| j                  i}nd|vr| j                  |d<   | j                  j                  ||      }|rA| j                  j                  |       | j                  |j                  dd            |d<   |S dd| j                  dS )aH  Sends a command to be executed by a command.CommandExecutor.

        :Args:
         - driver_command: The name of the command to execute as a string.
         - params: A dictionary of named parameters to send with the command.

        :Returns:
          The command's JSON response loaded into a dictionary object.
        r   r   Nr   )successr   r   )r   r   r@   r   r   check_responser   rN   )r   r   r   r   s       r2   r   zWebDriver.executel  s     !!&)??%t7F*&*oo{#((00H--h7 $ 2 28<<3N OHWO t$//JJr1   urlc                 H    | j                  t        j                  d|i       y)z0Loads a web page in the current browser session.r   N)r   r!   GET)r   r   s     r2   rN   zWebDriver.get  s    W[[5#,/r1   c                 `    | j                  t        j                        j                  dd      S )zuReturns the title of the current page.

        :Usage:
            ::

                title = driver.title
        r    )r   r!   	GET_TITLErN   r   s    r2   titlezWebDriver.title  s&     ||G--.227B??r1   scriptc                 N    t        |      }|| j                  |j                  <   |S )zUStore common javascript scripts to be executed later by a unique
        hashable ID.)r)   r   r   )r   r   
script_keyscript_key_instances       r2   
pin_scriptzWebDriver.pin_script  s,     (
36</223""r1   r   c                     	 | j                   j                  |j                         y# t        $ r t        d| d| j                          dw xY w)z$Remove a pinned script from storage.zNo script with key: z existed in N)r   popr   r   )r   r   s     r2   unpinzWebDriver.unpin  sT    	k##JMM2 	k1*\$J]J]I^_`fjj	ks	   %( &Ac                 ,    t        | j                        S r   )r|   r   r   s    r2   get_pinned_scriptszWebDriver.get_pinned_scripts  s    D''((r1   c                     t        |t              r	 | j                  |j                     }t        |      }t        j                  }| j                  |||d      d   S # t        $ r t        d      w xY w)a'  Synchronously Executes JavaScript in the current window/frame.

        :Args:
         - script: The JavaScript to execute.
         - \*args: Any applicable arguments for your JavaScript.

        :Usage:
            ::

                driver.execute_script('return document.title;')
        z Pinned script could not be foundr   r   r   )
rS   r)   r   r   r   r   r|   r!   W3C_EXECUTE_SCRIPTr   r   r   r   converted_argscommands        r2   execute_scriptzWebDriver.execute_script  sy     fi(N,,VYY7 d,,||G%OPQXYY  N)*LMMNs   A A3c                 h    t        |      }t        j                  }| j                  |||d      d   S )a  Asynchronously Executes JavaScript in the current window/frame.

        :Args:
         - script: The JavaScript to execute.
         - \*args: Any applicable arguments for your JavaScript.

        :Usage:
            ::

                script = "var callback = arguments[arguments.length - 1]; " \
                         "window.setTimeout(function(){ callback('timeout') }, 3000);"
                driver.execute_async_script(script)
        r   r   )r|   r!   W3C_EXECUTE_SCRIPT_ASYNCr   r   s        r2   execute_async_scriptzWebDriver.execute_async_script  s4     d22||G%OPQXYYr1   c                 F    | j                  t        j                        d   S )znGets the URL of the current page.

        :Usage:
            ::

                driver.current_url
        r   )r   r!   GET_CURRENT_URLr   s    r2   current_urlzWebDriver.current_url       ||G334W==r1   c                 F    | j                  t        j                        d   S )zqGets the source of the current page.

        :Usage:
            ::

                driver.page_source
        r   )r   r!   GET_PAGE_SOURCEr   s    r2   page_sourcezWebDriver.page_source  r   r1   c                 B    | j                  t        j                         y)zcCloses the current window.

        :Usage:
            ::

                driver.close()
        N)r   r!   CLOSEr   s    r2   closezWebDriver.close  s     	W]]#r1   c                     	 | j                  t        j                         | j                          | j                  j                          y# | j                          | j                  j                          w xY w)z|Quits the driver and closes every associated window.

        :Usage:
            ::

                driver.quit()
        N)r   r!   QUITr   r@   r   r   s    r2   r   zWebDriver.quit  sW    	*LL&!!'') !!'')s   A ,A8c                 F    | j                  t        j                        d   S )zReturns the handle of the current window.

        :Usage:
            ::

                driver.current_window_handle
        r   )r   r!   W3C_GET_CURRENT_WINDOW_HANDLEr   s    r2   current_window_handlezWebDriver.current_window_handle  s     ||GAAB7KKr1   c                 F    | j                  t        j                        d   S )zReturns the handles of all windows within the current session.

        :Usage:
            ::

                driver.window_handles
        r   )r   r!   W3C_GET_WINDOW_HANDLESr   s    r2   window_handleszWebDriver.window_handles
       ||G::;GDDr1   c                 H    t         j                  }| j                  |d       y)z5Maximizes the current window that webdriver is using.N)r!   W3C_MAXIMIZE_WINDOWr   )r   r   s     r2   maximize_windowzWebDriver.maximize_window  s    --Wd#r1   c                 B    | j                  t        j                         y)z<Invokes the window manager-specific 'full screen' operation.N)r   r!   FULLSCREEN_WINDOWr   s    r2   fullscreen_windowzWebDriver.fullscreen_window  s    W../r1   c                 B    | j                  t        j                         y)z9Invokes the window manager-specific 'minimize' operation.N)r   r!   MINIMIZE_WINDOWr   s    r2   minimize_windowzWebDriver.minimize_window  s    W,,-r1   print_optionsc                 p    i }|r|j                         }| j                  t        j                  |      d   S )zTakes PDF of the current page.

        The driver makes a best effort to return a PDF based on the
        provided parameters.
        r   )to_dictr   r!   
PRINT_PAGE)r   r  r]   s      r2   
print_pagezWebDriver.print_page"  s6     #++-G||G..8AAr1   c                     | j                   S )a<  
        :Returns:
            - SwitchTo: an object containing all options to switch focus into

        :Usage:
            ::

                element = driver.switch_to.active_element
                alert = driver.switch_to.alert
                driver.switch_to.default_content()
                driver.switch_to.frame('frame_name')
                driver.switch_to.frame(1)
                driver.switch_to.frame(driver.find_elements(By.TAG_NAME, "iframe")[0])
                driver.switch_to.parent_frame()
                driver.switch_to.window('main')
        )r   r   s    r2   	switch_tozWebDriver.switch_to.  s    $ r1   c                 B    | j                  t        j                         y)zvGoes one step backward in the browser history.

        :Usage:
            ::

                driver.back()
        N)r   r!   GO_BACKr   s    r2   backzWebDriver.backC       	W__%r1   c                 B    | j                  t        j                         y)zxGoes one step forward in the browser history.

        :Usage:
            ::

                driver.forward()
        N)r   r!   
GO_FORWARDr   s    r2   forwardzWebDriver.forwardM  s     	W''(r1   c                 B    | j                  t        j                         y)zfRefreshes the current page.

        :Usage:
            ::

                driver.refresh()
        N)r   r!   REFRESHr   s    r2   refreshzWebDriver.refreshW  r  r1   c                 F    | j                  t        j                        d   S )zReturns a set of dictionaries, corresponding to cookies visible in
        the current session.

        :Usage:
            ::

                driver.get_cookies()
        r   )r   r!   GET_ALL_COOKIESr   s    r2   get_cookieszWebDriver.get_cookiesb  r   r1   c                     t        j                  t              5  | j                  t        j
                  d|i      d   cddd       S # 1 sw Y   yxY w)zGet a single cookie by name. Returns the cookie if found, None if
        not.

        :Usage:
            ::

                driver.get_cookie('my_cookie')
        r   r   N)
contextlibsuppressr   r   r!   
GET_COOKIEr   r   s     r2   
get_cookiezWebDriver.get_cookiem  sL       !67 	M<< 2 2VTNCGL	M 	M 	Ms   %A		Ac                 H    | j                  t        j                  d|i       y)zDeletes a single cookie with the given name.

        :Usage:
            ::

                driver.delete_cookie('my_cookie')
        r   N)r   r!   DELETE_COOKIEr  s     r2   delete_cookiezWebDriver.delete_cookiez  s     	W**VTN;r1   c                 B    | j                  t        j                         y)zDelete all cookies in the scope of the session.

        :Usage:
            ::

                driver.delete_all_cookies()
        N)r   r!   DELETE_ALL_COOKIESr   s    r2   delete_all_cookieszWebDriver.delete_all_cookies  s     	W//0r1   c                     d|v r,|d   dv sJ | j                  t        j                  d|i       y| j                  t        j                  d|i       y)ag  Adds a cookie to your current session.

        :Args:
         - cookie_dict: A dictionary object, with required keys - "name" and "value";
            optional keys - "path", "domain", "secure", "httpOnly", "expiry", "sameSite"

        :Usage:
            ::

                driver.add_cookie({'name' : 'foo', 'value' : 'bar'})
                driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/'})
                driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/', 'secure' : True})
                driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'sameSite' : 'Strict'})
        sameSite)StrictLaxNonecookieN)r   r!   
ADD_COOKIE)r   cookie_dicts     r2   
add_cookiezWebDriver.add_cookie  sR     $z*.GGGGLL++h-DELL++h-DEr1   time_to_waitc           	      r    | j                  t        j                  dt        t	        |      dz        i       y)a  Sets a sticky timeout to implicitly wait for an element to be found,
        or a command to complete. This method only needs to be called one time
        per session. To set the timeout for calls to execute_async_script, see
        set_script_timeout.

        :Args:
         - time_to_wait: Amount of time to wait (in seconds)

        :Usage:
            ::

                driver.implicitly_wait(30)
        implicit  Nr   r!   SET_TIMEOUTSintfloatr   r*  s     r2   implicitly_waitzWebDriver.implicitly_wait  s-     	W))JE,<ORV<V8W+XYr1   c           	      r    | j                  t        j                  dt        t	        |      dz        i       y)a!  Set the amount of time that the script should wait during an
        execute_async_script call before throwing an error.

        :Args:
         - time_to_wait: The amount of time to wait (in seconds)

        :Usage:
            ::

                driver.set_script_timeout(30)
        r   r-  Nr.  r2  s     r2   set_script_timeoutzWebDriver.set_script_timeout  s-     	W))Hc%:MPT:T6U+VWr1   c           	          	 | j                  t        j                  dt        t	        |      dz        i       y# t
        $ r2 | j                  t        j                  t	        |      dz  dd       Y yw xY w)zSet the amount of time to wait for a page load to complete before
        throwing an error.

        :Args:
         - time_to_wait: The amount of time to wait

        :Usage:
            ::

                driver.set_page_load_timeout(30)
        pageLoadr-  z	page load)msr   N)r   r!   r/  r0  r1  r   r2  s     r2   set_page_load_timeoutzWebDriver.set_page_load_timeout  sf    	hLL--
Cl@SVZ@Z<[/\]! 	hLL--eL6ID6PZe/fg	hs   7: 8A54A5c                     | j                  t        j                        d   }|j                  d      dz  |d<   |j                  d      dz  |d<   |j                  d      dz  |d<   t	        di |S )	zGet all the timeouts that have been set on the current session.

        :Usage:
            ::

                driver.timeouts
        :rtype: Timeout
        r   r,  r-  implicit_waitr7  	page_loadr   r0   )r   r!   GET_TIMEOUTSr   r   )r   timeoutss     r2   r>  zWebDriver.timeouts  ss     << 4 45g>$,LL$<t$C! (Z 84 ?%\\(3d:#(##r1   c                 f    | j                  t        j                  |j                               d   }y)a  Set all timeouts for the session. This will override any previously
        set timeouts.

        :Usage:
            ::
                my_timeouts = Timeouts()
                my_timeouts.implicit_wait = 10
                driver.timeouts = my_timeouts
        r   N)r   r!   r/  _to_json)r   r>  _s      r2   r>  zWebDriver.timeouts  s(     LL--x/@/@/BCGLr1   r   c                    | j                   j                  ||      \  }}t        |t              r2| j	                  ||      }|st        d|j                         |d   S | j                  t        j                  ||d      d   S )zFind an element given a By strategy and locator.

        :Usage:
            ::

                element = driver.find_element(By.ID, 'foo')

        :rtype: WebElement
        )byr   z%Cannot locate relative element with: r   usingr   r   )
ry   convertrS   r   find_elementsr   rootr   r!   FIND_ELEMENT)r   rC  r   elementss       r2   find_elementzWebDriver.find_element  s     **222u=	Eb*%))Ru)=H,/TUWU\U\T]-^__A;||G00B2OPQXYYr1   c                    | j                   j                  ||      \  }}t        |t              rrdj	                  t
        j                  d      dd       }t        j                  |d      j                  d      }d| d}| j                  ||j                               S | j                  t        j                  ||d      d	   xs g S )
zFind elements given a By strategy and locator.

        :Usage:
            ::

                elements = driver.find_elements(By.CLASS_NAME, 'foo')

        :rtype: list of WebElement
        r   NzfindElements.jsutf8z/* findElements */return (z).apply(null, arguments);rD  r   )ry   rF  rS   r   joinrq   splitpkgutilget_datadecoder   r  r   r!   FIND_ELEMENTS)r   rC  r   _pkgraw_functionfind_element_jss         r2   rG  zWebDriver.find_elements  s     **222u=	Eb*%88HNN3/45D"++D2CDKKFSL :<.HabO&&

EE ||G11R%3PQRYZ`^``r1   c                     | j                   S )z4Returns the drivers current capabilities being used.)r;   r   s    r2   r5   zWebDriver.capabilities  s     yyr1   c                 @   t        |      j                         j                  d      st        j                  dt
        d       | j                         }	 t        |d      5 }|j                  |       ddd       ~y# 1 sw Y   xY w# t        $ r Y ~yw xY w# ~w xY w)	a  Saves a screenshot of the current window to a PNG image file.
        Returns False if there is any IOError, else returns True. Use full
        paths in your filename.

        :Args:
         - filename: The full path you wish to save your screenshot to. This
           should end with a `.png` extension.

        :Usage:
            ::

                driver.get_screenshot_as_file('/Screenshots/foo.png')
        z.pngz^name used for saved screenshot does not match file type. It should end with a `.png` extensionr   
stacklevelwbNFT)
rT   lowerendswithwarningswarnUserWarningget_screenshot_as_pngopenwriteOSError)r   filenamepngfs       r2   get_screenshot_as_filez WebDriver.get_screenshot_as_file  s     8}""$--f5MMp
 ((*	h% 
   		 s<   B
 "A>4B
 >BB
 
	BB BB Bc                 $    | j                  |      S )a  Saves a screenshot of the current window to a PNG image file.
        Returns False if there is any IOError, else returns True. Use full
        paths in your filename.

        :Args:
         - filename: The full path you wish to save your screenshot to. This
           should end with a `.png` extension.

        :Usage:
            ::

                driver.save_screenshot('/Screenshots/foo.png')
        )ri  )r   rf  s     r2   save_screenshotzWebDriver.save_screenshot=  s     **844r1   c                 R    t        | j                         j                  d            S )zGets the screenshot of the current window as a binary data.

        :Usage:
            ::

                driver.get_screenshot_as_png()
        ascii)r   get_screenshot_as_base64encoder   s    r2   rb  zWebDriver.get_screenshot_as_pngM  s#     668??HIIr1   c                 F    | j                  t        j                        d   S )zGets the screenshot of the current window as a base64 encoded string
        which is useful in embedded images in HTML.

        :Usage:
            ::

                driver.get_screenshot_as_base64()
        r   )r   r!   
SCREENSHOTr   s    r2   rn  z"WebDriver.get_screenshot_as_base64W  s     ||G../88r1   windowHandlec                 p    | j                  |       | j                  t        |      t        |             y)a$  Sets the width and height of the current window. (window.resizeTo)

        :Args:
         - width: the width in pixels to set the window to
         - height: the height in pixels to set the window to

        :Usage:
            ::

                driver.set_window_size(800,600)
        widthheightN"_check_if_window_handle_is_currentset_window_rectr0  )r   ru  rv  rr  s       r2   set_window_sizezWebDriver.set_window_sizeb  s-     	//=3u:c&kBr1   c                     | j                  |       | j                         }|j                  dd      r|d   }dD ci c]  }|||   
 c}S c c}w )zGets the width and height of the current window.

        :Usage:
            ::

                driver.get_window_size()
        r   Nrt  )rx  get_window_rectrN   )r   rr  sizer=   s       r2   get_window_sizezWebDriver.get_window_sizeq  sS     	//=##%88GT"=D$78q47
888s   Axyc                 n    | j                  |       | j                  t        |      t        |            S )a.  Sets the x,y position of the current window. (window.moveTo)

        :Args:
         - x: the x-coordinate in pixels to set the window position
         - y: the y-coordinate in pixels to set the window position

        :Usage:
            ::

                driver.set_window_position(0,0)
        r  r  rw  )r   r  r  rr  s       r2   set_window_positionzWebDriver.set_window_position  s0     	//=##c!fA#77r1   c                 v    | j                  |       | j                         }dD ci c]  }|||   
 c}S c c}w )zGets the x,y position of the current window.

        :Usage:
            ::

                driver.get_window_position()
        r  )rx  r|  )r   rr  positionr=   s       r2   get_window_positionzWebDriver.get_window_position  s<     	//='')(2318A;333s   6c                 >    |dk7  rt        j                  dd       yy)z5Warns if the window handle is not equal to `current`.currentz?Only 'current' window is supported for W3C compatible browsers.r   rZ  N)r_  r`  )r   rr  s     r2   rx  z,WebDriver._check_if_window_handle_is_current  s    9$MM[hij %r1   c                 F    | j                  t        j                        d   S )zGets the x, y coordinates of the window as well as height and width
        of the current window.

        :Usage:
            ::

                driver.get_window_rect()
        r   )r   r!   GET_WINDOW_RECTr   s    r2   r|  zWebDriver.get_window_rect  r   r1   c                 x    |||s|st        d      | j                  t        j                  ||||d      d   S )a  Sets the x, y coordinates of the window as well as height and width
        of the current window. This method is only supported for W3C compatible
        browsers; other browsers should use `set_window_position` and
        `set_window_size`.

        :Usage:
            ::

                driver.set_window_rect(x=10, y=10)
                driver.set_window_rect(width=100, height=200)
                driver.set_window_rect(x=10, y=10, width=100, height=200)
        z'x and y or height and width need values)r  r  ru  rv  r   )r   r   r!   SET_WINDOW_RECT)r   r  r  ru  rv  s        r2   ry  zWebDriver.set_window_rect  sD     I!)fU*+TUU||G3311u`f5ghipqqr1   c                     | j                   S r   )_file_detectorr   s    r2   rx   zWebDriver.file_detector  s    """r1   c                 b    |st        d      t        |t              st        d      || _        y)a0  Set the file detector to be used when sending keyboard input. By
        default, this is set to a file detector that does nothing.

        see FileDetector
        see LocalFileDetector
        see UselessFileDetector

        :Args:
         - detector: The detector to use. Must not be None.
        z,You may not set a file detector that is nullz+Detector has to be instance of FileDetectorN)r   rS   r$   r  )r   detectors     r2   rx   zWebDriver.file_detector  s1     $%STT(L1$%RSS&r1   c                 F    | j                  t        j                        d   S )zGets the current orientation of the device.

        :Usage:
            ::

                orientation = driver.orientation
        r   )r   r!   GET_SCREEN_ORIENTATIONr   s    r2   orientationzWebDriver.orientation  r   r1   c                     ddg}|j                         |v r#| j                  t        j                  d|i       yt	        d      )zSets the current orientation of the device.

        :Args:
         - value: orientation to set it to.

        :Usage:
            ::

                driver.orientation = 'landscape'
        	LANDSCAPEPORTRAITr  z>You can only set the orientation to 'LANDSCAPE' and 'PORTRAIT'N)upperr   r!   SET_SCREEN_ORIENTATIONr   )r   r   allowed_valuess      r2   r  zWebDriver.orientation  sA     &z2;;=N*LL77-9OP$%effr1   c                 F    | j                  t        j                        d   S )zGets a list of the available log types. This only works with w3c
        compliant browsers.

        :Usage:
            ::

                driver.log_types
        r   )r   r!   GET_AVAILABLE_LOG_TYPESr   s    r2   	log_typeszWebDriver.log_types  s     ||G;;<WEEr1   c                 L    | j                  t        j                  d|i      d   S )a>  Gets the log for a given log type.

        :Args:
         - log_type: type of log that which will be returned

        :Usage:
            ::

                driver.get_log('browser')
                driver.get_log('driver')
                driver.get_log('client')
                driver.get_log('server')
        r   r   )r   r!   GET_LOG)r   log_types     r2   get_logzWebDriver.get_log  s#     ||GOOfh-?@IIr1   c                 l   | j                   rt        | j                   fS t                t        s| j                  j	                  d      rI| j                  j	                  d      }| j                  j	                  d      j                  d      d   }n| j                         \  }}|st        d      t        j                  |      a| j                  d   j                         dk(  rt        j                  dt        d	
       t              | _         | j                   j                  t        j                   j#                               }|d   j$                  }| j                   j                  t        j                   j'                  |d            }|| j                   _        t        | j                   fS )Nse:cdpse:cdpVersionr   r   2Unable to find url to connect to from capabilitiesrL   firefoxznCDP support for Firefox is deprecated and will be removed in future versions. Please switch to WebDriver BiDi.r   rZ  T)r   devtoolsr3   r;   rN   rP  _get_cdp_detailsr   r/   import_devtoolsr]  r_  r`  DeprecationWarningr-   r   targetget_targets	target_idattach_to_targetr   )r   ws_urlversiontargetsr  sessions         r2   start_devtoolszWebDriver.start_devtools  sV   %%T7777 L99==*!YY]]84F"iimmO<BB3GJG&*&;&;&=OGV,-abb..w799]+113y@MM I*#$
 *=V)DD&00889T9T9VWG
,,I00889Y9YZcei9jkG4;D&&1T7777r1   c                  K   t                | j                  j                  d      rI| j                  j                  d      }| j                  j                  d      j                  d      d   }n| j	                         \  }}|st        d      t        j                  |      }t        j                  |      4 d {   }|j                  |j                  j                                d {   }|d   j                  }|j                  |      4 d {   }t        |t        |       d d d       d {    d d d       d {    y 7 7 d7 =7 # 1 d {  7  sw Y   +xY w7 "# 1 d {  7  sw Y   y xY ww)Nr  r  r   r   r  )r3   r;   rN   rP  r  r   r/   r  open_cdpr   r  r  r  open_sessionr   )r   r  r  r  connr  r  r  s           r2   bidi_connectionzWebDriver.bidi_connection1  s?     	99=="YY]]8,FiimmO4::3?BG"335OGV$%YZZ&&w/<<' 	= 	=4 LL)D)D)FGGG
,,I((3 = =w$Wc8<<= =	= 	= 	=G= = = = =	= 	= 	= 	=s   B=F?E F-E20E1(E2EE2E2E2=E>E2FE0FE2E2E2E-	!E$"E-	)E20F2F8E;9F Fc                     | j                   s| j                          | j                  st        | j                         | _        | j                  S r   )r   _start_bidir   r   r   s    r2   r   zWebDriver.scriptE  s:    ))||!$"<"<=DL||r1   c                     | j                   j                  d      r| j                   j                  d      }nt        d      t        |      | _        y )NwebSocketUrlr  )r;   rN   r   r-   r   )r   r  s     r2   r  zWebDriver._start_bidiO  s=    99==(YY]]>2F$%YZZ%8%@"r1   c                    dd l }dd l}|j                         }d}| j                  j	                  d      dk(  r+| j                  j	                  d      j	                  d      }nf| j                  j	                  d      dk(  r+| j                  j	                  d      j	                  d      }nd	}| j                  j	                  d
      }|j                  dd| d      }|j                  |j                        }|j	                  d      }|j	                  d      }	dd l}
|rd}||	fS |
j                  d|      j                  d      }||	fS )Nr   FrL   chromezgoog:chromeOptionsdebuggerAddressMicrosoftEdgezms:edgeOptionsTzmoz:debuggerAddressr   zhttp://z/json/versionBrowserwebSocketDebuggerUrlU   z
.*/(\d+)\.r   )jsonurllib3PoolManagerr;   rN   requestloadsdataresearchgroup)r   r  r  http_firefoxdebugger_addressresr  browser_versionwebsocket_urlr  r  s               r2   r  zWebDriver._get_cdp_detailsW  s*   ""$99=='83#yy}}-ABFFGXYYY]]=)_<#yy}}-=>BBCTUH#yy}}-BCll5G,<+=]"KLzz#((#((9-!78 G %% ii?EEaHG%%r1   c                 p    | j                  t        j                  |j                               d   | _        y)z4Adds a virtual authenticator with the given options.r   N)r   r!   ADD_VIRTUAL_AUTHENTICATORr  r   )r   r]   s     r2   add_virtual_authenticatorz#WebDriver.add_virtual_authenticatorw  s+    !%g.O.OQXQ`Q`Qb!cdk!lr1   c                     | j                   S )z,Returns the id of the virtual authenticator.)r   r   s    r2   virtual_authenticator_idz"WebDriver.virtual_authenticator_id{  s     %%%r1   c                 j    | j                  t        j                  d| j                  i       d| _        y)zRemoves a previously added virtual authenticator.

        The authenticator is no longer valid after removal, so no
        methods may be called.
        authenticatorIdN)r   r!   REMOVE_VIRTUAL_AUTHENTICATORr   r   s    r2   remove_virtual_authenticatorz&WebDriver.remove_virtual_authenticator  s,     	W99<MtOeOe;fg!%r1   
credentialc                     | j                  t        j                  i |j                         d| j                  i       y)z,Injects a credential into the authenticator.r  N)r   r!   ADD_CREDENTIALr  r   )r   r  s     r2   add_credentialzWebDriver.add_credential  s6     	W++-p
0B0B0D-pFWY]YoYo-pqr1   c                     | j                  t        j                  d| j                  i      }|d   D cg c]  }t	        j
                  |       c}S c c}w )z;Returns the list of credentials owned by the authenticator.r  r   )r   r!   GET_CREDENTIALSr   r   	from_dict)r   credential_datar  s      r2   get_credentialszWebDriver.get_credentials  sL     ,,w'>'>ARTXTjTj@klCRSZC[\Z
$$Z0\\\s   Acredential_idc                     t        |t              rt        |      j                         }| j	                  t
        j                  || j                  d       y)z,Removes a credential from the authenticator.)credentialIdr  N)rS   	bytearrayr   rS  r   r!   REMOVE_CREDENTIALr   )r   r  s     r2   remove_credentialzWebDriver.remove_credential  sD     mY/-m<CCEM%%Z^ZpZp'q	
r1   c                 \    | j                  t        j                  d| j                  i       y)z/Removes all credentials from the authenticator.r  N)r   r!   REMOVE_ALL_CREDENTIALSr   r   s    r2   remove_all_credentialsz WebDriver.remove_all_credentials  s$     	W336GI_I_5`ar1   verifiedc                 ^    | j                  t        j                  | j                  |d       y)zSets whether the authenticator will simulate success or fail on user
        verification.

        verified: True if the authenticator will pass user verification, False otherwise.
        )r  isUserVerifiedN)r   r!   SET_USER_VERIFIEDr   )r   r  s     r2   set_user_verifiedzWebDriver.set_user_verified  s$     	W..DDZDZnv0wxr1   c                 ~    d| j                   vrt        d      | j                  t        j                        d   d   S )z]Retrieves the downloadable files as a map of file names and their
        corresponding URLs.se:downloadsEnabledCYou must enable downloads in order to work with downloadable files.r   names)r5   r   r   r!   GET_DOWNLOADABLE_FILESr   s    r2   get_downloadable_filesz WebDriver.get_downloadable_files  s=     !(9(99$%jkk||G::;GDWMMr1   	file_nametarget_directoryc                    d| j                   vrt        d      t        j                  j	                  |      st        j
                  |       | j                  t        j                  d|i      d   d   }t        j                         5 }t        j                  j                  ||dz         }t        |d      5 }|j                  t        j                  |             ddd       t!        j"                  |d	      5 }|j%                  |       ddd       ddd       y# 1 sw Y   BxY w# 1 sw Y   xY w# 1 sw Y   yxY w)
zDownloads a file with the specified file name to the target
        directory.

        file_name: The name of the file to download.
        target_directory: The path to the directory to save the downloaded file.
        r  r  r   r   contentsz.zipr\  Nr)r5   r   ospathexistsmakedirsr   r!   DOWNLOAD_FILEtempfileTemporaryDirectoryrO  rc  rd  base64r   zipfileZipFile
extractall)r   r  r  r  tmp_dirzip_filefilezip_refs           r2   download_filezWebDriver.download_file  s    !(9(99$%jkkww~~./KK()<< 5 5	7JKGTU_`((* 	5gww||GY-?@Hh% 7

6++H567 3/ 57""#345	5 	57 75 5	5 	5s<   
0D8:%D D8=D,D8 D)	%D8,D5	1D88Ec                 t    d| j                   vrt        d      | j                  t        j                         y)zDeletes all downloadable files.r  r  N)r5   r   r   r!   DELETE_DOWNLOADABLE_FILESr   s    r2   delete_downloadable_filesz#WebDriver.delete_downloadable_files  s.     (9(99$%jkkW667r1   c                     | j                   S )aw  
        :Returns:
            - FedCM: an object providing access to all Federated Credential Management (FedCM) dialog commands.

        :Usage:
            ::

                title = driver.fedcm.title
                subtitle = driver.fedcm.subtitle
                dialog_type = driver.fedcm.dialog_type
                accounts = driver.fedcm.account_list
                driver.fedcm.select_account(0)
                driver.fedcm.accept()
                driver.fedcm.dismiss()
                driver.fedcm.enable_delay()
                driver.fedcm.disable_delay()
                driver.fedcm.reset_cooldown()
        )r   r   s    r2   fedcmzWebDriver.fedcm  s    ( {{r1   c                 V    | j                   j                  t        j                  d      S )z8Returns whether the browser supports FedCM capabilities.F)r5   rN   r   FEDCM_CAPABILITYr   s    r2   supports_fedcmzWebDriver.supports_fedcm  s#       $$Z%@%@%HHr1   c                 2    | j                   st        d      y)z.Raises an exception if FedCM is not supported.znThis browser does not support Federated Credential Management. Please ensure you're using a supported browser.N)r  r   r   s    r2   _require_fedcm_supportz WebDriver._require_fedcm_support  s#    ""$B  #r1   c                 8    | j                          t        |       S )z0Returns the FedCM dialog object for interaction.)r  r   r   s    r2   dialogzWebDriver.dialog  s     	##%d|r1   c                      ddl m ddlm}  j	                          |f} fd | |||      }|j                  fd      S )a  Waits for and returns the FedCM dialog.

        Args:
            timeout: How long to wait for the dialog
            poll_frequency: How frequently to poll
            ignored_exceptions: Exceptions to ignore while waiting

        Returns:
            The FedCM dialog object if found

        Raises:
            TimeoutException if dialog doesn't appear
            WebDriverException if FedCM not supported
        r   )NoAlertPresentException)WebDriverWaitc                  R    	 t              } | j                  r| S d S # $ r Y y w xY wr   )r   r   )r  r  r   s    r2   _check_fedcmz,WebDriver.fedcm_dialog.<locals>._check_fedcm  s4    !'v6$6* s     &&)poll_frequencyignored_exceptionsc                             S r   r0   )rA  r  s    r2   <lambda>z(WebDriver.fedcm_dialog.<locals>.<lambda>  s	    LN r1   )selenium.common.exceptionsr  selenium.webdriver.support.waitr  r  until)r   timeoutr  r  r  waitr  r  s   `     @@r2   fedcm_dialogzWebDriver.fedcm_dialog  sO     	GA##%%"9!;	 T7>^pqzz233r1   )zhttp://127.0.0.1:4444TNNNNNr   )rD   N)r  )NNNN)   g      ?N)rq   rr   rs   rt   r,   r   r*   r   r   rT   r(   boolr   r$   r   r
   r&   r   r    r   r   r   typingTypeBaseExceptiontypesTracebackTyper   r   r   propertyr'   r   r   r   r   r   r   r   r   r   r   rN   r   r)   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r+   r  r
  r  r  r  r	   r  r  r   r)  r1  r3  r5  r9  r   r>  setterr   IDrK  rG  r5   ri  rk  r~   rb  rn  rz  r~  r  r  rx  r|  ry  rx   r  r  r  r  r   r  r   r  r  r   r  r  r   r  r   r  r  r  r  r  r  r  r  r  r#   r  r  r  r  r'  r0   r1   r2   rw   rw      s   
 " O :Q04CG8<*.049%5 569 9  -	9
 %T+-> >?@9 $$459 "$9  -9 
9v`//&++m"<= __]+ ??5#6#67	 3 36    
Lc 
L 
L
1$ 
14 
17S 7Z 7Kc K4 K4 K60s 0t 0 @s @ @# #) #k	 kd k)DI )Z.Z3 Z& >S > > >S > >$* Ls L L ES	 E E$
0.
B(> 
B# 
B 8  (&)&	>T$Z 	>&//&++"> <1F,ZE Zd Z Xu X Xh% hD h" $( $ $ __
M 
M !eeD ZHSM ZZ Z(  "uuT aXc] ad:FV a, d  $ <54 5 Ju J	9# 	9C3 Ct C9C 9 9"8U 8u 8C 8X\ 84T 4ks kt k
	> 	>r$ r& #| # # ' '" E E g g" 	F 	FJ 8@ = =&  A&@m1L mQU m &# & & $& $& $r r r $r $]j!1 ] $]
 $
uS)^/D 
 
 $
 $b $b $y$ y4 y $yN N5s 5c 5d 5.8 u  * I I I  
4r1   rw   r   )Xrt   r  r  r8   r  rQ  r  r-  r*  r_  r  abcr   r   r   r   r   	importlibr   r	   r
   r   r   r"  r   r   r   r   r   %selenium.webdriver.common.bidi.scriptr   selenium.webdriver.common.byr   !selenium.webdriver.common.optionsr   r   ,selenium.webdriver.common.print_page_optionsr   "selenium.webdriver.common.timeoutsr   /selenium.webdriver.common.virtual_authenticatorr   r   r   +selenium.webdriver.support.relative_locatorr   common.fedcm.dialogr   r  r   rC   r    r   r!   errorhandlerr"   r  r#   rx   r$   r%   ry   r&   r   r'   remote_connectionr(   r   r)   
shadowrootr*   r  r+   
webelementr,   websocket_connectionr-   r/   r  r3   r?   r   rT   r)  r\   rn   rp   rw   r0   r1   r2   <module>rA     sC  " $    	         $ * % #     ? : < = 9 8 + 8 9 E 7 F W C ( + '  &  ' , /  / ! "  " 5
BO0 -1C!112  	
 L) 6D- $ Dg p4 p4r1   