
    iO%                         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m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 d dlmZ d d	lmZ d d
lmZ d dlmZ  ej4                  e      Z G d de      Zy)    N)ABCabstractmethod)Mapping)IOBase)PIPE)sleep)IOAny)request)URLError)WebDriverException)utilsc                   D   e Zd ZdZ	 	 	 	 	 ddedz  dedeez  ee   z  dz  deeef   dz  dedz  ddfd	Z	e
defd
       Zedee   fd       Ze
defd       Zej                   deddfd       ZddZddZdefdZddZddZddZddZdeddfdZdedz  fdZy)Servicea  Abstract base class for all service objects that manage driver processes.

    Services typically launch a child program in a new process as an interim process to
    communicate with a browser.

    Args:
        executable_path: (Optional) Install path of the executable.
        port: (Optional) Port for the service to run on, defaults to 0 where the operating system will decide.
        log_output: (Optional) int representation of STDOUT/DEVNULL, any IO instance or String path to file.
        env: (Optional) Mapping of environment variables for the new process, defaults to `os.environ`.
        driver_path_env_key: (Optional) Environment variable to use to get the path to the driver executable.
    Nexecutable_pathport
log_outputenvdriver_path_env_keyreturnc                    |  t        |t              rt        |dd      | _        nM|t        j
                  k(  rd | _        n2||t        j                  k(  rt        j                  | _        n|| _        |xs t        j                         | _	        |j                  di       | _        | j                  j                  dd      | _        |xs t        j                  | _        || _        | j#                         xs || _        y )Nza+zutf-8)encodingpopen_kwcreation_flagsr   )
isinstancestropenr   
subprocessSTDOUTDEVNULLr   	free_portr   popr   r   osenvironr   DRIVER_PATH_ENV_KEYenv_path_path)selfr   r   r   r   r   kwargss          ]/var/www/html/BatchJob/venv/lib/python3.12/site-packages/selenium/webdriver/common/service.py__init__zService.__init__4   s     	j#&":tgFDO:,,,"DO:1C1C#C(00DO(DO-EOO-	

:r2"mm//0@!D$"**#6 ]]_7
    c                 H    dt        j                  d| j                         S )zGets the url of the Service.zhttp://	localhost)r   join_host_portr   r(   s    r*   service_urlzService.service_urlO   s#     --k499EFGGr,   c                     t        d      )z7A List of program arguments (excluding the executable).z2This method needs to be implemented in a sub class)NotImplementedErrorr0   s    r*   command_line_argszService.command_line_argsT   s     ""VWWr,   c                 "    | j                   xs dS )N )r'   r0   s    r*   pathzService.pathY   s    zzRr,   valuec                 $    t        |      | _        y N)r   r'   )r(   r8   s     r*   r7   zService.path]   s    Z
r,   c                 *   | j                   t        d      | j                  | j                          d}	 | j                          | j	                         ryt        t        dd|z  z   d             |dz  }|dk(  rt        d	| j                          _)
zStarts the Service.

        Raises:
            WebDriverException: Raised either when it can't start the service
                or when it can't connect to the service
        NService path cannot be None.r   g{Gz?g?g      ?   F   zCan not connect to the Service )r'   r   _start_processassert_process_still_runningis_connectabler   min)r(   counts     r*   startzService.starta   s     ::$%CDDDJJ'--/""$#dTE\)3/0QJE{(+J4::,)WXX r,   c                 r    | j                   j                         }|rt        d| j                   d|       y)z1Check if the underlying process is still running.zService z' unexpectedly exited. Status code was: N)processpollr   r'   )r(   return_codes     r*   r@   z$Service.assert_process_still_runningw   s;    ll'')$x

|;bcnbo%pqq r,   c                 @    t        j                  | j                        S )a"  Check if the service is ready via the W3C WebDriver /status endpoint.

        This makes an HTTP request to the /status endpoint and verifies if it is ready to accept new sessions.

        Returns:
            True if the service is ready to accept new sessions, False otherwise.
        )r   is_url_connectabler   r0   s    r*   rA   zService.is_connectable}   s     ''		22r,   c                     	 t        j                  | j                   d       t	        d      D ]  }| j                         s yt        d       ! y# t        $ r Y yw xY w)zFDispatch an HTTP request to the shutdown endpoint to stop the service.z	/shutdownN   r=   )r   urlopenr1   r   rangerA   r   )r(   _s     r*   send_remote_shutdown_commandz$Service.send_remote_shutdown_command   s`    	OOt//0	:; r 	A&&(!H	  		s   "A 	AAc                    | j                   t        t        j                  hvrnt	        | j                   t
              r| j                   j                          n9t	        | j                   t              rt        j                  | j                          | j                  =| j                  j                         "	 | j                          | j                          yyy# t        $ r Y w xY w# | j                          w xY w)zStops the service.N)r   r   r   r    r   r   closeintr#   rF   rG   rP   	TypeError_terminate_processr0   s    r*   stopzService.stop   s    ??4););"<<$//62%%'DOOS1)<<#(9(9(;(C*113 '') )D#   '')s$   8C 	C'$C* &C''C* *C<c                 *   	 | j                   j                  | j                   j                  | j                   j                  }}}|||fD ]  }	 |j	                           | j                   j                          	 | j                   j                  d       y# t
        $ r Y Xw xY w# t        j                  $ r4 t        j                  dd       | j                   j                          Y yw xY w# t        $ r t        j                  dd       Y yw xY w)a#  Terminate the child process.

        On POSIX this attempts a graceful SIGTERM followed by a SIGKILL,
        on a Windows OS kill is an alias to terminate.  Terminating does
        not raise itself if something has gone wrong but (currently)
        silently ignores errors here.
        <   zTService process refused to terminate gracefully with SIGTERM, escalating to SIGKILL.T)exc_infoz"Error terminating service process.N)rF   stdinstdoutstderrrR   AttributeError	terminatewaitr   TimeoutExpiredloggererrorkillOSError)r(   rZ   r[   r\   streams        r*   rU   zService._terminate_process   s    	N""#### "6E
  / LLN
 LL""$$!!"%	 & 
 ,, $j!   !!#$  	NLL=LM	NsU   A
C/ BC/ :B% 	B"C/ !B""C/ %AC,)C/ +C,,C/ / DDc                 D    	 | j                          y # t        $ r Y y w xY wr:   )rV   	Exceptionr0   s    r*   __del__zService.__del__   s"    	IIK 		s    	r7   c                    |g}|j                  | j                                | j                  j                  dt        j
                  dk7        }	 d}t        j
                  dk(  rOt        j                         }t        j                  t        j                  z  |_
        t        j                  |_        t        j                  |f| j                  || j                  | j                  t         | j"                  |d| j                  | _        t&        j)                  d| j*                  | j$                  j,                  | j"                  | j                         y# t.        $ r  t0        $ rq}|j2                  t2        j4                  k(  rN| j*                  t7        d      t7        dt8        j:                  j=                  | j*                         d      | d}~ww xY w)	zyCreates a subprocess by executing the command provided.

        Args:
            path: full command to execute
        	close_fdswin32N)r   rj   r[   r\   rZ   creationflagsstartupinfozNStarted executable: `%s` in a child process with pid: %s using %s to output %sr<   'z(' executable may have wrong permissions.)extendr4   r   r"   sysplatformr   STARTUPINFOCREATE_NEW_CONSOLESTARTF_USESHOWWINDOWdwFlagsSW_HIDEwShowWindowPopenr   r   r   r   rF   ra   debugr'   pidrT   rd   errnoEACCESr   r#   r7   basename)r(   r7   cmdclose_file_descriptors
start_infoerrs         r*   r?   zService._start_process   s    f

4))+,!%!2!2;PW@W!X"	J||w&'335
%/%B%BZEdEd%d
")3););
&%++
HH0"11&
 --
DL LL`

  ##  	 	yyELL(::%,-KLL(((455]^ 	s   DE G,A,GGc                 \    | j                   r t        j                  | j                   d       S y r:   )r%   r#   getenvr0   s    r*   r&   zService.env_path   s%    ##99T55t<<r,   )Nr   NNN)r   N)__name__
__module____qualname____doc__r   rS   r	   r
   r   r+   propertyr1   r   listr4   r7   setterrD   r@   boolrA   rP   rV   rU   rh   r?   r&    r,   r*   r   r   &   sQ    '+15(,*.8t8 8 #I3'$.	8
 S#X%8 !4Z8 
86 HS H H X49 X X  c     
[[ #  $    Y,r3 3
* N>	+3 +4 +Z#* r,   r   )r{   loggingr#   r   rp   abcr   r   collections.abcr   ior   r   timer   typingr	   r
   urllibr   urllib.errorr   selenium.common.exceptionsr   selenium.webdriver.commonr   	getLoggerr   ra   r   r   r,   r*   <module>r      sT   $   	  
 # #      ! 9 +			8	$Wc Wr,   