
    Ehb                     .   S SK r S SKrS SKrS SKrS SKJrJ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JrJr  S S
KJrJrJrJrJ r J!r!  S SK"J#r#  S SK$J%r%J&r&J'r'  S SK(J)r)  \RT                  " \+5      r, " S S\#5      r-g)    N)UnionOptional)	webdriver)expected_conditions)By)WebDriverWait)Keys)ActionChains)WebDriverExceptionTimeoutExceptionMoveTargetOutOfBoundsException)text_to_equalstyle_to_equalclass_to_equalcontains_textcontains_classuntil)DashPageMixin)DashAppLoadingErrorBrowserErrorTestingTimeoutError)SELENIUM_GRID_DEFAULTc                   h   \ rS rSr% \\S'             S>S\S\S\\   S\S\\\	\
4      S	\S
\S\S\S\S\4S jjrS rS r     S?S\S\4S jjr S@S jrS\4S jrSAS jrSAS jrS rS rSBS jrSBS jrSBS jrSBS jrSBS  jrSBS! jrSBS" jrSBS# jrSBS$ jrSCS% jrSDS& jr S' r!SES( jr"SBS) jr#S* r$S+ r%S, r&S- r'\(S. 5       r)SBS/ jr*S0 r+ SFS1 jr,S2 r-S3 r.S4 r/\0S5 5       r1\0S6 5       r2\0S7\4S8 j5       r3\3Rh                  S9 5       r3\0S: 5       r5\0S; 5       r6\6Rh                  S< 5       r6S=r7g)GBrowser(   _urlNbrowserremote
remote_urlheadlessoptionsdownload_path	percy_runpercy_finalizepercy_assets_rootwait_timeoutpausec                 ^   UR                  5       U l        X0l        U(       a  U[        :w  a  SOUU l        X@l        XPl        X`l        Xl        Xl	        Xpl
        Xl        [        U R                  SS9U l        U R                  R                  S5        [!        U R"                  U
5      U l        SU l        SU l        SU l        U R                  (       aQ  [,        R.                  " [,        R0                  " U R"                  SU	S9S	9U l        U R2                  R5                  5         [6        R9                  S
5        [6        R9                  SU R
                  5        [6        R9                  SU R                  5        [6        R9                  S[:        R<                  R?                  U	5      5        g )NT   timeout   r    z/assets)r   base_urlroot_dir)loaderz!initialize browser with argumentsz  headless => %sz  download_path => %sz  percy asset root => %s) lower_browser_remote_urlr   _remote	_headless_options_download_path_wait_timeout_percy_finalize
_percy_run_pauser   get_webdriver_driverimplicitly_waitr   driver_wd_wait_last_tsr   _window_idxpercyRunnerResourceLoaderpercy_runnerinitialize_buildloggerdebugospathabspath)selfr   r   r   r    r!   r"   r#   r$   r%   r&   r'   s               gC:\Users\julio\OneDrive\Documentos\Trabajo\Ideas Frescas\venv\Lib\site-packages\dash/testing/browser.py__init__Browser.__init__,   s<     %:1F#FDF 	 "+)-#T//;$$Q'%dkk<@	?? %++"kk&.!D ..089'8,d.A.AB/AR1ST    c                     U $ N rM   s    rN   	__enter__Browser.__enter___   s    rQ   c                     U R                   R                  5         U R                  (       aA  U R                  (       a0  [        R                  S5        U R                  R                  5         g [        R                  S5        g ! [         a    [        R                  S5         g [        R                  R                   a    [        R                  S5         g f = f)Nzpercy runner finalize build nowzpercy finalize relies on CI jobz!webdriver quit was not successfulz(percy runner failed to finalize properly)r?   quitr:   r9   rH   inforF   finalize_buildr   	exceptionrC   errorsError)rM   exc_typeexc_val	tracebacks       rN   __exit__Browser.__exit__b   s    
	IKK4#7#7=>!!002=>! 	B@A||!! 	IGH	Is   A+B .B C%2CCresource_pathhook_idc                    UR                  S5      n X:w  a  [        R                  S5        U R                  U l        U R                  R                  U R                  R                  S5       SU 35        U R                  U5        U R                  UUUUS9  U(       a  U R                  S5      (       a   S5       eU(       d  U R                  R                  5         g g ! [         a  n	[        R                  SU5        U	eS n	A	ff = f)N/z)we stripped the left '/' in resource_path)wait_for_callbacksconvert_canvaseswidthszdiv.dash-debug-alertz(devtools should not raise an error alertzsnapshot at resource %s error)lstriprH   warning
server_urlr?   getrstripwait_for_element_by_idpercy_snapshotfind_elementsbackr   r\   )
rM   rd   re   rh   ri   assert_checkstay_on_pagerj   rK   es
             rN   visit_and_snapshotBrowser.visit_and_snapshoto   s     ##C(	$JK"ooDOKKOOt55c:;1TFCD ''0#5!1	    --*  >=>     "  ! 	<dCG	s   CC! !
D+DDc                 n   Uc  S/n SSK nUS-  n[        R                  SU5         U(       a+  [        R
                  " S5        [        U R                  SSS	9  U(       a  U R                  R                  S5         U R                  R                  XS9  U(       a  U R                  R                  S5        gg! [         a     Nf = f! [         a#    [        R                  S
U R                  5         Nf = f! [        R                    a&  nUR"                  R$                  S:w  a  Ue SnANSnAff = f)a  percy_snapshot - visual test api shortcut to `percy_runner.snapshot`.
It also combines the snapshot `name` with the Python version,
args:
- name: combined with the python version to give the final snapshot name
- wait_for_callbacks: default False, whether to wait for Dash callbacks,
    after an extra second to ensure that any relevant callbacks have
    been initiated
- convert_canvases: default False, whether to convert all canvas elements
    in the DOM into static images for percy to see. They will be restored
    after the snapshot is complete.
- widths: a list of pixel widths for percy to render the page with. Note
    that this does not change the browser in which the DOM is constructed,
    so the width will only affect CSS, not JS-driven layout.
    Defaults to [1280]
Ni   r   _asyncztaking snapshot name => %sr)   r   g333333?)r+   pollz5wait_for_callbacks failed => status of invalid rqs %sa  
                const stash = window._canvasStash = [];
                Array.from(document.querySelectorAll('canvas')).forEach(c => {
                    const i = document.createElement('img');
                    i.src = c.toDataURL();
                    i.width = c.width;
                    i.height = c.height;
                    i.setAttribute('style', c.getAttribute('style'));
                    i.className = c.className;
                    i.setAttribute('data-canvasnum', stash.length);
                    stash.push(c);
                    c.parentElement.insertBefore(i, c);
                    c.parentElement.removeChild(c);
                });
            )namerj   i  a  
                const stash = window._canvasStash;
                Array.from(
                    document.querySelectorAll('img[data-canvasnum]')
                ).forEach(i => {
                    const c = stash[+i.getAttribute('data-canvasnum')];
                    i.parentElement.insertBefore(c, i);
                    i.parentElement.removeChild(i);
                });
                delete window._canvasStash;
            )asgirefImportErrorrH   rZ   timesleepr   _wait_for_callbacksr   errorredux_state_rqsr?   execute_scriptrF   snapshotrequests	HTTPErrorrequeststatus_code)rM   r|   rh   ri   rj   r}   errs          rN   rq   Browser.percy_snapshot   s%   $ >VF	HD 	0$7	! 

1d..E KK&&$	&&D&@ KK&&
 [  		 # 	 LLG$$		< !! 	{{&&#-	 .	s:   	B: 2C
 =C: :
CC
*C76C7:D4D//D4r|   c                 |   U R                  5       (       d  SO[        R                  " SS5      n[        R                  R	                  U5      (       d   [        R
                  " U5        U R                  R                  U SU SU R                   S35        g! [         a    [        R                  S5         NPf = f)	zHook method to take snapshot when a selenium test fails. The
snapshot is placed under.

    - `/tmp/dash_artifacts` in linux
    - `%TEMP` in windows
with a filename combining test case name and the
running selenium session id
z/tmp/dash_artifactsTEMPr-   zcannot make artifactsrg   _z.pngN)_is_windowsrJ   getenvrK   existsmkdirOSErrorrH   r\   r?   save_screenshot
session_id)rM   r|   targets      rN   take_snapshotBrowser.take_snapshot   s     *.)9)9););!6SUAV 	 ww~~f%%:  	##vhavQt6Gt$LM  :  !89:s   B B;:B;c                 r    U R                   R                  [        [        UR	                  5       5      U5      $ )au  find_element returns the first found element by the attribute `selector`
shortcut to `driver.find_element(By.CSS_SELECTOR, ...)`.
args:
- attribute: the attribute type to search for, aligns with the Selenium
    API's `By` class. default "CSS_SELECTOR"
    valid values: "CSS_SELECTOR", "ID", "NAME", "TAG_NAME",
    "CLASS_NAME", "LINK_TEXT", "PARTIAL_LINK_TEXT", "XPATH"
)r?   find_elementgetattrr   upperrM   selector	attributes      rN   r   Browser.find_element   s)     {{''IOO4E(FQQrQ   c                 r    U R                   R                  [        [        UR	                  5       5      U5      $ )a}  find_elements returns a list of all elements matching the attribute
`selector`. Shortcut to `driver.find_elements(By.CSS_SELECTOR, ...)`.
args:
- attribute: the attribute type to search for, aligns with the Selenium
    API's `By` class. default "CSS_SELECTOR"
    valid values: "CSS_SELECTOR", "ID", "NAME", "TAG_NAME",
    "CLASS_NAME", "LINK_TEXT", "PARTIAL_LINK_TEXT", "XPATH"
)r?   rr   r   r   r   r   s      rN   rr   Browser.find_elements  s)     {{((Y__5F)GRRrQ   c                 R    [        U[        5      (       a  U R                  U5      $ U$ rS   )
isinstancestrr   )rM   elem_or_selectors     rN   _get_elementBrowser._get_element  s(    &,,$$%566rQ   c                 `    Uc  U R                   O[        U R                  U5      n[        R	                  SUUR
                  UR                  5        UR                  U5      $ ! [         a?  n[        U5      (       a  U" U R                  5      nOUn[        [        U5      5      UeSnAff = f)z4Abstract generic pattern for explicit WebDriverWait.Nz!method, timeout, poll => %s %s %s)r@   r   r?   rH   rI   _timeout_pollr   	Exceptioncallabler   r   )rM   methodr+   msg_waitr   messages          rN   	_wait_forBrowser._wait_for  s    	: ? "4;;8 
 LL3	 ;;v&& 	:}}dkk*"3w<0c9	:s   A!A$ $
B-.:B((B-c                 $    U R                  X5      $ )z~wait_for_element is shortcut to `wait_for_element_by_css_selector`
timeout if not set, equals to the fixture's `wait_timeout`.) wait_for_element_by_css_selectorrM   r   r+   s      rN   wait_for_elementBrowser.wait_for_element-  s     44XGGrQ   c                     U R                  [        R                  " [        R                  U45      USU=(       d    U R
                   SU 35      $ )Explicit wait until the element is present, timeout if not set,
equals to the fixture's `wait_timeout` shortcut to `WebDriverWait` with
`EC.presence_of_element_located`.timeout zs => waiting for selector )r   ECpresence_of_element_locatedr   CSS_SELECTORr8   r   s      rN   r   (Browser.wait_for_element_by_css_selector2  sR     ~~**(+ w4$"4"455OPXzZ
 	
rQ   c                 P   ^ ^ [        UU 4S jU=(       d    T R                  5        g)z^Explicit wait until an element is NOT found. timeout defaults to
the fixture's `wait_timeout`.c                  H   > TR                   R                  ST  S35      S:H  $ )Nz"return document.querySelectorAll('z	').lengthr   )r?   r   )r   rM   s   rN   <lambda>.Browser.wait_for_no_elements.<locals>.<lambda>D  s*    DKK..4XJiH rQ   N)r   r8   r   s   `` rN   wait_for_no_elementsBrowser.wait_for_no_elements>  s"     	 )t))	
rQ   c                     U R                  [        R                  " [        R                  U45      USU=(       d    U R
                   SU 35      $ )r   r   zs => waiting for element id )r   r   r   r   IDr8   )rM   
element_idr+   s      rN   rp   Browser.wait_for_element_by_idK  sS     ~~**
# w4$"4"455QR\Q]^
 	
rQ   c           	      j    U R                  [        X5      USU SU=(       d    U R                   S3S9$ )zExplicit wait until the element's class has expected `value` timeout
if not set, equals to the fixture's `wait_timeout` shortcut to
`WebDriverWait` with customized `class_to_equal` condition.zclassname =>  not found within sr   r+   r   )r   r   r8   rM   r   	classnamer+   s       rN   wait_for_class_to_equalBrowser.wait_for_class_to_equalW  sE     ~~!(6	{*<W=ZHZHZ<[[\]  
 	
rQ   c                 r    U R                  [        XU5      USU SU SU=(       d    U R                   S3S9$ )zExplicit wait until the element's style has expected `value` timeout
if not set, equals to the fixture's `wait_timeout` shortcut to
`WebDriverWait` with customized `style_to_equal` condition.zstyle val =>  r   r   r   )r   r   r8   )rM   r   stylevalr+   s        rN   wait_for_style_to_equalBrowser.wait_for_style_to_equala  sM     ~~!(37wau,>w?\$J\J\>]]^_  
 	
rQ   c                 v    [        XU=(       d    U R                  5      nU R                  UUUR                  S9$ )zExplicit wait until the element's text equals the expected `text`.

timeout if not set, equals to the fixture's `wait_timeout`
shortcut to `WebDriverWait` with customized `text_to_equal`
condition.
r   )r   r&   r   r   rM   r   textr+   r   s        rN   wait_for_text_to_equalBrowser.wait_for_text_to_equalk  s>     xw/K$:K:KL~~  
 	
rQ   c           	      j    U R                  [        X5      USU SU=(       d    U R                   S3S9$ )zExplicit wait until the element's classes contains the expected `classname`.

timeout if not set, equals to the fixture's `wait_timeout`
shortcut to `WebDriverWait` with customized `contains_class`
condition.
zclassname -> z! not found inside element within r   r   )r   r   r8   r   s       rN   wait_for_contains_classBrowser.wait_for_contains_classz  sF     ~~!(6	{*KGLiW[WiWiKjjkl  
 	
rQ   c                 v    [        XU=(       d    U R                  5      nU R                  UUUR                  S9$ )zExplicit wait until the element's text contains the expected `text`.

timeout if not set, equals to the fixture's `wait_timeout`
shortcut to `WebDriverWait` with customized `contains_text`
condition.
r   )r   r&   r   r   r   s        rN   wait_for_contains_textBrowser.wait_for_contains_text  s>     xw/K$:K:KL~~  
 	
rQ   c                    U R                   R                  Uc  U R                  OU5         U R                  U R                  US9  U R                  (       a  S
SKnUR!                  5         gg! [
         a  n[        R                  SU5        SR                  S U R                  5        5       5      n[        R                  U5        U R                  S5      R                  S5      n[        SU S	U S35      UeSnAff = f)zwait_for_page navigates to the url in webdriver wait until the
renderer is loaded in browser.

use the `server_url` if url is not provided.
Nr*   z+dash server is not loaded within %s seconds
c              3   8   #    U  H  n[        U5      v   M     g 7frS   )r   ).0logs     rN   	<genexpr>(Browser.wait_for_page.<locals>.<genexpr>  s     B/3c#hh/s   body	innerHTMLzIthe expected Dash react entry point cannot be loaded in browser
 HTML => z
 Console Logs => r   )r?   rn   rm   r   dash_entry_locatorr   rH   r\   joinget_logsrI   r   get_propertyr   r;   pdb	set_trace)rM   urlr+   exclogshtmlr   s          rN   wait_for_pageBrowser.wait_for_page  s     	3;C@	11'' 2  ;;MMO    	JGT99B$--/BCDLL$$V,99+FD%))-.A$rK 	s   A- -
D 7BC;;D c                 "   U R                  U5      nUR                  5         UR                  [        R                  S5      n[
        R                  SSR                  UR                  R                  S5      5      5        UR                  [        R                  S5      nU(       aS  [        U[        5      (       a  Xc   R                  5         g U H%  nUR                  U:X  d  M  UR                  5           g    [
        R                  SX#5        g )Nzdiv.Select-menu-outerzthe available options are %s|r   zdiv.VirtualizedSelectOptionz6cannot find matching option using value=%s or index=%s)r   clickr   r   r   rH   rI   r   r   splitrr   r   intr   )rM   r   valueindexdropdownmenur!   options           rN   select_dcc_dropdownBrowser.select_dcc_dropdown  s    $$%56$$R__6MN3SXXdiiood>S5TU$$R__6ST%%%$$&!;;%'LLN "
 	De	
rQ   c                 p    U R                   S-   S-  nU R                  US9  U =R                   S-  sl         g)zASwitch between the current working window and the new opened one.r)   r,   )idxN)rB   switch_windowrM   r  s     rN   toggle_windowBrowser.toggle_window  s9    !#q(s#ArQ   c                     [        U R                  R                  5      U::  a  [        S5      eU R                  R                  R                  U R                  R                  U   5        g)zGSwitch to window by window index shortcut to
`driver.switch_to.window`.z$there is no second window in BrowserN)lenr?   window_handlesr   	switch_towindowr  s     rN   r  Browser.switch_window  sN     t{{))*c1EFF$$T[[%?%?%DErQ   c                 h    U R                   R                  SU=(       d    U R                   S35        g)zAOpen a new tab in browser url is not set, equals to `server_url`.zwindow.open("z", "new window")N)r?   r   rm   )rM   r   s     rN   open_new_tabBrowser.open_new_tab  s+    ""C24??33CD	
rQ   c                 >    [        U SU R                   35      " 5       $ )N_get_)r   r2   rU   s    rN   r<   Browser.get_webdriver  s    tuT]]O4577rQ   c                 ,   U R                   (       a.  [        U R                   [        5      (       a  U R                   S   O1[        [        U R
                  5      R                  R                  5       nU R                  (       a  UR                  S5        U$ )Nr   z
--headless)
r6   r   listr   r   r2   r!   Optionsr5   add_argumentrM   r!   s     rN   _get_wd_optionsBrowser._get_wd_options  sg     }}DMM4!@!@ MM!DMM2::BBD 	 >>  .rQ   c           	         U R                  5       nS[        R                  ;   a  [        R                  S   Ul        UR	                  SU R
                  SSSSS.5        UR                  S5        UR                  S5        UR                  S5        UR                  S	5        UR                  S
SS05        U R                  (       a  [        R                  " U R                  US9O[        R                  " US9nU R                  (       aS  SUR                  R                  S'   SSU R
                  S.S.nUR!                  SU5      n["        R%                  SU5        UR'                  SS5        U$ )NDASH_TEST_CHROMEPATHprefsFT)zdownload.default_directoryzdownload.prompt_for_downloadzdownload.directory_upgradezsafebrowsing.enabledz(safebrowsing.disable_download_protectionz--disable-dev-shm-usagez--no-sandboxz--disable-gpuz--remote-debugging-port=0zgoog:loggingPrefsr   SEVEREcommand_executorr!   r!   )POSTz)/session/$sessionId/chromium/send_commandsend_commandzPage.setDownloadBehaviorallow)behaviordownloadPath)cmdparamsz$enabled headless download returns %sr   )r  rJ   environbinary_locationadd_experimental_optionr"   r  set_capabilityr4   r   Remoter3   Chromer5   r"  	_commandsexecuterH   rI   set_window_position)rM   r!   chromer*  ress        rN   _get_chromeBrowser._get_chrome  sQ   &&(!RZZ/&(jj1G&HG#''.2.@.@05.2(-<@		
 	67^,_-892Y4IJ || d.>.>P!!'2 	 >>AF##--n=
 2'.@R@RSF ..8CLL?E""1a(rQ   c                    U R                  5       nUR                  SS5        UR                  SU R                  5        UR                  SS5        UR                  SS5        U R                  (       d  U R
                  (       a  [        S5      eU R
                  (       a  [        R                  " U R                  US	9$ [        R                  " US
9$ )N
marionetteTzbrowser.download.dirzbrowser.download.folderListr,   z&browser.helperApps.neverAsk.saveToDiskzapplication/octet-streamz4remote_url was not provided but required for Firefoxr!  r#  )
r  r.  set_preferencer"   r3   r4   	TypeErrorr   r/  Firefoxr  s     rN   _get_firefoxBrowser._get_firefox  s    &&(|T25t7I7IJ<a@4&	
 DLLRSS ||	 !%!1!1	
 ""73	
rQ   c                  (    [         R                  S:H  $ )Nwin32)sysplatformrT   rQ   rN   r   Browser._is_windows.  s    ||w&&rQ   c                     [        U5       HA  nU R                  U5      R                  5         U(       d  M+  [        R                  " U5        MC     g)z9multiple_click click the element with number of `clicks`.N)ranger   r   r   r   )rM   r   clicksdelayr   s        rN   multiple_clickBrowser.multiple_click2  s9    vA./557u

5! rQ   c                    U R                  U5      n[        R                  SX5        [        U R                  5      R                  U5      R                  S5      R                  U5      R                  [        R                  5      R                  [        R                  5      R                  [        R                  5      R                  [        R                  5      R                  [        R                  5      R!                  5         g)z&Simulate key press to clear the input.zclear input with %s => %s皙?N)r   rH   rI   r
   r?   move_to_elementr'   r   	send_keysr	   ENDkey_downSHIFTHOMEkey_upDELETEperform)rM   r   elems      rN   clear_inputBrowser.clear_input9  s      !1202BI%_T"U3ZU4[Ytxx Xdjj!Ytyy!VDJJYt{{#
')rQ   c                    U R                  U5      nUR                  S5      nUR                  S   UR                  S   p [        U R                  5      R                  XWU-  X-  5      R                  XWU-  X-  5      R                  5         U(       a  XeR                  S5      :w  d   S5       egg! [         a    [        R                  S5         NEf = f)zZoom out a graph with a zoom box fraction of component dimension
default start at middle with a rectangle of 1/5 of the dimension use
`compare` to control if we check the svg get changed.r   widthheightz$graph offset outside of the boundaryz*SVG content should be different after zoomN)r   get_attributesizer
   r?   move_to_element_with_offsetdrag_and_drop_by_offsetrT  r   rH   r\   )	rM   r   start_fractionzoom_box_fractioncomparerU  prevwhs	            rN   zoom_in_graph_by_ratioBrowser.zoom_in_graph_by_ratioI  s       !12!!+.yy!499X#61	E%AA.(!*<%%++Q-Bgi --  <;<   . 	ECD	Es   AB2 2CCc                     U R                  U5      n[        U R                  5      R                  XDR                  S   U-  UR                  S   U-  5      R                  5       R                  5         g )NrY  rZ  )r   r
   r?   r]  r\  r   rT  )rM   r   fxfyrU  s        rN   click_at_coord_fractions Browser.click_at_coord_fractions`  sX      !12T[[!==))G$r)499X+>+C	

%''')rQ   c                     U R                   S:X  aA  U R                  R                  S5       Vs/ s H  nUS   U R                  :  d  M  UPM     sn$ [        R
                  " S5        gs  snf )zReturn a list of `SEVERE` level logs after last reset time stamps
(default to 0, resettable by `reset_log_timestamp`.

Chrome only
r4  r   	timestampz=get_logs always return None with webdrivers other than ChromeN)r2   r?   get_logrA   warningswarn)rM   entrys     rN   r   Browser.get_logsg  si     ==H$ "[[00;;E%5 ; 
 	UVs   A)	A)c                     U R                   S:X  a1  U R                  R                  S5      nU(       a  US   S   U l        ggg)z4reset_log_timestamp only work with chrome webdriver.r4  r   rm  N)r2   r?   rn  rA   )rM   entriess     rN   reset_log_timestampBrowser.reset_log_timestampv  s?    ==H$kk)))4G 'K 8  %rQ   c                     U R                   $ )z2Expose the selenium webdriver as fixture property.)r=   rU   s    rN   r?   Browser.driver}  s     ||rQ   c                 .    U R                   R                  $ rS   )r?   r   rU   s    rN   r   Browser.session_id  s    {{%%%rQ   returnc                     U R                   $ rS   )r   rU   s    rN   rm   Browser.server_url  s    yyrQ   c                 0    Xl         U R                  5         g)zqSet the server url so the selenium is aware of the local server
port.

It also implicitly calls `wait_for_page`.
N)r   r   rM   r   s     rN   rm   r~    s     	rQ   c                     U R                   $ rS   )r7   rU   s    rN   r"   Browser.download_path  s    """rQ   c                     U R                   $ rS   )r8   rU   s    rN   r&   Browser.wait_timeout  s    !!!rQ   c                 F    Xl         [        U R                  U5      U l        g rS   )r8   r   r?   r@   r  s     rN   r&   r    s    "%dkk59rQ   )r2   r7   r=   r5   rA   r6   r;   r9   r:   r4   r3   r   r8   r@   rB   rF   rm   )
FNFNr-   TTr-   
   F)TFTFN)r-   FFN)r   rS   )Nr  )NN)r   )g      ?rK  T)8__name__
__module____qualname____firstlineno__r   __annotations__boolr   r   dictr  r   rO   rV   rb   rw   rq   r   r   rr   r   r   r   r   r   rp   r   r   r   r   r   r   r  r  r  r  r<   r  r6  r=  staticmethodr   rH  rV  re  rj  r   rv  propertyr?   r   rm   setterr"   r&   __static_attributes__rT   rQ   rN   r   r   (   sR   
I $(/3#!#1U1U 1U SM	1U
 1U %d
+,1U 1U 1U 1U 1U 1U 1UfI"  !! !H QURhN# N*	R	S 
:.H










4
,F
8
-^
. ' '"" TX<.9   & & C     # # " " : :rQ   r   ).rJ   rA  r   loggingtypingr   r   ro  rC   r   seleniumr   selenium.webdriver.supportr   r   selenium.webdriver.common.byr   selenium.webdriver.support.waitr   selenium.webdriver.common.keysr	   'selenium.webdriver.common.action_chainsr
   selenium.common.exceptionsr   r   r   dash.testing.waitr   r   r   r   r   r   dash.testing.dash_pager   dash.testing.errorsr   r   r   dash.testing.constsr   	getLoggerr  rH   r   rT   rQ   rN   <module>r     sq    	 
   "     @ + 9 / @   1 V V 5 
		8	$w	:m w	:rQ   