
    Fth_                          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 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lmZ d d	lmZ d d
lmZ d dlmZ d dlmZ  ej        e          Z G d de          ZdS )    N)ABC)abstractmethod)IOBase)system)PIPE)sleep)request)URLError)WebDriverException)SubprocessStdAlias)utilsc                   \   e Zd ZdZ	 	 	 	 ddedededej        ej	        ej
        ej
        f                  ddf
d	Zedefd
            Zedej        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S )Servicea(  The abstract base class for all service objects.  Services typically
    launch a child program in a new process as an interim process to
    communicate with a browser.

    :param executable: install path of the executable.
    :param port: Port for the service to run on, defaults to 0 where the operating system will decide.
    :param log_output: (Optional) int representation of STDOUT/DEVNULL, any IO instance or String path to file.
    :param env: (Optional) Mapping of environment variables for the new process, defaults to `os.environ`.
    Nr   
executableport
log_outputenvreturnc                    t          |t                    rt          |dd          | _        nM|t          j        u rd | _        n7||t          j        u r t          t          j        d          | _        n|| _        || _	        |pt          j                    | _        |                    di           | _        | j                            dd          | _        |pt          j        | _        d S )Nza+zutf-8)encodingwbpopen_kwcreation_flagsr   )
isinstancestropenr   
subprocessSTDOUTDEVNULLosdevnull_pathr   	free_portr   popr   r   environr   )selfr   r   r   r   kwargss         u/var/www/html/mycamper/aliexpress-site/backend/venv/lib/python3.11/site-packages/selenium/webdriver/common/service.py__init__zService.__init__1   s     j#&& 	)":tgFFFDOO:,,,"DOO:1C#C#C"2:t44DOO(DO
-EO--	

:r22"m//0@!DD$"*    c                 <    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_urlI   s"     H-k49EEGGGr*   c                      t          d          )z7A List of program arguments (excluding the executable).z2This method needs to be implemented in a sub class)NotImplementedErrorr.   s    r(   command_line_argszService.command_line_argsN   s     ""VWWWr*   c                     | j         S N)r"   r.   s    r(   pathzService.pathS   s
    zr*   valuec                 .    t          |          | _        d S r4   )r   r"   )r&   r6   s     r(   r5   zService.pathW   s    ZZ


r*   c                     |                      | j                   d}	 |                                  |                                 rdS |dz  }t	          d           |dk    rt          d| j                   \)zStarts the Service.

        :Exceptions:
         - WebDriverException : Raised either when it can't start the service
           or when it can't connect to the service
        r   T   g      ?<   zCan not connect to the Service N)_start_processr"   assert_process_still_runningis_connectabler   r   )r&   counts     r(   startzService.start[   s     	DJ'''	Y--///""$$ QJE#JJJ{{()W4:)W)WXXX	Yr*   c                 p    | j                                         }|rt          d| j         d|           dS )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_runningo   sL    l'')) 	r$%p
%p%pcn%p%pqqq	r 	rr*   c                 4    t          j        | j                  S )zfEstablishes a socket connection to determine if the service running
        on the port is accessible.)r   r=   r   r.   s    r(   r=   zService.is_connectableu   s     #DI...r*   c                     	 t          j        | j         d           n# t          $ r Y dS w xY wt	          d          D ](}|                                 s dS t          d           )dS )zcDispatch an HTTP request to the shutdown endpoint for the service in
        an attempt to stop it.z	/shutdownN   r9   )r	   urlopenr/   r
   ranger=   r   )r&   _s     r(   send_remote_shutdown_commandz$Service.send_remote_shutdown_commandz   s    	Ot/:::;;;; 	 	 	FF	 r 	 	A&&(( !HHHH	 	s    
--c                 z   | j         t          k    rgt          | j         t                    r| j                                          n3t          | j         t
                    rt          j        | j                    | j        <	 |                                  n# t          $ r Y nw xY w| 
                                 dS dS )zStops the service.N)r   r   r   r   closeintr    rA   rJ   	TypeError_terminate_processr.   s    r(   stopzService.stop   s     ?d""$/622 *%%''''DOS11 *)))<#113333   ##%%%%% $#s    B 
B"!B"c                    	 | j         j        | j         j        | j         j        }}}|||fD ]'}	 |                                 # t
          $ r Y $w xY w| j                                          	 | j                             d           dS # t          j	        $ r9 t                              dd           | j                                          Y dS w xY w# t          $ r  t                              dd           Y dS 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.
        r:   zTService process refused to terminate gracefully with SIGTERM, escalating to SIGKILL.T)exc_infoz"Error terminating service process.N)rA   stdinstdoutstderrrL   AttributeError	terminatewaitr   TimeoutExpiredloggererrorkillOSError)r&   rS   rT   rU   streams        r(   rO   zService._terminate_process   sB   	N$(L$68KT\M`66E/  LLNNNN%   DL""$$$$!!"%%%%%, $ $ $j!     !!######$  	N 	N 	NLL=LMMMMMM	NsS   +C AC 
AC AC -B	 	ACC CC &C>=C>c                 R    	 |                                   d S # t          $ r Y d S w xY wr4   )rP   	Exceptionr.   s    r(   __del__zService.__del__   s:    	IIKKKKK 	 	 	DD	s    
&&r5   c                    |g}|                     |                                            | j                            dt	                      dk              }	 d}t	                      dk    rBt          j                    }t
          j        t
          j        z  |_	        t
          j
        |_        t          j        |f| j        || j        | j        t          | j        |d| j        | _        t$                              d| j        | j        j                   dS # t,          $ r  t.          $ rQ}|j        t0          j        k    r6t5          dt6          j                            | j                   d          | d}~ww xY w)zmCreates a subprocess by executing the command provided.

        :param cmd: full command to execute
        	close_fdsWindowsN)r   rc   rT   rU   rS   creationflagsstartupinfoz8Started executable: `%s` in a child process with pid: %s'z(' executable may have wrong permissions.)extendr2   r   r$   r   r   STARTUPINFOCREATE_NEW_CONSOLESTARTF_USESHOWWINDOWdwFlagsSW_HIDEwShowWindowPopenr   r   r   r   rA   rZ   debugr"   pidrN   r]   errnoEACCESr   r    r5   basename)r&   r5   cmdclose_file_descriptors
start_infoerrs         r(   r;   zService._start_process   s   
 f

4))++,,,!%!2!2;I@U!V!V	Jxx9$$'355
%/%BZEd%d
")3);
&%+
H0"1&
 
 -
 
DL LLSUYU_aeamaqrrrrr 	 	 	 	 	 	yEL(((^((44^^^  	s   B>D E<+AE77E<)Nr   NN)r   N)__name__
__module____qualname____doc__r   rM   r   typingOptionalMappingAnyr)   propertyr/   r   Listr2   r5   setterr?   r<   boolr=   rJ   rP   rO   ra   r;    r*   r(   r   r   &   s         )-GK% %% % '	%
 _V^FJ
,BCD% 
% % % %0 HS H H H XH X6;s#3 X X X ^X c    X 
[ #  $       [ Y Y Y Y(r r r r/ / / / /
   & & & & N N N N6	 	 	 	"3 "4 " " " " " "r*   r   )rr   loggingr    r   r}   abcr   r   ior   platformr   r   timer   urllibr	   urllib.errorr
   selenium.common.exceptionsr   selenium.typesr   selenium.webdriver.commonr   	getLoggerry   rZ   r   r   r*   r(   <module>r      sM  "   				                                                ! ! ! ! ! ! 9 9 9 9 9 9 - - - - - - + + + + + +		8	$	$y y y y yc y y y y yr*   