a
    5ñ»jÓ  ã                   @   s^   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 G dd„ dƒZ
dS )é    N)ÚSeleniumManagerc                       sz   e Zd ZdZddd„Zdd„ Zd	d
„ Z‡ fdd„Z‡ fdd„Zdd„ Z	dd„ Z
ddd„Zddd„Zdd„ Zdd„ Z‡  ZS )ÚServeraÑ  Manage a Selenium Grid (Remote) Server in standalone mode.

    This class contains functionality for downloading the server and starting/stopping it.

    For more information on Selenium Grid, see:
        - https://www.selenium.dev/documentation/grid/getting_started/

    Parameters:
    -----------
    host : str
        Hostname or IP address to bind to (determined automatically if not specified)
    port : int or str
        Port to listen on (4444 if not specified)
    path : str
        Path/filename of existing server .jar file (Selenium Manager is used if not specified)
    version : str
        Version of server to download (latest version if not specified)
    log_level : str
        Logging level to control logging output ("INFO" if not specified)
        Available levels: "SEVERE", "WARNING", "INFO", "CONFIG", "FINE", "FINER", "FINEST"
    env: collections.abc.Mapping
        Mapping that defines the environment variables for the server process
    Né\  ÚINFOc                 C   sf   |r|rt dƒ‚|| _|  |¡| _|  |¡| _|  |¡| _|  |¡| _	|  
|¡| _d | _|  ¡ | _d S )NzCNot allowed to specify a version when using an existing server path)Ú	TypeErrorÚhostÚ_validate_portÚportÚ_validate_pathÚpathÚ_validate_versionÚversionÚ_validate_log_levelÚ	log_levelÚ_validate_envÚenvÚprocessÚ_get_status_urlÚ
status_url)Úselfr   r	   r   r   r   r   © r   úFE:\soccer\ml_env\Lib\site-packages\selenium/webdriver/remote/server.pyÚ__init__7   s    zServer.__init__c                 C   s(   | j d ur| j nd}d|› d| j› d�S )NÚ	localhostzhttp://ú:z/status)r   r	   )r   r   r   r   r   r   E   s    zServer._get_status_urlc                 C   s"   |rt j |¡std|› �ƒ‚|S )Nz"Can't find server .jar located at )Úosr   ÚexistsÚOSError)r   r   r   r   r   r
   I   s    zServer._validate_pathc                    sX   zt |ƒ}W n( ty4   tˆ j› d|› d�ƒ‚Y n0 d|  krJdksTn tdƒ‚|S )Nz".__init__() got an invalid port: 'ú'r   iÿÿ  zport must be 0-65535)ÚintÚ
ValueErrorr   Ú__name__)r   r	   ©Ú	__class__r   r   r   N   s    zServer._validate_portc                    s.   |r*t  dt|ƒ¡s*tˆ j› d|› d�ƒ‚|S )Nz^\d+\.\d+\.\d+$z%.__init__() got an invalid version: 'r   )ÚreÚmatchÚstrr   r!   )r   r   r"   r   r   r   W   s    zServer._validate_versionc                 C   s$   d}||vr t dd |¡› �ƒ‚|S )N)ZSEVEREÚWARNINGr   ZCONFIGZFINEZFINERZFINESTzlog_level must be one of: z, )r   Újoin)r   r   Zlevelsr   r   r   r   ]   s    zServer._validate_log_levelc                 C   s"   |d urt |tjjƒstdƒ‚|S )Nz.env must be a mapping of environment variables)Ú
isinstanceÚcollectionsÚabcÚMappingr   )r   r   r   r   r   r   c   s    zServer._validate_envé
   c                 C   sT   t   ¡ }t   ¡ | |k rPztj | j¡ W dS  tjjyL   t  d¡ Y q0 qdS )NTgš™™™™™É?F)ÚtimeÚurllibÚrequestÚurlopenr   ÚerrorÚURLErrorÚsleep)r   ÚtimeoutÚstartr   r   r   Ú_wait_for_serverh   s    zServer._wait_for_serverc                 C   s(   dg}|dur|  |¡ tƒ  |¡d S )zqDownload the server if it doesn't already exist.

        Latest version is downloaded unless specified.
        z--gridNZdriver_path)Úappendr   Zbinary_paths)r   r   Úargsr   r   r   Údownload_if_neededr   s    
zServer.download_if_neededc                 C   sF  | j du r|  | j¡n| j }t d¡}|du r6tdƒ‚|d|ddt| jƒd| jdd	d
d	g}| j	durt| 
d| j	g¡ | j	dur„| j	nd}zTt tjtj¡� }| || jf¡ W d  ƒ n1 sÀ0    Y  td| j› �ƒ‚W nb t�y>   tdƒ tj|| jd�| _td| jj› �ƒ |  ¡ �s2td| j› �ƒ‚tdƒ Y n0 | jS )z¨Start the server.

        Selenium Manager will detect the server location and download it if necessary,
        unless an existing server path was specified.
        NÚjavazJCan't find java on system PATH. JRE is required to run the Selenium serverz-jarÚ
standalonez--portz--log-levelz--selenium-managerÚtruez--enable-managed-downloadsz--hostr   zDSelenium server is already running, or something else is using port zStarting Selenium server...)r   z$Selenium server running as process: z)Timed out waiting for Selenium server at zSelenium server is ready)r   r:   r   ÚshutilÚwhichr   r&   r	   r   r   ÚextendÚsocketÚAF_INETÚSOCK_STREAMÚconnectÚConnectionErrorÚConnectionRefusedErrorÚprintÚ
subprocessÚPopenr   r   Úpidr7   ÚTimeoutErrorr   )r   r   Z	java_pathÚcommandr   Úsockr   r   r   r6   |   s@    
ô
.
zServer.startc                 C   sH   | j du rtdƒ‚n0| j  ¡ du r6| j  ¡  | j  ¡  d| _ tdƒ dS )zStop the server.NzSelenium server isn't runningz#Selenium server has been terminated)r   ÚRuntimeErrorÚpollÚ	terminateÚwaitrG   )r   r   r   r   Ústop¨   s    



zServer.stop)Nr   NNr   N)r-   )N)r!   Ú
__module__Ú__qualname__Ú__doc__r   r   r
   r   r   r   r   r7   r:   r6   rR   Ú__classcell__r   r   r"   r   r      s   
	



,r   )r*   r   r$   r>   rA   rH   r.   r/   Z*selenium.webdriver.common.selenium_managerr   r   r   r   r   r   Ú<module>   s   