B
     hN                 @   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yd dlmZ W n ek
r\   d dl	ZY nX 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eZG dd	 d	eZdS )
    N)parse)utils)__version__   )Command)	ErrorCodec               @   sd   e Zd ZdZejZedd Zedd Z	edd Z
edd	d
ZdddZdd ZdddZdS )RemoteConnectionzA connection with the Remote WebDriver server.

    Communicates with the server using the WebDriver wire protocol:
    https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocolc             C   s   | j tjkrdS | j S )zt
        :Returns:
            Timeout value in seconds for all http requests made to the Remote Connection
        N)_timeoutsocket_GLOBAL_DEFAULT_TIMEOUT)cls r   hC:\Users\sanjo\AppData\Local\Qlobot\Launcher\ext_packages\selenium\webdriver\remote\remote_connection.pyget_timeout0   s    zRemoteConnection.get_timeoutc             C   s
   || _ dS )z
        Override the default timeout

        :Args:
            - timeout - timeout value for http requests in seconds
        N)r	   )r   timeoutr   r   r   set_timeout8   s    zRemoteConnection.set_timeoutc             C   s   t j| _dS )zR
        Reset the http request timeout to socket._GLOBAL_DEFAULT_TIMEOUT
        N)r
   r   r	   )r   r   r   r   reset_timeoutB   s    zRemoteConnection.reset_timeoutFc             C   st   t   }|dkrd}dddt|d}|jr^td| }|	dd	|
 i |rp|	d
di |S )z
        Get headers for remote request.

        :Args:
         - parsed_url - The parsed url
         - keep_alive (Boolean) - Is this a keep-alive connection (default: False)
        darwinZmaczapplication/jsonzapplication/json;charset=UTF-8zselenium/{} (python {}))AcceptzContent-Typez
User-Agentz{0.username}:{0.password}AuthorizationzBasic {}
Connectionz
keep-alive)platformsystemlowerformatr   usernamebase64	b64encodeencodeupdatedecode)r   
parsed_url
keep_aliver   headersZbase64stringr   r   r   get_remote_connection_headersI   s    

z.RemoteConnection.get_remote_connection_headersTc       	      C   s  || _ t|}|jr|r|jp"d }|jdkr6|j}n<|rbt||jsbd }t	d
||j ntj|j|d}|r|}|jrt||j}|jr|j}|jr|d|j 7 }d||f }t|j||j|j|j|jf}nt	d|j  || _|rtj| jd| _tjdtjd	tjd
tjdtjdtjdtj dtj!dtj"dtj#dtj$dtj%dtj&dtj'dtj(dtj)dtj*dtj+dtj,dtj-dtj.dtj/dtj0dtj1dtj2d tj3d!tj4d"tj5d#tj6d$tj7d%tj8d&tj9d'tj:d(tj;d)tj<d*tj=d+tj>d,tj?d-tj@d.tjAd/tjBd0tjCd1tjDd2tjEd3tjFd4tjGd5tjHd6tjId7tjJd8tjKd9tjLd:tjMd;tjNd<tjOd=tjPd>tjQd?tjRd@tjSdAtjTdBtjUdCtjVdDtjWdEtjXdFtjYdGtjZdHtj[dItj\dJtj]dKtj^dLtj_dMtj`dNtjadOtjbdPtjcdQtjddRtjedStjfdTtjgdUtjhdVtjidWtjjdXtjkdYtjldZtjmd[tjnd\tjod]tjpd^tjqd_tjrd`tjsdatjtdbtjudctjvddtjwdetjxdftjydgtjzdhtj{ditj|djtj}dktj~dltjdmtjdntjdotjdptjdqtjdrtjdstjdttjdutjdvtjdwtjdxtjdytjdztjd{tjd|tjd}tjd~tjdix| _d S )Nhttpsz'Could not connect to port {} on host {})portz:%sz%s@%sz%Could not get IP address for host: %s)r   )GETz/status)POSTz/session)r'   z	/sessions)DELETEz/session/$sessionId)r'   z!/session/$sessionId/window_handle)r'   z/session/$sessionId/window)r'   z"/session/$sessionId/window_handles)r'   z"/session/$sessionId/window/handles)r(   z/session/$sessionId/url)r(   z/session/$sessionId/forward)r(   z/session/$sessionId/back)r(   z/session/$sessionId/refresh)r(   z/session/$sessionId/execute)r(   z /session/$sessionId/execute/sync)r(   z!/session/$sessionId/execute/async)r'   z/session/$sessionId/url)r'   z/session/$sessionId/title)r'   z/session/$sessionId/source)r'   z/session/$sessionId/screenshot)r'   z*/session/$sessionId/element/$id/screenshot)r(   z/session/$sessionId/element)r(   z/session/$sessionId/elements)r'   z"/session/$sessionId/element/active)r(   z"/session/$sessionId/element/active)r(   z'/session/$sessionId/element/$id/element)r(   z(/session/$sessionId/element/$id/elements)r(   z%/session/$sessionId/element/$id/click)r(   z%/session/$sessionId/element/$id/clear)r(   z&/session/$sessionId/element/$id/submit)r'   z$/session/$sessionId/element/$id/text)r(   z%/session/$sessionId/element/$id/value)r(   z/session/$sessionId/keys)r(   z/session/$sessionId/file)r'   z%/session/$sessionId/element/$id/value)r'   z$/session/$sessionId/element/$id/name)r'   z(/session/$sessionId/element/$id/selected)r(   z(/session/$sessionId/element/$id/selected)r'   z'/session/$sessionId/element/$id/enabled)r'   z)/session/$sessionId/element/$id/displayed)r'   z(/session/$sessionId/element/$id/location)r'   z0/session/$sessionId/element/$id/location_in_view)r'   z$/session/$sessionId/element/$id/size)r'   z$/session/$sessionId/element/$id/rect)r'   z//session/$sessionId/element/$id/attribute/$name)r'   z./session/$sessionId/element/$id/property/$name)r'   z/session/$sessionId/cookie)r(   z/session/$sessionId/cookie)r'   z /session/$sessionId/cookie/$name)r)   z/session/$sessionId/cookie)r)   z /session/$sessionId/cookie/$name)r(   z/session/$sessionId/frame)r(   z /session/$sessionId/frame/parent)r(   z/session/$sessionId/window)r)   z/session/$sessionId/window)r'   z1/session/$sessionId/element/$id/css/$propertyName)r(   z*/session/$sessionId/timeouts/implicit_wait)r(   z!/session/$sessionId/execute_async)r(   z)/session/$sessionId/timeouts/async_script)r(   z/session/$sessionId/timeouts)r(   z!/session/$sessionId/dismiss_alert)r(   z!/session/$sessionId/alert/dismiss)r(   z /session/$sessionId/accept_alert)r(   z /session/$sessionId/alert/accept)r(   z/session/$sessionId/alert_text)r(   z/session/$sessionId/alert/text)r'   z/session/$sessionId/alert_text)r'   z/session/$sessionId/alert/text)r(   z%/session/$sessionId/alert/credentials)r(   z/session/$sessionId/click)r(   z/session/$sessionId/actions)r)   z/session/$sessionId/actions)r(   z/session/$sessionId/doubleclick)r(   z/session/$sessionId/buttondown)r(   z/session/$sessionId/buttonup)r(   z/session/$sessionId/moveto)r'   z-/session/$sessionId/window/$windowHandle/size)r(   z-/session/$sessionId/window/$windowHandle/size)r'   z1/session/$sessionId/window/$windowHandle/position)r(   z1/session/$sessionId/window/$windowHandle/position)r(   z/session/$sessionId/window/rect)r'   z/session/$sessionId/window/rect)r(   z1/session/$sessionId/window/$windowHandle/maximize)r(   z#/session/$sessionId/window/maximize)r(   z/session/$sessionId/orientation)r'   z/session/$sessionId/orientation)r(   z/session/$sessionId/touch/click)r(   z/session/$sessionId/touch/down)r(   z/session/$sessionId/touch/up)r(   z/session/$sessionId/touch/move)r(   z /session/$sessionId/touch/scroll)r(   z%/session/$sessionId/touch/doubleclick)r(   z#/session/$sessionId/touch/longclick)r(   z/session/$sessionId/touch/flick)r(   z/session/$sessionId/execute_sql)r'   z/session/$sessionId/location)r(   z/session/$sessionId/location)r'   z%/session/$sessionId/application_cache)r'   z,/session/$sessionId/application_cache/status)r)   z+/session/$sessionId/application_cache/clear)r'   z&/session/$sessionId/network_connection)r(   z&/session/$sessionId/network_connection)r'   z*/session/$sessionId/local_storage/key/$key)r)   z*/session/$sessionId/local_storage/key/$key)r'   z!/session/$sessionId/local_storage)r(   z!/session/$sessionId/local_storage)r)   z!/session/$sessionId/local_storage)r'   z&/session/$sessionId/local_storage/size)r'   z,/session/$sessionId/session_storage/key/$key)r)   z,/session/$sessionId/session_storage/key/$key)r'   z#/session/$sessionId/session_storage)r(   z#/session/$sessionId/session_storage)r)   z#/session/$sessionId/session_storage)r'   z(/session/$sessionId/session_storage/size)r(   z/session/$sessionId/log)r'   z/session/$sessionId/log/types)r'   z/session/$sessionId/context)r'   z/session/$sessionId/contexts)r(   z/session/$sessionId/context)r(   z%/session/$sessionId/window/fullscreen)r(   z#/session/$sessionId/window/minimize)r"   r   urlparsehostnamer&   schemecommon_utilsis_connectableLOGGERinfor   find_connectable_ipjoin_host_portr   password
urlunparsepathparamsqueryfragment_urlurllib3PoolManagerr	   _connr   STATUSNEW_SESSIONGET_ALL_SESSIONSQUITGET_CURRENT_WINDOW_HANDLEW3C_GET_CURRENT_WINDOW_HANDLEGET_WINDOW_HANDLESW3C_GET_WINDOW_HANDLESr'   
GO_FORWARDGO_BACKREFRESHEXECUTE_SCRIPTW3C_EXECUTE_SCRIPTW3C_EXECUTE_SCRIPT_ASYNCGET_CURRENT_URL	GET_TITLEGET_PAGE_SOURCE
SCREENSHOTELEMENT_SCREENSHOTFIND_ELEMENTFIND_ELEMENTSW3C_GET_ACTIVE_ELEMENTGET_ACTIVE_ELEMENTFIND_CHILD_ELEMENTFIND_CHILD_ELEMENTSCLICK_ELEMENTCLEAR_ELEMENTSUBMIT_ELEMENTGET_ELEMENT_TEXTSEND_KEYS_TO_ELEMENTSEND_KEYS_TO_ACTIVE_ELEMENTUPLOAD_FILEGET_ELEMENT_VALUEGET_ELEMENT_TAG_NAMEIS_ELEMENT_SELECTEDSET_ELEMENT_SELECTEDIS_ELEMENT_ENABLEDIS_ELEMENT_DISPLAYEDGET_ELEMENT_LOCATION,GET_ELEMENT_LOCATION_ONCE_SCROLLED_INTO_VIEWGET_ELEMENT_SIZEGET_ELEMENT_RECTGET_ELEMENT_ATTRIBUTEGET_ELEMENT_PROPERTYGET_ALL_COOKIES
ADD_COOKIE
GET_COOKIEDELETE_ALL_COOKIESDELETE_COOKIESWITCH_TO_FRAMESWITCH_TO_PARENT_FRAMESWITCH_TO_WINDOWCLOSE!GET_ELEMENT_VALUE_OF_CSS_PROPERTYIMPLICIT_WAITEXECUTE_ASYNC_SCRIPTSET_SCRIPT_TIMEOUTSET_TIMEOUTSDISMISS_ALERTW3C_DISMISS_ALERTACCEPT_ALERTW3C_ACCEPT_ALERTSET_ALERT_VALUEW3C_SET_ALERT_VALUEGET_ALERT_TEXTW3C_GET_ALERT_TEXTSET_ALERT_CREDENTIALSCLICKW3C_ACTIONSW3C_CLEAR_ACTIONSDOUBLE_CLICK
MOUSE_DOWNMOUSE_UPMOVE_TOGET_WINDOW_SIZESET_WINDOW_SIZEGET_WINDOW_POSITIONSET_WINDOW_POSITIONSET_WINDOW_RECTGET_WINDOW_RECTMAXIMIZE_WINDOWW3C_MAXIMIZE_WINDOWSET_SCREEN_ORIENTATIONGET_SCREEN_ORIENTATION
SINGLE_TAP
TOUCH_DOWNTOUCH_UP
TOUCH_MOVETOUCH_SCROLL
DOUBLE_TAP
LONG_PRESSFLICKEXECUTE_SQLGET_LOCATIONSET_LOCATIONGET_APP_CACHEGET_APP_CACHE_STATUSCLEAR_APP_CACHEGET_NETWORK_CONNECTIONSET_NETWORK_CONNECTIONGET_LOCAL_STORAGE_ITEMREMOVE_LOCAL_STORAGE_ITEMGET_LOCAL_STORAGE_KEYSSET_LOCAL_STORAGE_ITEMCLEAR_LOCAL_STORAGEGET_LOCAL_STORAGE_SIZEGET_SESSION_STORAGE_ITEMREMOVE_SESSION_STORAGE_ITEMGET_SESSION_STORAGE_KEYSSET_SESSION_STORAGE_ITEMCLEAR_SESSION_STORAGEGET_SESSION_STORAGE_SIZEGET_LOGGET_AVAILABLE_LOG_TYPESCURRENT_CONTEXT_HANDLECONTEXT_HANDLESSWITCH_TO_CONTEXTFULLSCREEN_WINDOWMINIMIZE_WINDOW	_commands)	selfremote_server_addrr"   Z
resolve_ipr!   r&   ipnetlocauthr   r   r   __init__j   s   





zRemoteConnection.__init__c             C   s   | j | }|dk	std| t|d |}t| drZ| jrZt|trZd|krZ|d= t	
|}d| j|f }| j|d ||dS )	au  
        Send a command to the remote server.

        Any path subtitutions required for the URL mapped to the command should be
        included in the command parameters.

        :Args:
         - command - A string specifying the command to execute.
         - params - A dictionary of named parameters to send with the command as
           its JSON payload.
        NzUnrecognised command %sr   w3c	sessionIdz%s%sr   )body)r   AssertionErrorstringTemplate
substitutehasattrr   
isinstancedictr   Z	dump_jsonr9   _request)r   commandr6   Zcommand_infor5   dataurlr   r   r   executec  s    
"
zRemoteConnection.executeNc          	      s  t d|||f  t|}| || j}d |rH|dkrH|dkrHd}| jrj| jj||||d  j}nft	j
| jd}|j||||d  j}t dst jdr fdd	 _nt jd
rЇ fdd	 _ jd}zd|  krdk rn n| d dS d|  k r$dkr2n n
||dS g }	 ddk	rV dd}	tdd |	D syt| }W nJ tk
r   d|  k rdk rn ntj}
ntj}
|
| dS X d|krd|d< |S d|d}|S W dt d    X dS )az  
        Send an HTTP request to the remote server.

        :Args:
         - method - A string for the HTTP method to send the request with.
         - url - A string for the URL to send the request to.
         - body - A string for request body. Ignored unless method is POST or PUT.

        :Returns:
          A dictionary with the server's parsed JSON response.
        z%s %s %sNr(   PUT)r   r#   )r   	getheaderc                s    j | S )N)r#   r   )x)respr   r   <lambda>      z+RemoteConnection._request.<locals>.<lambda>getc                s    j | S )N)r#   r   )r   )r   r   r   r     r   zUTF-8i,  i0  r'   locationi  i  )statusvaluezContent-Type;c             S   s   g | ]}| d qS )z	image/png)
startswith).0r   r   r   r   
<listcomp>  s    z-RemoteConnection._request.<locals>.<listcomp>   r   r   zFinished Request)r/   debugr   r*   r$   r"   r<   requestr   r:   r;   r	   r   r#   r   r   r    r   splitanyr   Z	load_jsonstrip
ValueErrorr   SUCCESSZUNKNOWN_ERRORclose)r   methodr   r   r!   r#   Z
statuscodehttpr   content_typer   r   )r   r   r   x  sR    





zRemoteConnection._request)F)FT)N)__name__
__module____qualname____doc__r
   r   r	   classmethodr   r   r   r$   r   r   r   r   r   r   r   r   (   s   
 
 zr   )r   loggingr   r
   r   r:   urllibr   ImportErrorr*   Zselenium.webdriver.commonr   r-   seleniumr   r   r   errorhandlerr    	getLoggerr   r/   objectr   r   r   r   r   <module>   s    
