U
    õÕ/e>.  ã                	   @  sâ  d Z ddlmZ ddlZe e¡ZddlmZm	Z	m
Z
mZmZ ddlmZ ddlmZ ddlmZ ddlmZ er–dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ er¾ddlmZ dZ dddœdd„Z!dZ"ddœdddddœdd„Z#dZ$dddœdd „Z%d!d"d#d$œd%d&„Z&G d'd(„ d(ƒZ'G d)d*„ d*ƒZ(G d+d,„ d,ƒZ)dod!d"d.d/d#d0œd1d2„Z*d!d"d#d$œd3d4„Z+dpd!d"dd/dd5d#d6œd7d8„Z,d!d"dd#d9œd:d;„Z-d!d"dd#d9œd<d=„Z.d!d>d#d?œd@dA„Z/dqd!dBd#dCœdDdE„Z0d!d/dFdGœdHdI„Z1d!d/d"dJœdKdL„Z2d!dMdNœdOdP„Z3d!d/d/d"dQœdRdS„Z4d!d/d"dGœdTdU„Z5d!dd"dVœdWdX„Z6d!d"d#d$œdYdZ„Z7drd!d/dd#d\œd]d^„Z8d"d!d#d_œd`da„Z9dsd!dddd#dbœdcdd„Z:d!dddd#deœdfdg„Z;d!dddhœdidj„Z<d!dddhœdkdl„Z=d!dddhœdmdn„Z>dS )tz. Provide tools for executing Selenium tests.

é    )ÚannotationsN)ÚTYPE_CHECKINGÚAnyÚListÚSequenceÚSet)ÚTimeoutException)ÚActionChains)ÚKeys)ÚWebDriverWait)Ú_KeySeq)Ú	WebDriver)Ú
WebElement)ÚButton)Úmake_id)ÚCallback)Ú	alt_clickÚButtonWrapperÚcopy_table_rowsÚCOUNTÚdrag_range_sliderÚdrag_sliderÚelement_to_finish_resizingÚelement_to_start_resizingÚenter_text_in_cellÚ#enter_text_in_cell_with_click_enterÚenter_text_in_elementÚget_page_elementÚget_slider_bar_colorÚget_slider_title_textÚget_slider_title_valueÚget_table_cellÚget_table_column_cellsÚget_table_headerÚget_table_rowÚget_table_selected_rowsÚhover_elementÚINITÚpaste_valuesÚRECORDÚRESULTSÚSCROLLÚselect_element_and_press_keyÚshift_clickÚsort_table_columnÚwait_for_canvas_resizeÚstr)ÚkeyÚreturnc                 C  s   d|  S )NzBokeh._testing.count(%r);© )r1   r3   r3   ú@/tmp/pip-unpacked-wheel-f5fndrjf/bokeh/_testing/util/selenium.pyr   [   s    r   zBokeh._testing.init();T)Úfinalr   Úbool)r1   Úvaluer5   r2   c                C  s    |rd| |f S d| |f S d S )NzBokeh._testing.record(%r, %s);zBokeh._testing.record0(%r, %s);r3   )r1   r7   r5   r3   r3   r4   r)   `   s    r)   zreturn Bokeh._testing.resultsÚfloat)Úamtr2   c                 C  s   d|  S )NzÂ
    const elt = document.getElementsByClassName("bk-canvas-events")[0];
    const event = new WheelEvent('wheel', { deltaY: %f, clientX: 100, clientY: 100} );
    elt.dispatchEvent(event);
    r3   )r9   r3   r3   r4   r+   h   s    ür+   r   r   ÚNone)ÚdriverÚelementr2   c                 C  s6   t | ƒ}| tj¡ | |¡ | tj¡ | ¡  d S ©N)r	   Úkey_downr
   ZMETAÚclickÚkey_upÚperform©r;   r<   Úactionsr3   r3   r4   r   o   s
    
r   c                   @  s.   e Zd Zddddœdd„Zdddœd	d
„ZdS )r   r0   r   r:   )ÚlabelÚcallbackr2   c                 C  s0   dt ƒ  | _t|| jgd| _| j d|¡ d S )Nzbutton-)rD   Zcss_classesZbutton_click)r   Úrefr   ÚobjZjs_on_event)ÚselfrD   rE   r3   r3   r4   Ú__init__x   s    zButtonWrapper.__init__r   ©r;   r2   c                 C  s   |  d| j ¡}| ¡  d S )Nz.%s .bk-btn)Úfind_element_by_css_selectorrF   r?   )rH   r;   Úbuttonr3   r3   r4   r?   }   s    zButtonWrapper.clickN)Ú__name__Ú
__module__Ú__qualname__rI   r?   r3   r3   r3   r4   r   w   s   r   c                   @  s0   e Zd ZdZdddœdd„Zddd	œd
d„ZdS )r   zD An expectation for checking if an element has started resizing
    r   r:   ©r<   r2   c                 C  s   || _ | j jd | _d S ©NÚwidth©r<   ÚsizeZprevious_width©rH   r<   r3   r3   r4   rI   …   s    z"element_to_start_resizing.__init__r   r6   rJ   c                 C  s(   | j jd }| j|krdS || _dS d S ©NrR   TFrS   ©rH   r;   Zcurrent_widthr3   r3   r4   Ú__call__‰   s
    
z"element_to_start_resizing.__call__N©rM   rN   rO   Ú__doc__rI   rX   r3   r3   r3   r4   r      s   r   c                   @  s0   e Zd ZdZdddœdd„Zddd	œd
d„ZdS )r   zF An expectation for checking if an element has finished resizing

    r   r:   rP   c                 C  s   || _ | j jd | _d S rQ   rS   rU   r3   r3   r4   rI   –   s    z#element_to_finish_resizing.__init__r   r6   rJ   c                 C  s(   | j jd }| j|krdS || _dS d S rV   rS   rW   r3   r3   r4   rX   š   s
    
z#element_to_finish_resizing.__call__NrY   r3   r3   r3   r4   r   ‘   s   r   é   r   Úint)r;   r<   r1   Úpress_numberr2   c                 C  sH   t | ƒ}| |¡ | ¡  t|ƒD ] }t | ƒ}| ||¡ | ¡  q"d S r=   )r	   Úmove_to_elementr?   ÚrangeZsend_keys_to_elementrA   )r;   r<   r1   r]   rC   Ú_r3   r3   r4   r,   ¢   s    
r,   c                 C  s   t | ƒ |¡}| ¡  d S r=   )r	   r^   rA   )r;   r<   Zhoverr3   r3   r4   r&   «   s    r&   z_KeySeq | None)r;   r<   Útextr?   ÚenterÚmodr2   c                 C  st   t | ƒ}| |¡ |dkr$| ¡  n|dkr4| ¡  |rB|tj7 }|rP| |¡ | |¡ |rh| |¡ | 	¡  d S )Nr[   é   )
r	   r^   r?   Údouble_clickr
   ÚENTERr>   Ú	send_keysr@   rA   )r;   r<   ra   r?   rb   rc   rC   r3   r3   r4   r   ¯   s    
 
 



r   )r;   Úcellra   r2   c                 C  sF   t | ƒ}| |¡ | ¡  | ¡  | ¡  | |tj ¡ | ¡  d S r=   )r	   r^   re   r?   rg   r
   rf   rA   ©r;   rh   ra   rC   r3   r3   r4   r   ¾   s    
r   c                 C  s<   t | ƒ}| |¡ | ¡  | tj| tj ¡ | ¡  d S r=   )r	   r^   r?   rg   r
   rf   rA   ri   r3   r3   r4   r   Ç   s
    
r   zSequence[int])r;   Úrowsr2   c                 C  sž   t | ƒ}t| |d ƒ}| |¡ | ¡  | tj¡ |dd … D ] }t| |ƒ}| |¡ | ¡  q@| tj¡ | tj¡ | 	tj
¡ | tj¡ | ¡  d S )Nr   r[   )r	   r$   r^   r?   r>   r
   ÚSHIFTr@   ÚCONTROLrg   ÚINSERTrA   )r;   rj   rC   ÚrowÚrr3   r3   r4   r   Î   s    



r   zWebElement | None)r;   Úelr2   c                 C  sF   t | ƒ}|r| |¡ | tj¡ | tj¡ | tj¡ | ¡  d S r=   )	r	   r^   r>   r
   rk   rg   rm   r@   rA   )r;   rp   rC   r3   r3   r4   r(   ß   s    
r(   z	List[str])r;   Úcolr2   c                 C  sD   g }|   d¡}| d¡}|D ]"}|  d||f ¡}| |j¡ q|S )Nú.grid-canvasú
.slick-rowz.slick-cell.l%d.r%d)rK   Úfind_elements_by_css_selectorÚappendra   )r;   rq   ÚresultÚgridrj   rn   Úeltr3   r3   r4   r"   é   s    

r"   )r;   rn   r2   c                 C  s   |   d| ¡S )Nz%.grid-canvas .slick-row:nth-child(%d)©rK   )r;   rn   r3   r3   r4   r$   ò   s    r$   zSet[int]rJ   c                 C  sR   t ƒ }|  d¡}| d¡}t|ƒD ]*\}}| d¡}d| d¡kr"| |¡ q"|S )Nrr   rs   z.slick-cell.l1.r1ÚselectedÚclass)ÚsetrK   rt   Ú	enumerateZget_attributeÚadd)r;   rv   rw   rj   Úirn   rx   r3   r3   r4   r%   õ   s    


r%   )r;   rn   rq   r2   c                 C  s   |   d||f ¡S )Nz*.grid-canvas .slick-row:nth-child(%d) .r%dry   )r;   rn   rq   r3   r3   r4   r!   ÿ   s    r!   c                 C  s   |   d| ¡S ©Nz8.slick-header-columns .slick-header-column:nth-child(%d)ry   )r;   rq   r3   r3   r4   r#     s    r#   )r;   Úelement_selectorr2   c                 C  s
   |   |¡S r=   ry   )r;   r   r3   r3   r4   r     s    r   c                 C  s6   t | ƒ}| tj¡ | |¡ | tj¡ | ¡  d S r=   )r	   r>   r
   rk   r?   r@   rA   rB   r3   r3   r4   r-     s
    
r-   F)r;   rq   Údoubler2   c                 C  s&   |   d| ¡}| ¡  |r"| ¡  d S r€   )rK   r?   )r;   rq   r‚   rx   r3   r3   r4   r.     s     r.   )ÚcanvasÚtest_driverr2   c                 C  sD   z*t |dƒ}| t| ƒ¡ | t| ƒ¡ W n tk
r>   Y nX dS )z

    r[   N)r   Zuntilr   r   r   )rƒ   r„   Úwaitr3   r3   r4   r/     s    
r/   )r;   Ú	css_classÚdistanceÚreleaser2   c                 C  sR   |   |¡}|  d¡}t| ƒ}| |¡ | ¡  | |d¡ |rF| ¡  | ¡  d S )Nz.noUi-handler   ©rK   r	   r^   Zclick_and_holdZmove_by_offsetrˆ   rA   )r;   r†   r‡   rˆ   rp   ÚhandlerC   r3   r3   r4   r   "  s    


r   )r;   r†   Úlocationr‡   r2   c                 C  sR   |   |¡}|  d| ¡}t| ƒ}| |¡ | ¡  | |d¡ | ¡  | ¡  d S )Nz.noUi-handle-r   r‰   )r;   r†   r‹   r‡   rp   rŠ   rC   r3   r3   r4   r   -  s    

r   )r;   r†   r2   c                 C  s   |   |¡}|  d¡jS )Nz(div.bk-input-group > div.bk-slider-title©rK   ra   ©r;   r†   rp   r3   r3   r4   r   7  s    
r   c                 C  s   |   |¡}|  d¡jS )Nz/div.bk-input-group > div > span.bk-slider-valuerŒ   r   r3   r3   r4   r    ;  s    
r    c                 C  s   |   |¡}|  d¡}| d¡S )Nz.noUi-connectzbackground-color)rK   Zvalue_of_css_property)r;   r†   rp   Úbarr3   r3   r4   r   ?  s    

r   )r[   )r[   TN)N)F)T)?rZ   Ú
__future__r   ÚloggingÚ	getLoggerrM   ÚlogÚtypingr   r   r   r   r   Zselenium.common.exceptionsr   Z'selenium.webdriver.common.action_chainsr	   Zselenium.webdriver.common.keysr
   Zselenium.webdriver.support.waitr   r   Z#selenium.webdriver.remote.webdriverr   Z$selenium.webdriver.remote.webelementr   Zbokeh.modelsr   Zbokeh.util.serializationr   Zbokeh.models.callbacksr   Ú__all__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   r3   r3   r3   r4   Ú<module>   sd   
	%
	     ÿ	
	

