o
    [h%                     @   s   d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZmZmZ d dlmZ d dlmZ d d	lmZ G d
d deeZG dd dZedG dd deedZdd ZdS )    N)contextmanager)wraps)Path)settings)LiveServerTestCaseoverride_settingstag)classpropertyimport_string)capfirstc                       sd   e Zd Zg ZdZdZdZdZ fddZe	dd Z
e	dd Ze	d	d
 Zdd Zdd Z  ZS )SeleniumTestCaseBaseNFc           
         s   t  | |||}|jstdd | D s|S |jrb|jd }||_|js*|jnd}||_| j|_t	j
|j }|jdd D ]}| | dt||f |f||| j|jd}	t||	j|	 q@|S td	|S )
z
        Dynamically create new classes and add them to the test module when
        multiple browsers specs are provided (e.g. --selenium=firefox,chrome).
        c                 s   s&    | ]\}}| d ot|V  qdS )testN)
startswithcallable).0namevalue r   {/home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/django/test/selenium.py	<genexpr>!   s    
z/SeleniumTestCaseBase.__new__.<locals>.<genexpr>r   z0.0.0.0   Nz%s%s)browserhostexternal_host
__module__zNo browsers specified.)super__new__r   anyitemsbrowsersselenium_hubr   r   sysmodulesr   r   setattr__name__unittestskip)
clsr   basesattrsZ
test_classZfirst_browserr   moduler   Zbrowser_test_class	__class__r   r   r      s4   
zSeleniumTestCaseBase.__new__c                 C      t d| S )Nz)selenium.webdriver.%s.webdriver.WebDriverr
   r(   r   r   r   r   import_webdriverD      z%SeleniumTestCaseBase.import_webdriverc                 C   r.   )Nz%selenium.webdriver.%s.options.Optionsr
   r/   r   r   r   import_optionsH   r1   z#SeleniumTestCaseBase.import_optionsc                 C   s   ddl m} t|| S )Nr   )DesiredCapabilities)Z.selenium.webdriver.common.desired_capabilitiesr3   getattrupper)r(   r   r3   r   r   r   get_capabilityL   s   z#SeleniumTestCaseBase.get_capabilityc                 C   s\   |  | j }| jr,| j  dkrn dkrn n	  |d |S dkr,|d |S |S )Nchromeedgez--headless=newZfirefoxz	-headless)r2   r   headlessadd_argument)selfoptionsr   r   r   create_optionsR   s   

z#SeleniumTestCaseBase.create_optionsc                 C   sb   |   }| jr(ddlm} | | j D ]
\}}||| q|j| j|dS | 	| j|dS )Nr   )	webdriver)Zcommand_executorr<   )r<   )
r=   r!   seleniumr>   r6   r   r   Zset_capabilityZRemoter0   )r;   r<   r>   keyr   r   r   r   create_webdriver\   s   z%SeleniumTestCaseBase.create_webdriver)r%   r   __qualname__r    r!   r   r   r9   r   classmethodr0   r2   r6   r=   rA   __classcell__r   r   r,   r   r      s    *



r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )ChangeWindowSizec                 C   s   || _ ||f| _d S N)r?   new_size)r;   widthheightr?   r   r   r   __init__i   s   zChangeWindowSize.__init__c                 C   s   | j  | _| j j| j  | S rF   )r?   Zget_window_sizeold_sizeset_window_sizerG   r;   r   r   r   	__enter__m   s   zChangeWindowSize.__enter__c                 C   s   | j | jd | jd  d S )NrH   rI   )r?   rL   rK   )r;   exc_type	exc_value	tracebackr   r   r   __exit__r   s   zChangeWindowSize.__exit__N)r%   r   rB   rJ   rN   rR   r   r   r   r   rE   h   s    rE   r?   c                       s   e Zd ZdZdZdZe fddZedd Z	edd	 Z
e fd
dZedd Zedd Zedd Zedd Zedd ZdddddZedd Zdd Zedd Zedd  Z  ZS )!SeleniumTestCase
   NFc                    s   t  jdi | | jsd S t| j D ]A\}}t|dsqt| | t|dD ],}t	|||ddd}| d| |_
|j d| |_||_||_t| |j
| q)qd S )N_screenshot_cases)_func_casec                _   sF   t | |  || g|R i |W  d    S 1 sw   Y  d S rF   )r4   )r;   rV   rW   argskwargsr   r   r   r      s   $z0SeleniumTestCase.__init_subclass__.<locals>.test_r   )r   __init_subclass__screenshotslist__dict__r   hasattrdelattrr4   r   r%   rB   _screenshot_name_screenshot_caser$   )r(   rY   r   funcZscreenshot_caser   r,   r   r   r[   |   s"   

z"SeleniumTestCase.__init_subclass__c                 C   s   d| j p| j| jjf S )Nzhttp://%s:%s)r   r   Zserver_threadportr(   r   r   r   live_server_url   s   z SeleniumTestCase.live_server_urlc                 C   s   | j p| jS rF   )r   r   re   r   r   r   allowed_host   r1   zSeleniumTestCase.allowed_hostc                    s2   |   | _| j| j t   | | j d S rF   )rA   r?   implicitly_waitimplicit_waitr   
setUpClassZaddClassCleanup_quit_seleniumre   r,   r   r   rj      s   

zSeleniumTestCase.setUpClassc                 c   <    t dd| j d V  W d    d S 1 sw   Y  d S )Ni   i  rE   r?   rM   r   r   r   desktop_size      "zSeleniumTestCase.desktop_sizec                 c   rl   )Ni   i   rm   rM   r   r   r   small_screen_size   ro   z"SeleniumTestCase.small_screen_sizec                 c   rl   )Nih  i   rm   rM   r   r   r   mobile_size   ro   zSeleniumTestCase.mobile_sizec              	   c   sv    |   , ttjd d d V  W d    n1 sw   Y  W d    d S W d    d S 1 s4w   Y  d S )N)ZLANGUAGE_CODE)rn   r   r   ZLANGUAGES_BIDIrM   r   r   r   rtl   s   
"zSeleniumTestCase.rtlc              
   c   sp    | j | j | j d |   zd V  W | j d n| j d w W d    d S 1 s1w   Y  d S )Nz&localStorage.setItem('theme', 'dark');z!localStorage.removeItem('theme');)r?   getrf   Zexecute_scriptrn   rM   r   r   r   dark   s   
"zSeleniumTestCase.dark)mediafeaturesc                C   sR   | j dvr
| d i }|d ur||d< |d ur||d< | jjdd|dd d S )	N>   r7   r8   zEmulation.setEmulatedMedia is only supported on Chromium and Chrome-based browsers. See https://chromedevtools.github.io/devtools-protocol/1-3/Emulation/#method-setEmulatedMedia for more details.rv   rw   ZexecuteCdpCommandzEmulation.setEmulatedMedia)cmdparams)Zdriver_commandry   )r   ZskipTestr?   execute)r;   rv   rw   ry   r   r   r   set_emulated_media   s   

z#SeleniumTestCase.set_emulated_mediac                 c   sz    | j dddgd |  $ zd V  W | j dddgd n| j dddgd w W d    d S 1 s6w   Y  d S )Nzforced-colorsZactive)r   r   )rw   none)r{   rn   rM   r   r   r   high_contrast   s   



"zSeleniumTestCase.high_contrastc                 C   s`   | j sd S t| | j}|j d| d|j d}t d | }|jjddd | j	
| d S )Nz--z.pngr\   T)exist_okparents)r\   r4   Z_testMethodNamera   rb   r   cwdparentmkdirr?   Zsave_screenshot)r;   r   r   filenamepathr   r   r   take_screenshot   s   z SeleniumTestCase.take_screenshotc                 C   s   t | dr| j  d S d S )Nr?   )r_   r?   quitre   r   r   r   rk      s   
zSeleniumTestCase._quit_seleniumc              	   c   s:    | j d zdV  W | j | j dS | j | j w )z"Disable the default implicit wait.r   N)r?   rh   ri   rM   r   r   r   disable_implicit_wait   s
   "z&SeleniumTestCase.disable_implicit_wait)r%   r   rB   ri   r   r\   rC   r[   r	   rf   rg   rj   r   rn   rp   rq   rs   ru   r{   r}   r   rk   r   rD   r   r   r,   r   rS   v   s<    









	
rS   )	metaclassc                    s$   t  tr
 d  fdd}|S )N,c              	      s(    | _ t| ddht| dt  | S )NtagsZ
screenshot)rU   r$   unionr4   set)rc   method_namesr   r   wrapper  s   z!screenshot_cases.<locals>.wrapper)
isinstancestrsplit)r   r   r   r   r   screenshot_cases   s   

r   )r"   r&   
contextlibr   	functoolsr   pathlibr   Zdjango.confr   Zdjango.testr   r   r   Zdjango.utils.functionalr	   Zdjango.utils.module_loadingr   Zdjango.utils.textr   typer   rE   rS   r   r   r   r   r   <module>   s     Z 