a
    ¾Ê.c&#  ã                   @   sv   d dl Z d dlmZ d dlmZ d dlmZ d dlmZ ddl	m
Z
 dd	„ ZG d
d„ dƒZG dd„ dƒZe e¡ dS )é    N)ÚWebDriverException)ÚBy)Ú	WebDriver)Ú
WebElementé   )ÚAbstractEventListenerc                    sF   t | tƒr| S t | tƒr"t| ˆ ƒS t | tƒr>‡ fdd„| D ƒS | S d S )Nc                    s   g | ]}t |ˆ ƒ‘qS © )Ú_wrap_elements©Ú.0Úitem©Ú	ef_driverr   úk/var/www/brookimports/venv/lib/python3.9/site-packages/selenium/webdriver/support/event_firing_webdriver.pyÚ
<listcomp>!   ó    z"_wrap_elements.<locals>.<listcomp>)Ú
isinstanceÚEventFiringWebElementr   Úlist)Úresultr   r   r   r   r	      s    



r	   c                   @   s¶   e Zd ZdZdd„ Zedd„ ƒZdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zejdfedœdd„Zejdfeje dœdd„Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ ZdS )$ÚEventFiringWebDriverzW
    A wrapper around an arbitrary WebDriver instance which supports firing events
    c                 C   s>   t |tƒstdƒ‚t |tƒs$tdƒ‚|| _| j| j_|| _dS )ae  
        Creates a new instance of the EventFiringWebDriver

        :Args:
         - driver : A WebDriver instance
         - event_listener : Instance of a class that subclasses AbstractEventListener and implements it fully or partially

        Example:

        ::

            from selenium.webdriver import Firefox
            from selenium.webdriver.support.events import EventFiringWebDriver, AbstractEventListener

            class MyListener(AbstractEventListener):
                def before_navigate_to(self, url, driver):
                    print("Before navigate to %s" % url)
                def after_navigate_to(self, url, driver):
                    print("After navigate to %s" % url)

            driver = Firefox()
            ef_driver = EventFiringWebDriver(driver, MyListener())
            ef_driver.get("http://www.google.co.in/")
        z%A WebDriver instance must be suppliedz:Event listener must be a subclass of AbstractEventListenerN)r   r   r   r   Ú_driverÚ_wrap_valueÚ	_listener)ÚselfZdriverZevent_listenerr   r   r   Ú__init__,   s    


zEventFiringWebDriver.__init__c                 C   s   | j S )zDReturns the WebDriver instance wrapped by this EventsFiringWebDriver)r   ©r   r   r   r   Úwrapped_driverM   s    z#EventFiringWebDriver.wrapped_driverc                 C   s   |   d|| jfd|f¡ d S )NZnavigate_toÚget©Ú	_dispatchr   )r   Úurlr   r   r   r   R   s    zEventFiringWebDriver.getc                 C   s   |   d| jfdd¡ d S )NZnavigate_backÚbackr   r   r   r   r   r   r"   U   s    zEventFiringWebDriver.backc                 C   s   |   d| jfdd¡ d S )NZnavigate_forwardÚforwardr   r   r   r   r   r   r#   X   s    zEventFiringWebDriver.forwardc                 G   s&   |f|   |¡ }|  d|| jfd|¡S )NÚexecute_script©Ú_unwrap_element_argsr    r   ©r   ÚscriptÚargsZunwrapped_argsr   r   r   r$   [   s    z#EventFiringWebDriver.execute_scriptc                 G   s&   |f|   |¡ }|  d|| jfd|¡S )Nr$   Úexecute_async_scriptr%   r'   r   r   r   r*   _   s    z)EventFiringWebDriver.execute_async_scriptc                 C   s   |   d| jfdd¡ d S )NÚcloser   r   r   r   r   r   r+   c   s    zEventFiringWebDriver.closec                 C   s   |   d| jfdd¡ d S )NÚquitr   r   r   r   r   r   r,   f   s    zEventFiringWebDriver.quitN©Úreturnc                 C   s   |   d||| jfd||f¡S ©NÚfindÚfind_elementr   ©r   ZbyÚvaluer   r   r   r1   i   s    z!EventFiringWebDriver.find_elementc                 C   s   |   d||| jfd||f¡S ©Nr0   Úfind_elementsr   r2   r   r   r   r5   l   s    z"EventFiringWebDriver.find_elementsc              
   C   s~   t | jd| ƒ|Ž  zt | j|ƒ|Ž }W n6 ty^ } z| j || j¡ ‚ W Y d }~n
d }~0 0 t | jd| ƒ|Ž  t|| ƒS ©Nz	before_%szafter_%s)Úgetattrr   r   Ú	ExceptionÚon_exceptionr	   ©r   Zl_callZl_argsZd_callZd_argsr   Úer   r   r   r    o   s    zEventFiringWebDriver._dispatchc                    sT   t |tƒr|jS t |tƒr0t‡ fdd„|D ƒƒS t |tƒrL‡ fdd„|D ƒS |S d S )Nc                 3   s   | ]}ˆ   |¡V  qd S ©N©r&   r
   r   r   r   Ú	<genexpr>}   r   z<EventFiringWebDriver._unwrap_element_args.<locals>.<genexpr>c                    s   g | ]}ˆ   |¡‘qS r   r=   r
   r   r   r   r      r   z=EventFiringWebDriver._unwrap_element_args.<locals>.<listcomp>)r   r   Úwrapped_elementÚtupler   )r   r)   r   r   r   r&   y   s    


z)EventFiringWebDriver._unwrap_element_argsc                 C   s(   t |tƒrt | j|j¡S t | j|¡S r<   )r   r   r   r   r   r?   ©r   r3   r   r   r   r   ƒ   s    
z EventFiringWebDriver._wrap_valuec              
   C   sv   |  d¡st| j|ƒs&t | ||¡ nLzt | j||¡ W n6 typ } z| j || j¡ ‚ W Y d }~n
d }~0 0 d S ©NÚ_)Ú
startswithÚhasattrr   ÚobjectÚ__setattr__r8   r   r9   ©r   r   r3   r;   r   r   r   rG   ˆ   s    z EventFiringWebDriver.__setattr__c              
      sh   ‡ ‡fdd„}zt ˆj|ƒ‰ tˆ ƒr(|nˆ W S  tyb } zˆj |ˆj¡ ‚ W Y d }~n
d }~0 0 d S )Nc               
      sV   zˆ | i |¤Ž}t |ˆƒW S  tyP } zˆj |ˆj¡ ‚ W Y d }~n
d }~0 0 d S r<   )r	   r8   r   r9   r   ©r)   Úkwargsr   r;   ©Úattribr   r   r   Ú_wrap“   s    z/EventFiringWebDriver.__getattr__.<locals>._wrap)r7   r   Úcallabler8   r   r9   ©r   ÚnamerM   r;   r   rK   r   Ú__getattr__’   s    z EventFiringWebDriver.__getattr__)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úpropertyr   r   r"   r#   r$   r*   r+   r,   r   ÚIDr   r1   ÚtypingÚListr5   r    r&   r   rG   rQ   r   r   r   r   r   '   s$   !



r   c                   @   s†   e Zd ZdZdd„ Zedd„ ƒZdd„ Zdd	„ Zd
d„ Z	e
jdfedœdd„Ze
jdfeje dœdd„Zdd„ Zdd„ Zdd„ ZdS )r   zL"
    A wrapper around WebElement instance which supports firing events
    c                 C   s    || _ || _|j| _|j| _dS )zE
        Creates a new instance of the EventFiringWebElement
        N)Ú_webelementÚ
_ef_driverr   r   r   )r   Z
webelementr   r   r   r   r   ¨   s    zEventFiringWebElement.__init__c                 C   s   | j S )zEReturns the WebElement wrapped by this EventFiringWebElement instance)rZ   r   r   r   r   r?   ±   s    z%EventFiringWebElement.wrapped_elementc                 C   s   |   d| j| jfdd¡ d S )NÚclickr   ©r    rZ   r   r   r   r   r   r\   ¶   s    zEventFiringWebElement.clickc                 C   s   |   d| j| jfdd¡ d S )NÚchange_value_ofÚclearr   r]   r   r   r   r   r_   ¹   s    zEventFiringWebElement.clearc                 G   s   |   d| j| jfd|¡ d S )Nr^   Ú	send_keysr]   rA   r   r   r   r`   ¼   s    zEventFiringWebElement.send_keysNr-   c                 C   s   |   d||| jfd||f¡S r/   r   r2   r   r   r   r1   ¿   s    z"EventFiringWebElement.find_elementc                 C   s   |   d||| jfd||f¡S r4   r   r2   r   r   r   r5   Â   s    z#EventFiringWebElement.find_elementsc              
   C   s€   t | jd| ƒ|Ž  zt | j|ƒ|Ž }W n6 ty^ } z| j || j¡ ‚ W Y d }~n
d }~0 0 t | jd| ƒ|Ž  t|| jƒS r6   )r7   r   rZ   r8   r9   r   r	   r[   r:   r   r   r   r    Å   s    zEventFiringWebElement._dispatchc              
   C   sv   |  d¡st| j|ƒs&t | ||¡ nLzt | j||¡ W n6 typ } z| j || j¡ ‚ W Y d }~n
d }~0 0 d S rB   )	rD   rE   rZ   rF   rG   r8   r   r9   r   rH   r   r   r   rG   Ï   s    z!EventFiringWebElement.__setattr__c              
      sh   ‡ ‡fdd„}zt ˆj|ƒ‰ tˆ ƒr(|nˆ W S  tyb } zˆj |ˆj¡ ‚ W Y d }~n
d }~0 0 d S )Nc               
      sX   zˆ | i |¤Ž}t |ˆjƒW S  tyR } zˆj |ˆj¡ ‚ W Y d }~n
d }~0 0 d S r<   )r	   r[   r8   r   r9   r   rI   rK   r   r   rM   Ú   s    z0EventFiringWebElement.__getattr__.<locals>._wrap)r7   rZ   rN   r8   r   r9   r   rO   r   rK   r   rQ   Ù   s    z!EventFiringWebElement.__getattr__)rR   rS   rT   rU   r   rV   r?   r\   r_   r`   r   rW   r   r1   rX   rY   r5   r    rG   rQ   r   r   r   r   r   £   s   	


r   )rX   Zselenium.common.exceptionsr   Zselenium.webdriver.common.byr   Z#selenium.webdriver.remote.webdriverr   Z$selenium.webdriver.remote.webelementr   Zabstract_event_listenerr   r	   r   r   Úregisterr   r   r   r   Ú<module>   s   |H