
    vKg~                        S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJ r   SSK!J"r"  SSK!J#r#  SSK$J%r%  SSK&J'r'  SSK(J)r)  SSK(J*r*  SSK(J+r+  SSK,J-r-  SSK.J/r/  SSK0J1r1  SS K2J3r3  SS!K4J5r5  SS"K6J7r7  SS#K8J9r9  SS$K:J;r;  SS%K:J<r<  SS&K=J>r>  SS'K?J@r@  SS(KAJBrB  SS)KCJDrD  SS*KEJFrF  SS+KGJHrH  SS,KIJJrJ  SS-KKJLrL  SqMSqNS. rOS/ rP S>S0\QS1\\R\B4   S2\SS3\SS4\\3   S5\B4S6 jjrTS7\\#   S5\4S8 jrU " S9 S:\S;9rV " S< S=\V5      rWg)?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                  2    [         (       d  [        S5      q g g )Nz"selenium.webdriver.common.bidi.cdp)cdpr        c/var/www/highfloat_scraper/venv/lib/python3.13/site-packages/selenium/webdriver/remote/webdriver.py
import_cdpr3   N   s    3@A r1   c                 |    [         R                  " U 5      n 0 nU R                  5        H	  u  p#X1U'   M     S0 /US.0$ )ac  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   sB     ==DL

Q B4MNNr1   r5   command_executor
keep_aliveignore_local_proxyclient_configreturnc                    ^  [        U[        5      (       a!  U=(       d	    [        US9nXl        [	        US9nSSKJn  SSKJn  SSK	J
n  SSKJn  XVX/n	[        U 4S jU	 5       [        5      n
U
" UUUUS	9$ )
N)remote_server_addr)rC   r   )ChromeRemoteConnection)EdgeRemoteConnection)FirefoxRemoteConnection)SafariRemoteConnectionc              3   f   >#    U H'  oR                   TR                  S 5      :X  d  M#  Uv   M)     g7f)browserNameN)browser_nameget).0cr5   s     r2   	<genexpr>(get_remote_connection.<locals>.<genexpr>x   s(     _z!^^|?O?OP]?^-^AAzs   !1	1)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   sw     "C((%ZIY)Z+;(+-HRNTR(@VpJ_z_aqrG+'#	 r1   optionsc                    S0 0n/ nU  H"  nUR                  UR                  5       5        M$     [        U5      n0 n[        U5       Hs  nUnUS-   U:  d  M  X'   R	                  5       nU HK  n	XUS-      R	                  5       ;   d  M  X'   U	   X&S-      U	   :X  d  M3  UR                  XU   U	   05        MM     Mu     0 n
UR                  5        H	  u  pXU'   M     U H  nU
 H  nXk	 M     M     XS   S'   X!S   S'   U$ )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_matchesro      s!   "B'LDC'')* D	IH 9	q59--/J!q1u+**,,s+tE{3/?? 9oc.B(CD "  F q	 ! A   39 /15 .r1   c                       \ rS rSrSrSrg)BaseWebDriver   zAbstract Base Class for all Webdriver subtypes.

ABC's allow custom implementations of Webdriver to be registered so
that isinstance type checks will succeed.
r0   N)__name__
__module____qualname____firstlineno____doc____static_attributes__r0   r1   r2   rq   rq      s    r1   rq   )	metaclassc                   h   \ rS rSrSr\r\r       SxS\	\
\4   S\S\\   S\\	\\\   4      S\\   S	\\   S
\\   SS4S jjrS rS rS\R                  \R0                  \      S\R                  \   S\R                  \R6                     4S jr\S 5       r\S\ 4S j5       r!\S\
4S j5       r"S r#S r$S\%SS4S jr&S r'S\
S\4S jr(S r)SyS\
S\%S\%4S  jjr*S!\
SS4S" jr+\S\
4S# j5       r,SyS$\
S\-4S% jjr.S&\-SS4S' jr/S\\
   4S( jr0S) r1S$\
4S* jr2\S\
4S+ j5       r3\S\
4S, j5       r4SzS- jr5SzS. jr6\S\
4S/ j5       r7\S\\
   4S0 j5       r8SzS1 jr9SzS2 jr:SzS3 jr;SyS4\\<   S\
4S5 jjr=\S\>4S6 j5       r?SzS7 jr@SzS8 jrASzS9 jrBS\\%   4S: jrCS\R                  \R                     4S; jrESzS< jrFSzS= jrGSzS> jrHS?\ISS4S@ jrJS?\ISS4SA jrKS?\ISS4SB jrL\S\M4SC j5       rN\NR                  SzSD j5       rN\PR                  S4SE\\
   S\4SF jjrR\PR                  S4SE\\
   S\\   4SG jjrS\S\%4SH j5       rTS\4SI jrUS\4SJ jrVS\W4SK jrXS\
4SL jrYS{SM\
SS4SN jjrZS{SM\
S\%4SO jjr[S{SP\ISQ\ISM\
S\%4SR jjr\S{S\%4SS jjr]SM\
SS4ST jr^S\%4SU jr_S|S\%4SV jjr`\S\4SW j5       ra\aR                  SzSX j5       ra\SY 5       rb\bR                  SzSZ j5       rb\S[ 5       rcS\ rdS] re\fS^ 5       rg\S_ 5       rhS` riSa rjS\kSS4Sb jrl\S\
4Sc j5       rm\nSzSd j5       ro\nSe\pSS4Sf j5       rq\nS\\p   4Sg j5       rr\nSh\	\
\s4   SS4Si j5       rt\nSzSj j5       ru\nSk\SS4Sl j5       rvS\%4Sm jrwSn\
So\
SS4Sp jrxSzSq jry\S\z4Sr j5       r{\S\4Ss j5       r|St r}\Su 5       r~S}Sv jrSwrg)~	WebDriver   a  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                    [        U[        5      (       a  [        U5      nSn	OUR                  5       nUR                  n	Xl        [        U R
                  [        [        45      (       a  [        UUUU	US9U l        SU l	        SU l
        0 U l        0 U l        [        5       U l        [        U 5      U l        [#        U 5      U l        U=(       d
    ['        5       U l        U=(       d
    [+        5       U l        U=(       d    U R.                  U l        SU l        U R3                  5         U R5                  U5        [7        U 5      U l        SU l        SU l        g)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)rT   listro   ra   _ignore_local_proxyr@   rU   bytesr]   
_is_remote
session_idr;   pinned_scriptsr"   error_handlerr+   
_switch_tor'   _mobiler%   r}   r&   r~   _web_element_cls_authenticator_idstart_clientstart_sessionr#   _fedcm_websocket_connection_script)
selfr@   rA   r}   r^   r~   r   rC   r5   r   s
             r2   __init__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    S[        U 5      R                   S[        U 5      R                   SU R                   S3$ )N<.z (session="z")>)typert   rs   r   r   s    r2   __repr__WebDriver.__repr__   s9    4:(()4:+>+>*?{4??J[[^__r1   c                     U $ Nr0   r   s    r2   	__enter__WebDriver.__enter__   s    r1   exc_typeexc	tracebackc                 $    U R                  5         g r   )quit)r   r   r   r   s       r2   __exit__WebDriver.__exit__   s     			r1   c              /      #    Sn[        U R                  U5      (       d  U R                  nU" U0 UD6U l         Sv   U(       a  X@l        gg! U(       a  X@l        f f = f7f)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)rT   r}   )r   file_detector_classargskwargslast_detectors        r2   file_detector_contextWebDriver.file_detector_context  sa     $ $,,.ABB ..M!4d!Ef!ED	3%2" }%2" s   7A A A AA c                     U R                   $ r   )r   r   s    r2   mobileWebDriver.mobile!  s    ||r1   c                 V    SU R                   ;   a  U R                   S   $ [        S5      e)zjReturns the name of the underlying browser for this instance.

:Usage:
    ::

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

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

This method may be overridden to define custom shutdown
behavior.
Nr0   r   s    r2   stop_clientWebDriver.stop_client9  s     	r1   r5   c                     [        U5      nU R                  [        R                  U5      S   nUR	                  S5      U l        UR	                  S5      U l        g)z~Creates 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   WebDriver.start_sessionA  sI     L)<< 3 3T:7C",,{3LL0	r1   c                   ^  [        U[        5      (       a0  0 nUR                  5        H  u  p4T R                  U5      X#'   M     U$ [        UT R                  5      (       a  SUR
                  0$ [        UT R                  5      (       a  SUR
                  0$ [        U[        5      (       a  [        U 4S jU 5       5      $ U$ )N#element-6066-11e4-a52e-4f735466cecf"shadow-6066-11e4-a52e-4f735466cecfc              3   D   >#    U H  nTR                  U5      v   M     g 7fr   )_wrap_valuerO   itemr   s     r2   rQ   (WebDriver._wrap_value.<locals>.<genexpr>X  s     A54((..5    )rT   dictr:   r   r   id_shadowroot_clsr   )r   r   	convertedkeyvals   `    r2   r   WebDriver._wrap_valueM  s    eT""I!KKM!%!1!1#!6	 *eT22339588DDeT11228%((CCeT""A5AAAr1   
element_idc                 $    U R                  X5      $ )z6Creates a web element with the specified `element_id`.)r   )r   r   s     r2   create_web_elementWebDriver.create_web_element[  s    $$T66r1   c                 L  ^  [        U[        5      (       ac  SU;   a  T R                  US   5      $ SU;   a  T R                  T US   5      $ UR	                  5        H  u  p#T R                  U5      X'   M     U$ [        U[        5      (       a  [        U 4S jU 5       5      $ U$ )Nr   r   c              3   D   >#    U H  nTR                  U5      v   M     g 7fr   )_unwrap_valuer   s     r2   rQ   *WebDriver._unwrap_value.<locals>.<genexpr>i  s     CUT**400Ur   )rT   r   r   r   r:   r   r   )r   r   r   r   s   `   r2   r   WebDriver._unwrap_value_  s    eT""4=..u5Z/[\\3u<++D%8\2]^^!KKM!//4
 *LeT""CUCCCr1   driver_commandparamsc                    U R                  U5      nU R                  (       a+  U(       d  SU R                  0nOSU;  a  U R                  US'   U R                  R                  X5      nU(       aA  U R                  R                  U5        U R                  UR                  SS5      5      US'   U$ SSU R                  S.$ )a  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   WebDriver.executel  s     !!&)??%t7F*&*oo{#((00H--h7 $ 2 28<<3N OHWO t$//JJr1   urlc                 H    U R                  [        R                  SU05        g)z0Loads a web page in the current browser session.r   N)r   r!   GET)r   r   s     r2   rN   WebDriver.get  s    W[[5#,/r1   c                 `    U R                  [        R                  5      R                  SS5      $ )zUReturns the title of the current page.

:Usage:
    ::

        title = driver.title
r    )r   r!   	GET_TITLErN   r   s    r2   titleWebDriver.title  s&     ||G--.227B??r1   scriptc                 L    [        U5      nXR                  UR                  '   U$ )zMStore common javascript scripts to be executed later by a unique
hashable ID.)r)   r   r   )r   r   
script_keyscript_key_instances       r2   
pin_scriptWebDriver.pin_script  s*     (
36</223""r1   r   c                      U R                   R                  UR                  5        g! [         a    [        SU SU R                    35      Sef = f)z$Remove a pinned script from storage.zNo script with key: z existed in N)r   popr   r   )r   r   s     r2   unpinWebDriver.unpin  sT    	k##JMM2 	k1*\$J]J]I^_`fjj	ks	   %( 'Ac                 ,    [        U R                  5      $ r   )r   r   r   s    r2   get_pinned_scriptsWebDriver.get_pinned_scripts  s    D''((r1   c                     [        U[        5      (       a   U R                  UR                     n[        U5      n[        R                  nU R                  XAUS.5      S   $ ! [         a    [        S5      ef = f)zSynchronously 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   )
rT   r)   r   r   r   r   r   r!   W3C_EXECUTE_SCRIPTr   r   r   r   converted_argscommands        r2   execute_scriptWebDriver.execute_script  sz     fi((N,,VYY7 d,,||G%OPQXYY  N)*LMMNs   A" "A8c                 f    [        U5      n[        R                  nU R                  XAUS.5      S   $ )ay  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_scriptWebDriver.execute_async_script  s2     d22||G%OPQXYYr1   c                 F    U R                  [        R                  5      S   $ )zNGets the URL of the current page.

:Usage:
    ::

        driver.current_url
r   )r   r!   GET_CURRENT_URLr   s    r2   current_urlWebDriver.current_url       ||G334W==r1   c                 F    U R                  [        R                  5      S   $ )zQGets the source of the current page.

:Usage:
    ::

        driver.page_source
r   )r   r!   GET_PAGE_SOURCEr   s    r2   page_sourceWebDriver.page_source  r  r1   c                 B    U R                  [        R                  5        g)zCCloses the current window.

:Usage:
    ::

        driver.close()
N)r   r!   CLOSEr   s    r2   closeWebDriver.close  s     	W]]#r1   c                      U R                  [        R                  5        U R                  5         U R                  R                  5         g! U R                  5         U R                  R                  5         f = f)z\Quits the driver and closes every associated window.

:Usage:
    ::

        driver.quit()
N)r   r!   QUITr   r@   r  r   s    r2   r   WebDriver.quit  sW    	*LL&!!'') !!'')s   A ,A8c                 F    U R                  [        R                  5      S   $ )z`Returns the handle of the current window.

:Usage:
    ::

        driver.current_window_handle
r   )r   r!   W3C_GET_CURRENT_WINDOW_HANDLEr   s    r2   current_window_handleWebDriver.current_window_handle  s     ||GAAB7KKr1   c                 F    U R                  [        R                  5      S   $ )znReturns the handles of all windows within the current session.

:Usage:
    ::

        driver.window_handles
r   )r   r!   W3C_GET_WINDOW_HANDLESr   s    r2   window_handlesWebDriver.window_handles
       ||G::;GDDr1   c                 H    [         R                  nU R                  US5        g)z5Maximizes the current window that webdriver is using.N)r!   W3C_MAXIMIZE_WINDOWr   )r   r   s     r2   maximize_windowWebDriver.maximize_window  s    --Wd#r1   c                 B    U R                  [        R                  5        g)z<Invokes the window manager-specific 'full screen' operation.N)r   r!   FULLSCREEN_WINDOWr   s    r2   fullscreen_windowWebDriver.fullscreen_window  s    W../r1   c                 B    U R                  [        R                  5        g)z9Invokes the window manager-specific 'minimize' operation.N)r   r!   MINIMIZE_WINDOWr   s    r2   minimize_windowWebDriver.minimize_window  s    W,,-r1   print_optionsc                 z    0 nU(       a  UR                  5       nU R                  [        R                  U5      S   $ )zqTakes 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_pageWebDriver.print_page"  s6     #++-G||G..8AAr1   c                     U R                   $ )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_toWebDriver.switch_to.  s    $ r1   c                 B    U R                  [        R                  5        g)zVGoes one step backward in the browser history.

:Usage:
    ::

        driver.back()
N)r   r!   GO_BACKr   s    r2   backWebDriver.backC       	W__%r1   c                 B    U R                  [        R                  5        g)zXGoes one step forward in the browser history.

:Usage:
    ::

        driver.forward()
N)r   r!   
GO_FORWARDr   s    r2   forwardWebDriver.forwardM  s     	W''(r1   c                 B    U R                  [        R                  5        g)zFRefreshes the current page.

:Usage:
    ::

        driver.refresh()
N)r   r!   REFRESHr   s    r2   refreshWebDriver.refreshW  r3  r1   c                 F    U R                  [        R                  5      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_cookiesWebDriver.get_cookiesb  r  r1   c                     [         R                  " [        5         U R                  [        R
                  SU05      S   sSSS5        $ ! , (       d  f       g= f)zGet 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_cookieWebDriver.get_cookiem  s?       !67<< 2 2VTNCGL 877s   %A


Ac                 H    U R                  [        R                  SU05        g)zhDeletes a single cookie with the given name.

:Usage:
    ::

        driver.delete_cookie('my_cookie')
r   N)r   r!   DELETE_COOKIErD  s     r2   delete_cookieWebDriver.delete_cookiez  s     	W**VTN;r1   c                 B    U R                  [        R                  5        g)zeDelete all cookies in the scope of the session.

:Usage:
    ::

        driver.delete_all_cookies()
N)r   r!   DELETE_ALL_COOKIESr   s    r2   delete_all_cookiesWebDriver.delete_all_cookies  s     	W//0r1   c                     SU;   a.  US   S;   d   eU R                  [        R                  SU05        gU R                  [        R                  SU05        g)a  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_cookieWebDriver.add_cookie  sR     $z*.GGGGLL++h-DELL++h-DEr1   time_to_waitc           	      r    U R                  [        R                  S[        [	        U5      S-  5      05        g)aX  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   rY  s     r2   implicitly_waitWebDriver.implicitly_wait  s-     	W))JE,<ORV<V8W+XYr1   c           	      r    U R                  [        R                  S[        [	        U5      S-  5      05        g)zSet 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]  ra  s     r2   set_script_timeoutWebDriver.set_script_timeout  s-     	W))Hc%:MPT:T6U+VWr1   c           	           U R                  [        R                  S[        [	        U5      S-  5      05        g! [
         a2    U R                  [        R                  [	        U5      S-  SS.5         gf = f)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^  r_  r`  r   ra  s     r2   set_page_load_timeoutWebDriver.set_page_load_timeout  sf    	hLL--
Cl@SVZ@Z<[/\]! 	hLL--eL6ID6PZe/fg	hs   7: 9A65A6c                     U R                  [        R                  5      S   nUR                  S5      S-  US'   UR                  S5      S-  US'   UR                  S5      S-  US'   [	        S0 UD6$ )	zyGet all the timeouts that have been set on the current session.

:Usage:
    ::

        driver.timeouts
:rtype: Timeout
r   r[  r\  implicit_waitrh  	page_loadr   r0   )r   r!   GET_TIMEOUTSr   r   )r   timeoutss     r2   rp  WebDriver.timeouts  ss     << 4 45g>$,LL$<t$C! (Z 84 ?%\\(3d:#(##r1   c                 f    U R                  [        R                  UR                  5       5      S   ng)zSet 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   rp  _s      r2   rp  rq    s(     LL--x/@/@/BCGLr1   r   c                    U R                   R                  X5      u  p[        U[        5      (       a3  U R	                  XS9nU(       d  [        SUR                   35      eUS   $ U R                  [        R                  XS.5      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   )
r~   convertrT   r   find_elementsr   rootr   r!   FIND_ELEMENT)r   rv  r   elementss       r2   find_elementWebDriver.find_element  s     **222=	b*%%))R)=H,/TUWU\U\T]-^__A;||G00B2OPQXYYr1   c                    U R                   R                  X5      u  p[        U[        5      (       ar  SR	                  [
        R                  S5      SS 5      n[        R                  " US5      R                  S5      nSU S3nU R                  XQR                  5       5      $ U R                  [        R                  XS.5      S	   =(       d    / $ )
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);rw  r   )r~   ry  rT   r   joinrs   splitpkgutilget_datadecoder   r(  r   r!   FIND_ELEMENTS)r   rv  r   _pkgraw_functionfind_element_jss         r2   rz  WebDriver.find_elements  s     **222=	b*%%88HNN3/45D"++D2CDKKFSL :<.HabO&&

EE ||G11R3PQRYZ`^``r1   c                     U R                   $ )z4Returns the drivers current capabilities being used.)r;   r   s    r2   r5   WebDriver.capabilities  s     yyr1   c                 R   [        U5      R                  5       R                  S5      (       d  [        R                  " S[
        SS9  U R                  5       n [        US5       nUR                  U5        SSS5        Ag! , (       d  f       N= f! [         a     Agf = f! Af = f)	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)
rU   lowerendswithwarningswarnUserWarningget_screenshot_as_pngopenwriteOSError)r   filenamepngfs       r2   get_screenshot_as_file WebDriver.get_screenshot_as_file  s     8}""$--f55MMp
 ((*	h% &
  &% 		 sH   B %B7B 
BB B# B 
B B# B  B# #B&c                 $    U R                  U5      $ )aU  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')
)r  )r   r  s     r2   save_screenshotWebDriver.save_screenshot=  s     **844r1   c                 R    [        U R                  5       R                  S5      5      $ )ztGets 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   r  WebDriver.get_screenshot_as_pngM  s#     668??HIIr1   c                 F    U R                  [        R                  5      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   r  "WebDriver.get_screenshot_as_base64W  s     ||G../88r1   windowHandlec                 j    U R                  U5        U R                  [        U5      [        U5      S9  g)zSets 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_rectr_  )r   r  r  r  s       r2   set_window_sizeWebDriver.set_window_sizeb  s-     	//=3u:c&kBr1   c                     U R                  U5        U R                  5       nUR                  SS5      (       a  US   nS Vs0 sH  o3X#   _M	     sn$ s  snf )zcGets the width and height of the current window.

:Usage:
    ::

        driver.get_window_size()
r   Nr  )r  get_window_rectrN   )r   r  sizer=   s       r2   get_window_sizeWebDriver.get_window_sizeq  sX     	//=##%88GT""=D$78$7q47
$7888s   Axyc                 h    U R                  U5        U R                  [        U5      [        U5      S9$ )zSets 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  r  )r   r  r  r  s       r2   set_window_positionWebDriver.set_window_position  s0     	//=##c!fA#77r1   c                 v    U R                  U5        U R                  5       nS Vs0 sH  o3X#   _M	     sn$ s  snf )zcGets the x,y position of the current window.

:Usage:
    ::

        driver.get_window_position()
r  )r  r  )r   r  positionr=   s       r2   get_window_positionWebDriver.get_window_position  s<     	//='')(23
18;
333s   6c                 <    US:w  a  [         R                  " SSS9  gg)z5Warns if the window handle is not equal to `current`.currentz?Only 'current' window is supported for W3C compatible browsers.r   r  N)r  r  )r   r  s     r2   r  ,WebDriver._check_if_window_handle_is_current  s    9$MM[hij %r1   c                 F    U R                  [        R                  5      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  WebDriver.get_window_rect  r  r1   c                     Uc  Uc  U(       d  U(       d  [        S5      eU R                  [        R                  XX4S.5      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  r  r  r   )r   r   r!   SET_WINDOW_RECT)r   r  r  r  r  s        r2   r  WebDriver.set_window_rect  s?     I!)fU*+TUU||G331u5ghipqqr1   c                     U R                   $ r   )_file_detectorr   s    r2   r}   WebDriver.file_detector  s    """r1   c                 t    U(       d  [        S5      e[        U[        5      (       d  [        S5      eXl        g)zSet 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   rT   r$   r  )r   detectors     r2   r}   r    s2     $%STT(L11$%RSS&r1   c                 F    U R                  [        R                  5      S   $ )zfGets the current orientation of the device.

:Usage:
    ::

        orientation = driver.orientation
r   )r   r!   GET_SCREEN_ORIENTATIONr   s    r2   orientationWebDriver.orientation  r  r1   c                     SS/nUR                  5       U;   a#  U R                  [        R                  SU05        g[	        S5      e)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  r    sA     &z2;;=N*LL77-9OP$%effr1   c                 F    U R                  [        R                  5      S   $ )zGets 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_typesWebDriver.log_types  s     ||G;;<WEEr1   c                 L    U R                  [        R                  SU05      S   $ )zGets 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_logWebDriver.get_log  s#     ||GOOfh-?@IIr1   c                    U R                   (       a  [        U R                   4$ [        5         [        (       d  U R                  R	                  S5      (       aI  U R                  R	                  S5      nU R                  R	                  S5      R                  S5      S   nOU R                  5       u  p!U(       d  [        S5      e[        R                  U5      qU R                  S   R                  5       S:X  a  [        R                  " S[        S	S
9  [        W5      U l         U R                   R                  [        R                   R#                  5       5      nUS   R$                  nU R                   R                  [        R                   R'                  US5      5      nXPR                   l        [        U R                   4$ )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   r  T)r   devtoolsr3   r;   rN   r  _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_devtoolsWebDriver.start_devtools  sW   %%T7777 L899==**!YY]]84F"iimmO<BB3GJG&*&;&;&=OG,-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;&&1T7777r1   c                8  #    [        5         U R                  R                  S5      (       aI  U R                  R                  S5      nU R                  R                  S5      R                  S5      S   nOU R	                  5       u  p!U(       d  [        S5      e[        R                  U5      n[        R                  U5       IS h  vN nUR                  UR                  R                  5       5      I S h  vN nUS   R                  nUR                  U5       IS h  vN n[        U[        U5      7v   S S S 5      IS h  vN   S S S 5      IS h  vN   g  N Nd N= N! , IS h  vN  (       d  f       N0= f N'! , IS h  vN  (       d  f       g = f7f)Nr  r  r   r   r  )r3   r;   rN   r  r  r   r/   r  open_cdpr   r  r  r  open_sessionr   )r   r  r  r  connr  r  r  s           r2   bidi_connectionWebDriver.bidi_connection1  s     	99==""YY]]8,FiimmO4::3?BG"335OG$%YZZ&&w/<<''4 LL)D)D)FGGG
,,I((33w$Wc8<< 43 (''G3333 ('''s   CFE	F-F 9E:(F "E #F &E$;F E"F FE>FF  F "F $E;	*E-+E;	7F >F FF	FFc                     U R                   (       d  U R                  5         U R                  (       d  [        U R                   5      U l        U R                  $ r   )r   _start_bidir   r   r   s    r2   r   WebDriver.scriptE  s:    ))||!$"<"<=DL||r1   c                     U R                   R                  S5      (       a  U R                   R                  S5      nO[        S5      e[        U5      U l        g )NwebSocketUrlr  )r;   rN   r   r-   r   )r   r  s     r2   r   WebDriver._start_bidiO  s@    99==((YY]]>2F$%YZZ%8%@"r1   c                    SS K nSS KnUR                  5       nSnU R                  R	                  S5      S:X  a+  U R                  R	                  S5      R	                  S5      nOgU R                  R	                  S5      S:X  a+  U R                  R	                  S5      R	                  S5      nOS	nU R                  R	                  S
5      nUR                  SSU S35      nUR                  UR                  5      nUR	                  S5      nUR	                  S5      n	SS Kn
U(       a  SnX4$ U
R                  SU5      R                  S5      nX4$ )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  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    U R                  [        R                  UR                  5       5      S   U l        g)z4Adds a virtual authenticator with the given options.r   N)r   r!   ADD_VIRTUAL_AUTHENTICATORr(  r   )r   r^   s     r2   add_virtual_authenticator#WebDriver.add_virtual_authenticatorw  s+    !%g.O.OQXQ`Q`Qb!cdk!lr1   c                     U R                   $ )z,Returns the id of the virtual authenticator.)r   r   s    r2   virtual_authenticator_id"WebDriver.virtual_authenticator_id{  s     %%%r1   c                 j    U R                  [        R                  SU R                  05        SU l        g)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_authenticator&WebDriver.remove_virtual_authenticator  s,     	W99<MtOeOe;fg!%r1   
credentialc                     U R                  [        R                  0 UR                  5       ESU R                  0E5        g)z,Injects a credential into the authenticator.r$  N)r   r!   ADD_CREDENTIALr(  r   )r   r(  s     r2   add_credentialWebDriver.add_credential  s6     	W++-p
0B0B0D-pFWY]YoYo-pqr1   c                     U R                  [        R                  SU R                  05      nUS    Vs/ sH  n[        R
                  " U5      PM     sn$ s  snf )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_credentialsWebDriver.get_credentials  sR     ,,w'>'>ARTXTjTj@klCRSZC[\C[Z
$$Z0C[\\\s   Acredential_idc                     [        U[        5      (       a  [        U5      R                  5       nU R	                  [
        R                  XR                  S.5        g)z,Removes a credential from the authenticator.)credentialIdr$  N)rT   	bytearrayr   r  r   r!   REMOVE_CREDENTIALr   )r   r3  s     r2   remove_credentialWebDriver.remove_credential  sD     mY//-m<CCEM%%ZpZp'q	
r1   c                 \    U R                  [        R                  SU R                  05        g)z/Removes all credentials from the authenticator.r$  N)r   r!   REMOVE_ALL_CREDENTIALSr   r   s    r2   remove_all_credentials WebDriver.remove_all_credentials  s$     	W336GI_I_5`ar1   verifiedc                 ^    U R                  [        R                  U R                  US.5        g)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_verifiedWebDriver.set_user_verified  s$     	W..DDZDZnv0wxr1   c                     SU R                   ;  a  [        S5      eU R                  [        R                  5      S   S   $ )zURetrieves 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_files WebDriver.get_downloadable_files  s=     !(9(99$%jkk||G::;GDWMMr1   	file_nametarget_directoryc                    SU R                   ;  a  [        S5      e[        R                  R	                  U5      (       d  [        R
                  " U5        U R                  [        R                  SU05      S   S   n[        R                  " 5        n[        R                  R                  XAS-   5      n[        US5       nUR                  [        R                  " U5      5        SSS5        [         R"                  " US	5       nUR%                  U5        SSS5        SSS5        g! , (       d  f       NH= f! , (       d  f       N(= f! , (       d  f       g= f)
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.
rE  rF  r   r   contentsz.zipr  Nr)r5   r   ospathexistsmakedirsr   r!   DOWNLOAD_FILEtempfileTemporaryDirectoryr  r  r  base64r   zipfileZipFile
extractall)r   rK  rL  rN  tmp_dirzip_filefilezip_refs           r2   download_fileWebDriver.download_file  s     !(9(99$%jkkww~~.//KK()<< 5 5	7JKGTU_`((*gww||G-?@Hh%

6++H56 & 3/7""#34 0 +*%% 0/ +*s<   /E&D*(ED;E*
D8	4E;
E		E
Ec                 x    SU R                   ;  a  [        S5      eU R                  [        R                  5        g)zDeletes all downloadable files.rE  rF  N)r5   r   r   r!   DELETE_DOWNLOADABLE_FILESr   s    r2   delete_downloadable_files#WebDriver.delete_downloadable_files  s.     (9(99$%jkkW667r1   c                     U R                   $ )a  
: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   fedcmWebDriver.fedcm  s    ( {{r1   c                 V    U R                   R                  [        R                  S5      $ )z8Returns whether the browser supports FedCM capabilities.F)r5   rN   r   FEDCM_CAPABILITYr   s    r2   supports_fedcmWebDriver.supports_fedcm  s#       $$Z%@%@%HHr1   c                 <    U R                   (       d  [        S5      eg)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)rj  r   r   s    r2   _require_fedcm_support WebDriver._require_fedcm_support  s#    ""$B  #r1   c                 8    U R                  5         [        U 5      $ )z0Returns the FedCM dialog object for interaction.)rm  r   r   s    r2   dialogWebDriver.dialog  s     	##%d|r1   c                    ^ ^^ SSK Jm  SSKJn  T R	                  5         Uc  T4nUU 4S jmU" T XUS9nUR                  U4S j5      $ )aV  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                  ^   >  [        T5      n U R                  (       a  U $ S $ ! T a     g f = fr   )r   r   )rp  rs  r   s    r2   _check_fedcm,WebDriver.fedcm_dialog.<locals>._check_fedcm  s4    !'v6$6* s   # # ,,)poll_frequencyignored_exceptionsc                    > T" 5       $ r   r0   )rt  rv  s    r2   <lambda>(WebDriver.fedcm_dialog.<locals>.<lambda>  s    LNr1   )selenium.common.exceptionsrs  selenium.webdriver.support.waitrt  rm  until)r   timeoutrx  ry  rt  waitrs  rv  s   `     @@r2   fedcm_dialogWebDriver.fedcm_dialog  sM     	GA##%%"9!;	 T7^pqzz233r1   )r   r   r  r   r   r   r   r   r   r;   r@   r   r}   r~   r   r   )zhttp://127.0.0.1:4444TNNNNNr   )rD   N)r  )NNNN)   g      ?N)rs   rt   ru   rv   rw   r,   r   r*   r   r   rU   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-  r1  r6  r:  r>  r	   rE  rI  rM  rW  r`  rb  re  rj  r   rp  setterr   IDr~  rz  r5   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  r6  r8  r<  rB  rI  r_  rc  r#   rf  rj  rm  rp  r  rx   r0   r1   r2   r{   r{      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   r{   r   )Xrw   rW  rA  r8   rP  r  rU  r  r  r  rX  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"   rf  r#   r}   r$   r%   r~   r&   r   r'   remote_connectionr(   r   r)   
shadowrootr*   r-  r+   
webelementr,   websocket_connectionr-   r/   r  r3   r?   r   rU   r  r]   ro   rq   r{   r0   r1   r2   <module>r     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   