Your IP : 216.73.216.196


Current Path : /opt/alt/python37/lib/python3.7/site-packages/webtest/__pycache__/
Upload File :
Current File : //opt/alt/python37/lib/python3.7/site-packages/webtest/__pycache__/sel.cpython-37.opt-1.pyc

B

�|NTq�	@s�dZddlZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlmZddlmZddlmZddlmZddlmZddlmZdd	lmZdd
lmZddlmZddlmZdd
lm Z yddl!Z!Wn4e"k
�rHyddl#Z!WndZ!YnXYnXy
e$�Wne%k
�rne&Z$YnXe
�'e(�Z)e)�*e
�+ej,��e)�-e
j.�Gdd�de/�Z0dZ1dd�Z2dd�Z3dd�Z4Gdd�de5�Z6Gdd�dej7�Z8Gdd�dej9�Z9Gdd�de5�Z:Gd d!�d!e5�Z;Gd"d#�d#ej<e:�Z<Gd$d%�d%e<�Z=e=e<j>d&<Gd'd(�d(e<�Z?e?e<j>d)<Gd*d+�d+e<�Z@e@e<j>d,<Gd-d.�d.e@�ZAeAe<j>d/<Gd0d1�d1e<�ZBeBe<j>d2<Gd3d4�d4e<�ZCeCe<j>d5<Gd6d7�d7eB�ZDeDe<j>d8<Gd9d:�d:eBejE�ZEeEe<j>d;<Gd<d=�d=e<ejF�ZFeFe<j>d><eFe<j>d?<eFe<j>d@<GdAdB�dBe5�ZGGdCdD�dDejHe:�ZHGdEdF�dFe5�ZIGdGdH�dHejJ�ZJGdIdJ�dJejK�ZKGdKdL�dLe �ZLdMdN�ZMdOdP�ZNdWdQdR�ZOdSdT�ZPdUdV�ZQdS)Xz�
Routines for testing WSGI applications with selenium.

Most interesting is :class:`~webtest.sel.SeleniumApp` and the
:func:`~webtest.sel.selenium` decorator
�N)�wraps)�app)�
simple_server)�contextmanager)�PY3)�	urlencode)�binary_type)�HTTPConnection)�CannotSendRequest)�
HTTPServer)�SimpleHTTPRequestHandlerFc@seZdZdZdS)�SeleniumWarningzSpecific warning categoryN)�__name__�
__module__�__qualname__�__doc__�rr�</opt/alt/python37/lib/python3.7/site-packages/webtest/sel.pyr
=sr
)z*chromez*firefoxcst���fdd��}|S)z6run test with selenium. create a new session if neededcszt�rv|rnt|dtj�rn|d}t|jt�r8�|�qv|j}t|jj�|_z�|�Wd|j��||_Xn�|�dS)Nr)�is_available�
isinstance�unittestZTestCaser�SeleniumApp�close)�args�selfZold_app)�funcrr�wrapperIs


z#function_decorator.<locals>.wrapper)r)rrr)rr�function_decoratorGsrc	cs�d|_t�sdVn�|j}t|j�}x2|jj��D]"\}}|��dkr2|j	�
||�q2Wtjddd�}|�
|j�|��|�dt|jd��}z
|VWd|j	��}tr�|�|jp�d	�}||_d|_d
|_|��|��XdS)z4A context mamanger to create a session inside a testFN)�hostzwebtest-selenium-z.html)�prefix�suffixz	/__file__)�__file__zutf-8T)�updatedr�test_apprr�request�headers�items�lower�browser�addCustomRequestHeader�tempfileZNamedTemporaryFile�write�body�flush�get�dict�name�
getHtmlSourcer�encode�charsetZ_forms_indexedr)�respr#r�h�v�fdZresponser,rrr�context_manager^s.


r8cCsRt|t�rt�rN|Sn8t|tj�r*t|�St|tj�rBtt	�|�St
d|��dS)z_A callable usable as:

    - class decorator
    - function decorator
    - contextmanager
    zUnsuported type %rN)r�typer�types�FunctionTyper�testapp�TestResponserr8�RuntimeError)�objrrr�selenium{s
r@c@s8eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�ZdS)
�Seleniuma�Selenium RC control aka ``browser``

    A object use to manipulate DOM nodes. This object allow to use the
    underlying selenium api. See Selenium `api
    <http://goo.gl/IecEk>`_

    You can use the original method name::

        browser.fireEvent('id=#myid", 'focus')

    Or a more pythonic name::

        browser.fire_event('id=#myid", 'focus')

    Both are equal to::

        browser.execute('fireEvent', 'id=#myid', 'focus')

    cCs.tj�dd�|_ttj�dd��|_d|_dS)N�
SELENIUM_HOSTz	127.0.0.1�
SELENIUM_POSTi\)�os�environr.r�int�port�
session_id)rrrr�__init__�szSelenium.__init__cCs*tj�dd�|_|�|j|ddd�|_dS)NZSELENIUM_DRIVERz
*googlechrome�zcaptureNetworkTraffic=truezaddCustomRequestHeader=true)rDrEr.�driverZgetNewBrowserSessionrH)r�urlrrr�start�szSelenium.startcCs|��d|_dS)N)ZtestCompleterH)rrrr�stop�sz
Selenium.stopcGs�tdd�t|�D�|d�}|jr*|j|d<t|�}ddi}t|j|j�}z*|�dd||�|��}|j	}|�
�}Wd|��Xtr�t
|d	�}|�d
�r�tt|���n|�d�s�tt|���|dd�}|d
kr�|dkr�dp�dS|S)NcSsg|]\}}|d|f�qS)�r)�.0�i�arrr�
<listcomp>�sz$Selenium.execute.<locals>.<listcomp>)�cmdZ	sessionIdzContent-Typez0application/x-www-form-urlencoded; charset=utf-8ZPOSTz/selenium-server/driver/zutf-8zERROR: Unknown command:ZOK�)�true�falserVTF)r/�	enumeraterHrr	rrGr$�getresponse�status�readrr�str�
startswith�AttributeError�reprr>)rrTr�datar%�connr4rZrrr�execute�s,




zSelenium.executecs t|����fdd�}||_|S)Ncs�gdd�|D�}�j|�S)NcSsg|]}t|��qSr)r\)rPrRrrrrS�sz9Selenium.__getattr__.<locals>.wrapped.<locals>.<listcomp>)rb)r)rTrrr�wrapped�sz%Selenium.__getattr__.<locals>.wrapped)�_get_commandr)r�attrrcr)rTrr�__getattr__�szSelenium.__getattr__N)	rrrrrIrMrNrbrfrrrrrA�srAcs`eZdZdZgZd�fdd�	Zedd��Zedd	��Zd
d�Z	ddd
�Z
dd�Zdd�Z�Z
S)rzPSee :class:`webtest.TestApp`

    SeleniumApp only support ``GET`` requests
    N�0uc	s�d|_|r2tt|�j||d�|�|j�|jj}t�s<t�d|_t	j
�dd�}tt	j
�dd��}t
�|_|j�|�|p|i|_||_||_dS)N)�relative_torBz	127.0.0.1rCi\)r�superrrI�_run_serverrLr�AssertionErrorrHrDrEr.rFrA�_browserrM�
extra_environ�timeoutr#)	rrrLrnrmrh�kwargsrrG)�	__class__rrrI�s

zSeleniumApp.__init__cCs|jS)z*The current :class:`~webtest.sel.Selenium`)rl)rrrrr(�szSeleniumApp.browsercCs|jjtkS)N)rlrK�HAS_UPLOAD_SUPPORT)rrrr�has_upload_support�szSeleniumApp.has_upload_supportcCs�|jdkrt�d��|jr(d|jj|_|j�d�x0|j�	�D]"\}}|�
�dkr@|j�||�q@W|j�|j
�|��}|s�|�||�|s�|j}|dkr�|dks�|�|�|S)N�GETzOnly GET are allowedz%s:%s�json)ri,i�)�methodr<ZAppErrorr�bindrr(�captureNetworkTrafficr%r&r'r)�openrL�
_get_response�
_check_status�
status_int�
_check_errors)r�reqrZ�
expect_errorsr5r6r4rrr�
do_requests"


zSeleniumApp.do_requestc	Cs�|dkr|p|j}|j�|�t�|j�d��}g}g}�x|D�]}|d�d�rVq@tj�	|d�}x"|dD]}|d|j
|d<qpWt�}|j|_
|_|jj|_||_||_||_t|d�|_x"|d	D]}|d|j
|d<q�W|jd
k�rd|jk�r|j�sd|_|jd
k�r4|�d|jj|f�d|jk�sJ|jd
kr@|�|�q@W|�rl|�d�}|S|dk	�rz|Std��dS)z%Get responses responses from seleniumrrtrLz.icoZrequestHeaders�valuer0Z
statusCodeZresponseHeaders��ztext/zutf-8i�z%s %r�htmlNzNo response found)rnr(ZwaitForPageToLoadrt�loadsrw�endswith�webob�RequestZblankr%r=r#r�	responses�errorsr$r\rZr{�content_typer3�appendrL�pop�LookupError)	rr4rnZtraficr�r��dr}r5rrrrysD



zSeleniumApp._get_responsec
s�t�\��t���f�|_����fdd�}tj|d��_�j��t���}t�	d�xPt
d�D]D}y|�dd�|��}Wn$t
jtfk
r�t�	d�YqdXPqdWd	S)
z&Run a wsgi server in a separate threadcs tj���ttd�}|��dS)N)Zserver_classZ
handler_class)rZmake_server�
WSGIServer�WSGIRequestHandler�
serve_forever)Zhttpd)r�iprGrr�run>s
z$SeleniumApp._run_server.<locals>.run)�targetg�?�drsz/__application__g333333�?N)�
_free_port�WSGIApplicationr�	threading�Thread�threadrMr	�time�sleep�ranger$rY�socket�errorr
)rrr�rarQr4r)rr�rGrrj9s



zSeleniumApp._run_serverc	Cs�|jrht|jj�}xTtd�D]H}y|�dd�|��}Wn tjk
rX|��PYqXt	�
d�qWdtjkr||j
��dtjkr�t�ttjd�tj�dS)z,Close selenium and the WSGI server if neededr�rsz/__kill_application__g333333�?ZSELENIUM_KEEP_OPEN�SELENIUM_PIDN)rr	rvr�r$rYr�r�rr�r�rDrEr(rN�killrF�signal�SIGTERM)rrarQr4rrrrRs


zSeleniumApp.close)NNrgNN)NN)rrrrZappsrI�propertyr(rrrryrjr�
__classcell__rr)rprr�s
&rcsdeZdZddd�Zddd�Zedd��Zed	d
��Zdd�Zee�Z	�fd
d�Z
edd��Z�ZS)r=NcKsx|jdkr|jdks"td|j��t|j�rl|jd}|�dd�s`|j�||�|s`|j�|�|j�d�St	d��dS)	z�If this request is a redirect, follow that redirect.  It
        is an error if this is not a redirect response.  Returns
        another response object.
        i,i�z'You can only follow 301 and 302. Not %srr~Fz,Responses queue is empty. Nothing to follow.N)
r{�
ValueError�lenr�r.rrzr|r�r�)rrZ�kwr4rrr�followgs

zTestResponse.followFc	
Cs8|jj||||d�}	|	��|dkr(|S|jj||d�S)N)�description�linkid�href�indexr)r4rn)�doc�link�clickr#ry)
rr�r�r�Zanchorr��verbosermrnr�rrrr�xs

zTestResponse.clickcCst|�S)N)�Forms)rrrr�forms�szTestResponse.formscCs
t|d�S)Nr)�Form)rrrr�form�szTestResponse.formcCs@|j��}tr|�|jpd�St|t�r8t||jp4d�S|SdS)Nzutf-8)r(r1rr2r3rr�unicode)rr,rrr�
_body__get�s

zTestResponse._body__getcs"t|t�r|��Stt|��|�S)N)r�Element�isElementPresentrir=�__contains__)r�item)rprrr��s
zTestResponse.__contains__cCst|�S)z+Expose a :class:`~webtest.browser.Document`)�Document)rrrrr��szTestResponse.doc)N)NNNNNFNN)
rrrr�r�r�r�r�r�r,r�r�r�rr)rprr=es

	r=c@s�eZdZdZdd�Zdd�Zdd�Zd&d	d
�Zd'dd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zeee�Zdd�Zdd�Zdd �ZeZd!d"�Zd#d$�Zd%S)(r�a�A object use to manipulate DOM nodes. This object allow to use the
    underlying selenium api for the specified locator. See Selenium `api
    <http://goo.gl/IecEk>`_

    You can use the original method name::

        element.fireEvent('focus')

    Or a more pythonic name::

        element.fire_event('focus')

    Both are equal to::

        browser.execute('fireEvent', element.locator, 'focus')

    cCs|j|_||_||_dS)N)r(r4�locator)rr4r�rrrrI�szElement.__init__cs t|����fdd�}||_|S)Ncs$��jgdd�|D�}�jj|�S)NcSsg|]}t|��qSr)r\)rPrRrrrrS�sz8Element.__getattr__.<locals>.wrapped.<locals>.<listcomp>)r�r(rb)r)rTrrrrc�sz$Element.__getattr__.<locals>.wrapped)rdr)rrercr)rTrrrf�szElement.__getattr__cCs|��S)z%return true is the element is present)r�)rrrr�exist�sz
Element.exist�cCsHdt|�}y|j�||�Wn$tk
rBtd||f��YnX|S)z+Wait for an element and return this elementz%selenium.isElementPresent(%r) || nullzCan't find %s after %sms)r\r(ZwaitForConditionr>)rrn�scriptrrr�wait�szElement.waitcCs|����S)z8Wait for an element, click on it and return this element)r�r�)rrnrrr�wait_and_click�szElement.wait_and_clickcCs|�d���}||kS)zTrue iif the class is present�class)re�split)rr0�classesrrr�hasClass�szElement.hasClasscCs
|�d�S)z#Return the innerHTML of the elementze.innerHTML)�eval)rrrrr��szElement.htmlcCs|��S)zReturn the text of the element)ZgetText)rrrr�text�szElement.textcCs|�dt|��S)z)Return the attribute value of the elementze.getAttribute(%r))r�r\)rrerrrre�szElement.attrcCs
|�|�S)zDrag and drop to element)ZdragAndDropToObject)r�elementrrr�
drag_and_drop�szElement.drag_and_dropcCs|��S)N)ZgetValue)rrrr�
value__get�szElement.value__getcCs"t|�}d||f}|�|�dS)Nz�(function() {
        s.doFireEvent(l, "focus");
        s.doType(l, %s);
        e.setAttribute("value", %s);
        s.doFireEvent(l, "keydown");
        s.doFireEvent(l, "keypress");
        s.doFireEvent(l, "keyup");
        }()))�
_get_valuer�)rr�r�rrr�
value__set�szElement.value__setcGsJdt|�d�|��d�f}y|j�|�Stk
rDt|��YnXdS)z�Eval a javascript expression in Selenium RC. You can use the
        following variables:

        - s: the ``selenium`` object
        - b: the ``browserbot`` object
        - l: the element locator string
        - e: the element itself
        zs(function(s) {var l = %r;var b = s.browserbot; var e = b.findElement(l);var res = %s; return res || 'null';}(this))rJ�;N)r\�join�stripr(�getEvalr>)r�exprr�rrrr��s
zElement.evalcCst|t�r|��}||��kS)N)rr�r�)r�srrrr�s
zElement.__contains__cCs|��S)N)r�)rrrr�__nonzero__szElement.__nonzero__cCsd|jj|jfS)Nz
<%s at %s>)rprr�)rrrr�__repr__szElement.__repr__cCst|j�dd��S)N�"�')r\r��replace)rrrr�__str__szElement.__str__N)r�)r�)rrrrrIrfr�r�r�r�r�r�rer�r�r�r�r�r�r�r��__bool__r�r�rrrrr��s(

	

r�c@sfeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
d�Z	ddd�Z
ddd�Zdd�Zdd�Z
dS)r�zQThe browser document. ``resp.doc.myid`` is egual to
    ``resp.doc.css('#myid')``cCs
||_dS)N)r4)rr4rrrrI'szDocument.__init__cCst|jd|�S)Nzcss=#%s)r�r4)rrerrrrf*szDocument.__getattr__cKst|f|�}t|j|�S)z�Return an element matching ``tag``, an ``attribute`` and an
        ``index``.  For example::

          resp.doc.get('input', name='go') => xpath=//input[@name="go"]
          resp.doc.get('li', description='Item') => xpath=//li[.="Item"]
        )�_eval_xpathr�r4)r�tagror�rrrr.-szDocument.getcCst|jd|�S)z4Get an :class:`~webtest.browser.Element` using xpathzxpath=%s)r�r4)r�pathrrr�xpath7szDocument.xpathcCst|jd|�S)z=Get an :class:`~webtest.browser.Element` using a css selectorzcss=%s)r�r4)r�selectorrrr�css;szDocument.cssNcCs|jd||||d�S)z
Get a linkrR)r��idr�r�)r.)rr�r�r�r�rrrr�?s
z
Document.linkcCs|jd||||d�S)zGet an input field�input)r�r�r0r�)r.)rr�r0Zinputidr�rrrr�DszDocument.inputcCs|jd|||d�S)zGet a button�button)r�r�r�)r.)rr�Zbuttonidr�rrrr�IszDocument.buttoncCs"t|t�r|��S|j�t|��S)N)rr�r�r(Z
isTextPresentr�)rr�rrrr�Ns
zDocument.__contains__cCst|�S)N)r�)rr�rrr�__call__SszDocument.__call__)NNNN)NNNN)NNN)rrrrrIrfr.r�r�r�r�r�r�r�rrrrr�#s



r�cs.eZdZiZ�fdd�Zeejej�Z	�Z
S)�FieldcsJtt|�j||�|jj|_g|_g|_g|_t|j	|jj
|jd�|_
dS)N)r�r0)rir�rIr�r(�optionsZselectedIndicesZ_forced_valuesr�r�r�r0)rrro)rprrrI`s
zField.__init__)rrrr�rIr�r�r�r�r�r�rr)rprr�\s
r�c@s2eZdZdZdd�Zdd�Zdd�Zeee�ZdS)	�SelectzField representing ``<select>``cCs|�d|�dS)Nzvalue=%s)�select)rr�rrr�force_valuepszSelect.force_valuecCs|�d|�dS)Nzvalue=%s)r�)rr�rrrr�sszSelect.value__setcCs|��S)N)ZgetSelectedValue)rrrrr�vszSelect.value__getN)	rrrrr�r�r�r�r�rrrrr�ms
r�r�c@s2eZdZdZdd�Zdd�Zdd�Zeee�ZdS)	�MultipleSelectz3Field representing ``<select multiple="multiple">``cCs6|��dd�|D�}x|D]}|�d|�qWdS)NcSsg|]}t�|��qSr)r<�
_stringify)rPr�rrrrS�sz.MultipleSelect.force_value.<locals>.<listcomp>zvalue=%s)�removeAllSelections�addSelection)r�values�
str_valuesr6rrrr��s
zMultipleSelect.force_valuecCs6|��dd�|D�}x|D]}|�d|�qWdS)NcSsg|]}t�|��qSr)r<r�)rPr�rrrrS�sz-MultipleSelect.value__set.<locals>.<listcomp>zvalue=%s)r�r�)rr�r�r6rrrr��s
zMultipleSelect.value__setcCs|��}|�d�S)N�,)ZgetSelectedValuesr�)rr�rrrr��szMultipleSelect.value__getN)	rrrrr�r�r�r�r�rrrrr�~s
r�Zmultiple_selectc@s*eZdZdZdd�Zdd�Zeee�ZdS)�Radioz+Field representing ``<input type="radio">``cCs|r|��n|��dS)N)�checkZuncheck)rr�rrrr��s
zRadio.value__setcCsbd|j|jjf}|j�|�}dd�t�d�D�}|s:dSt|�dkrN|dStd||f��dS)Na�(function(obj) {
            var name = '%s';
            var element = obj.browserbot.findElement('%s');
            var elements = element.getElementsByTagName('input');
            var values = [];
            for (var i = 0, n = elements.length; i < n; ++i) {
                element = elements[i];
                if (element.name == name && element.checked) {
                    values.push('name='+element.value);
                }
            }
            return values.join('&');
        }(this))cSsg|]\}}|�qSrr)rP�kr6rrrrS�sz$Radio.value__get.<locals>.<listcomp>z	name=truerOrz"Got more than one value for %r: %s)	r0r�r�r(r��cgiZ	parse_qslr�r�)rr�r�rrrr��s
zRadio.value__getN)rrrrr�r�r�r�rrrrr��sr�Zradioc@seZdZdZdS)�Checkboxz.Field representing ``<input type="checkbox">``N)rrrrrrrrr��sr�Zcheckboxc@seZdZdZdS)�Textz*Field representing ``<input type="text">``N)rrrrrrrrr��sr�r�c@s0eZdZdZdd�Zdd�ZeZeej	e�Z
dS)�Filez*Field representing ``<input type="file">``cs:t�\�����fdd�}tj|d�}|��d��fS)z(Run a simple server in a separate threadcs �t_t��ft�}|��dS)N)�FileHandler�filenamer�handle_request)Zserver)r�r�rGrrr��szFile._run_server.<locals>.run)r�z
http://%s:%s/)r�r�r�rM)rr�r�r�r)r�r�rGrrj�s

zFile._run_servercCsvt|ttf�r*t|�dkr*|jgt|�}|jjj}|�|�}|\}}}|j	rr|�
|�}|tj�
|�7}|�|�dS)NrO)r�list�tupler�r0r�r4r#Z_get_file_inforrrjrDr��basenameZ
attachFile)rr�r#�	file_infor0r�ZcontentrLrrrr��s



zFile.value__setN)rrrrrjr�r�r�r�r�r�rrrrr��s

r��filec@seZdZdZdS)�Textareaz!Field representing ``<textarea>``N)rrrrrrrrr��sr�Ztextareac@seZdZdZdS)�Hiddenz,Field representing ``<input type="hidden">``N)rrrrrrrrr�srZhiddenc@s,eZdZdZdZdd�Zee�Zdd�ZdS)�Submitz=Field representing ``<input type="submit">`` and ``<button>``FcCsdS)Nr)rrrrr��szSubmit.value__getcCs|jS)N)�_value)rrrr�value_if_submittedszSubmit.value_if_submittedN)	rrrrZsettabler�r�r�rrrrrr�s
r�submitr�Zimagec@seZdZdd�Zdd�ZdS)r�cCs
||_dS)N)r4)rr4rrrrIszForms.__init__cCst|j|�S)N)r�r4)r�keyrrr�__getitem__szForms.__getitem__N)rrrrIrrrrrr�
sr�cs:eZdZdZeZ�fdd�Z�fdd�Zd	dd�Z�Z	S)
r�zSee :class:`~webtest.Form`cst||_|j|_|j|_t|t�r0td|d�|_ntd|d�|_|sPtd|j��|�d�}t	t
|��|d|�dS)Nr�)r�)r�zNo form found at %sze.innerHTMLz<form>%s</form>)r4r#r(rrFr�r�r�r�rir�rI)rr4r�r�)rprrrIs

z
Form.__init__csdtt|���xP|j��D]B\}}t|�dkrx,t|�D] \}}|jd|df7_q8WqWdS)NrOz[%s])rir��
_parse_fields�fieldsr&r�rXr�)rr0rrQZfield)rprrr%s
zForm._parse_fieldsNcCsd|dkr|j�d�|j�|�|rDtd|j||d�}|j�|�n|j�|j�|jj|j	|d�S)z�Submits the form.  If ``name`` is given, then also select that
        button (using ``index`` to disambiguate)``.

        Returns a :class:`webtest.browser.TestResponse` object.
        rrtr�)r�r0r�)r4rn)
r(rwr#Z
_make_environr�r�r�rryr4)rr0r�rmrnr�rrrr-s
zForm.submit)NNNN)
rrrrr�Z
FieldClassrIrrr�rr)rprr�s

r�c@s(eZdZdZdd�Zdd�Zdd�ZdS)	r�z@A WSGI middleware to handle special calls used to run a test appcCs&||_d|_||_d||_d|_dS)NTz
http://%s:%s/)rr�rvrLr�)rrrvrrrrIGs

zWSGIApplication.__init__cCs�d|dkr$d|_t��}|||�Sd|dkr�t�|�}t��}d|_|j�d�}t|���}|�	dd|j
�tr~||_n||_
|||�Sd|dkr�t��}|||�S|�||�S)	NZ__kill_application__Z	PATH_INFOFr!ztext/html; charset=UTF-8zhttp://localhost/z
http://%s/Z__application__)r�r�ZResponser�r�Zparamsr.rxr[r�rrr�r,r)rrEZstart_responser4r}r�r,rrrr�Ns(



zWSGIApplication.__call__cCsd|j|jfS)Nz<WSGIApplication %r at %s>)rrL)rrrrr�eszWSGIApplication.__repr__N)rrrrrIr�r�rrrrr�Dsr�c@seZdZdZdd�ZdS)r�z(A WSGIRequestHandler who log to a loggercGs$t�d|��|��||f�dS)Nz%s - - [%s] %s)�log�debug�address_string�log_date_time_string)r�formatrrrr�log_messagelszWSGIRequestHandler.log_messageN)rrrrrrrrrr�isr�c@seZdZdZdd�ZdS)r�zA WSGIServercCsx|jjr|��qWdS)N)Zapplicationr�r�)rrrrr�vs
zWSGIServer.serve_foreverN)rrrrr�rrrrr�ssr�c@s eZdZdZdd�Zdd�ZdS)r�zHandle a simple filecCs|jS)N)r�)rr�rrr�translate_path~szFileHandler.translate_pathcGs$t�d|��|��||f�dS)Nz%s - - [%s] %s
)r	r
rr)rr
rrrrr�szFileHandler.log_messageN)rrrrrrrrrrr�{sr�cCstrt�|�Stt|��SdS)N)rt�dumpsr_r\)r�rrrr��s
r�cCs:d|kr6|�d�}|�d�gdd�|D�}d�|�}|S)N�_rcSsg|]}|���qSr)�title)rP�crrrrS�sz _get_command.<locals>.<listcomp>rJ)r�r�r�)rTrrrrd�s


rdcKs�|sd}|d|7}xP|��D]D\}}|dkr8|�d�}|r|dkrR|d|7}q|d||f7}qW|dk	r�|d|d	f7}|S)
Nzxpath=z//%s)Zfor_Zclass_rr�z[.="%s"]z
[@%s="%s"]z[%s]rO)r&r�)r�r�r�ror�r6rrrr��s
r�cCsDt�tjtj�}|�d�|��\}}|��tj�dd�}||fS)N)rJrZ
SELENIUM_BINDz	127.0.0.1)	r�ZAF_INETZSOCK_STREAMrvZgetsocknamerrDrEr.)r�r�rGrrrr��s
r�cCs�tdkrt�dt�tj�dd�}ttj�dd��}yt||�}|�	dd�Wn�t
jk
r�d	tjkrndStjd	}t�
d
d|g�}t|j�tjd<xPtd
�D]D}t�d�yt||�}|�	dd�Wnt
jk
r�Yq�XdSq�WdSYnXdS)zNreturn True if the selenium module is available and a RC server is
    runningFz^selenium is not available because no json module are available. Consider installing simplejsonrBz	127.0.0.1rCi\rs�/ZSELENIUM_JAR�javaz-jarr��g333333�?T)rt�warnings�warnr
rDrEr.rFr	r$r�r��
subprocess�Popenr\�pidr�r�r�)rrGraZjar�prQrrrr�s2





r)NN)RrrDr��sysr�r�r�r:r�ZshutilZloggingrr*rr�r�	functoolsrZwebtestrr<Zwsgirefr�
contextlibrZwebtest.compatrrrr	r
rrrt�ImportErrorZ
simplejsonr��	NameErrorr\Z	getLoggerrr	Z
addHandlerZ
StreamHandler�stderrZsetLevel�DEBUG�Warningr
rqrr8r@�objectrAZTestApprr=r�r�r�r�r�r�r�r�r�r�r�rrr�r�r�r�r�r�r�rdr�r�rrrrr�<module>
s�


Q@~9

#








	1%