Your IP : 216.73.216.85


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.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�tempfile�NamedTemporaryFile�write�body�flush�get�dict�name�
getHtmlSourcer�encode�charsetZ_forms_indexedr)�respr#r�h�v�fd�responser-rrr�context_manager^s.


r:cCsRt|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�TestResponserr:�RuntimeError)�objrrr�selenium{s
rBc@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)rFrGr/�driverZgetNewBrowserSessionrJ)r�urlrrr�start�szSelenium.startcCs|��d|_dS)N)ZtestCompleterJ)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�falserXTF)r0�	enumeraterJrr	rrIr$�getresponse�status�readrr�str�
startswith�AttributeError�reprr@)rrVr�datar%�connr5r\rrr�execute�s,




zSelenium.executecs t|����fdd�}||_|S)Ncs�gdd�|D�}�j|�S)NcSsg|]}t|��qSr)r^)rRrTrrrrU�sz9Selenium.__getattr__.<locals>.wrapped.<locals>.<listcomp>)rd)r)rVrrr�wrapped�sz%Selenium.__getattr__.<locals>.wrapped)�_get_commandr)r�attrrer)rVrr�__getattr__�szSelenium.__getattr__N)	rrrrrKrOrPrdrhrrrrrC�srCcs`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_torDz	127.0.0.1rEi\)r�superrrK�_run_serverrNr�AssertionErrorrJrFrGr/rHrC�_browserrO�
extra_environ�timeoutr#)	rrrNrprorj�kwargsrrI)�	__class__rrrK�s

zSeleniumApp.__init__cCs|jS)z*The current :class:`~webtest.sel.Selenium`)rn)rrrrr(�szSeleniumApp.browsercCs|jjtkS)N)rnrM�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)�openrN�
_get_response�
_check_status�
status_int�
_check_errors)r�reqr\�
expect_errorsr6r7r5rrr�
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 seleniumrrvrNz.icoZrequestHeaders�valuer1Z
statusCodeZresponseHeaders��ztext/zutf-8i�z%s %r�htmlNzNo response found)rpr(ZwaitForPageToLoadrv�loadsry�endswith�webob�RequestZblankr%r?r#r�	responses�errorsr$r^r\r}�content_typer4�appendrN�pop�LookupError)	rr5rpZtraficr�r��drr6rrrr{sD



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�iprIrr�run>s
z$SeleniumApp._run_server.<locals>.run)�targetg�?�druz/__application__g333333�?N)�
_free_port�WSGIApplicationr�	threading�Thread�threadrOr	�time�sleep�ranger$r[�socket�errorr
)rrr�rcrSr5r)rr�rIrrl9s



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�ruz/__kill_application__g333333�?ZSELENIUM_KEEP_OPEN�SELENIUM_PIDN)rr	rxr�r$r[r�r�rr�r�rFrGr(rP�killrH�signal�SIGTERM)rrcrSr5rrrrRs


zSeleniumApp.close)NNriNN)NN)rrrrZappsrK�propertyr(rtr�r{rlr�
__classcell__rr)rrrr�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/rr|r~r�r�)rr\�kwr5rrr�followgs

zTestResponse.followFc	
Cs8|jj||||d�}	|	��|dkr(|S|jj||d�S)N)�description�linkid�href�indexr)r5rp)�doc�link�clickr#r{)
rr�r�r��anchorr��verboserorpr�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(r2rr3r4rr�unicode)rr-rrr�
_body__get�s

zTestResponse._body__getcs"t|t�r|��Stt|��|�S)N)r�Element�isElementPresentrkr?�__contains__)r�item)rrrrr��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)rrrr?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(r5�locator)rr5r�rrrrK�szElement.__init__cs t|����fdd�}||_|S)Ncs$��jgdd�|D�}�jj|�S)NcSsg|]}t|��qSr)r^)rRrTrrrrU�sz8Element.__getattr__.<locals>.wrapped.<locals>.<listcomp>)r�r(rd)r)rVrrrre�sz$Element.__getattr__.<locals>.wrapped)rfr)rrgrer)rVrrrh�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@)rrp�scriptrrr�wait�szElement.waitcCs|����S)z8Wait for an element, click on it and return this element)r�r�)rrprrr�wait_and_click�szElement.wait_and_clickcCs|�d���}||kS)zTrue iif the class is present�class)rg�split)rr1�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^)rrgrrrrg�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))rL�;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>)rrrr�)rrrr�__repr__szElement.__repr__cCst|j�dd��S)N�"�')r^r��replace)rrrr�__str__szElement.__str__N)r�)r�)rrrrrKrhr�r�r�r�r�r�rgr�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)r5)rr5rrrrK'szDocument.__init__cCst|jd|�S)Nzcss=#%s)r�r5)rrgrrrrh*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�r5)r�tagrqr�rrrr/-szDocument.getcCst|jd|�S)z4Get an :class:`~webtest.browser.Element` using xpathzxpath=%s)r�r5)r�pathrrr�xpath7szDocument.xpathcCst|jd|�S)z=Get an :class:`~webtest.browser.Element` using a css selectorzcss=%s)r�r5)r�selectorrrr�css;szDocument.cssNcCs|jd||||d�S)z
Get a linkrT)r��idr�r�)r/)rr�r�r�r�rrrr�?s
z
Document.linkcCs|jd||||d�S)zGet an input field�input)r�r�r1r�)r/)rr�r1Zinputidr�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)rrrrrKrhr/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�r1)rkr�rKr�r(�optionsZselectedIndicesZ_forced_valuesr�r�r�r1)rrrq)rrrrrK`s
zField.__init__)rrrr�rKr�r�r�r�r�r�rr)rrrr�\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)rRr�rrrrU�sz.MultipleSelect.force_value.<locals>.<listcomp>zvalue=%s)�removeAllSelections�addSelection)r�values�
str_valuesr7rrrr��s
zMultipleSelect.force_valuecCs6|��dd�|D�}x|D]}|�d|�qWdS)NcSsg|]}t�|��qSr)r>r�)rRr�rrrrU�sz-MultipleSelect.value__set.<locals>.<listcomp>zvalue=%s)r�r�)rr�r�r7rrrr��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)rR�kr7rrrrU�sz$Radio.value__get.<locals>.<listcomp>z	name=truerQrz"Got more than one value for %r: %s)	r1r�r�r(r��cgi�	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)�server)r�r�rIrrr��szFile._run_server.<locals>.run)r�z
http://%s:%s/)r�r�r�rO)rr�r�r�r)r�r�rIrrl�s

zFile._run_servercCsvt|ttf�r*t|�dkr*|jgt|�}|jjj}|�|�}|\}}}|j	rr|�
|�}|tj�
|�7}|�|�dS)NrQ)r�list�tupler�r1r�r5r#Z_get_file_infortrlrFr��basenameZ
attachFile)rr�r#�	file_infor1r��contentrNrrrr��s



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

r��filec@seZdZdZdS)�Textareaz!Field representing ``<textarea>``N)rrrrrrrrr�srZtextareac@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�r	rrrrr�s
r�submitr�Zimagec@seZdZdd�Zdd�ZdS)r�cCs
||_dS)N)r5)rr5rrrrKszForms.__init__cCst|j|�S)N)r�r5)r�keyrrr�__getitem__szForms.__getitem__N)rrrrKrrrrrr�
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>)r5r#r(rrHr�r�r�r�rkr�rK)rr5r�r�)rrrrrKs

z
Form.__init__csdtt|���xP|j��D]B\}}t|�dkrx,t|�D] \}}|jd|df7_q8WqWdS)NrQz[%s])rkr��
_parse_fields�fieldsr&r�rZr�)rr1rrS�field)rrrrr
%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.
        rrvr�)r�r1r�)r5rp)
r(ryr#Z
_make_environr�r�r�r
r{r5)rr1r�rorpr�rrrr
-s
zForm.submit)NNNN)
rrrrr�Z
FieldClassrKr
r
r�rr)rrrr�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�rxrNr�)rrrxrrrrKGs

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��paramsr/rzr]r�rrr�r-r)rrGZstart_responser5rr�r-rrrr�Ns(



zWSGIApplication.__call__cCsd|j|jfS)Nz<WSGIApplication %r at %s>)rrN)rrrrr�eszWSGIApplication.__repr__N)rrrrrKr�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
)rrrr)rrrrrrr�szFileHandler.log_messageN)rrrrrrrrrrr�{sr�cCstrt�|�Stt|��SdS)N)rv�dumpsrar^)r�rrrr��s
r�cCs:d|kr6|�d�}|�d�gdd�|D�}d�|�}|S)N�_rcSsg|]}|���qSr)�title)rR�crrrrU�sz _get_command.<locals>.<listcomp>rL)r�r�r�)rVrrrrf�s


rfcKs�|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_�class_rr�z[.="%s"]z
[@%s="%s"]z[%s]rQ)r&r�)r�r�r�rqr�r7rrrr��s
r�cCsDt�tjtj�}|�d�|��\}}|��tj�dd�}||fS)N)rLrZ
SELENIUM_BINDz	127.0.0.1)	r��AF_INET�SOCK_STREAMrx�getsocknamerrFrGr/)r�r�rIrrrr��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 simplejsonrDz	127.0.0.1rEi\ru�/ZSELENIUM_JAR�javaz-jarr��g333333�?T)rv�warnings�warnr
rFrGr/rHr	r$r�r��
subprocess�Popenr^�pidr�r�r�)rrIrcZjar�prSrrrr�s2





r)NN)RrrFr��sysr�r�r�r<r��shutilZloggingr#r*rr�r%�	functoolsrZwebtestrr>Zwsgirefr�
contextlibrZwebtest.compatrrrr	r
rrrv�ImportErrorZ
simplejsonr��	NameErrorr^Z	getLoggerrrZ
addHandlerZ
StreamHandler�stderrZsetLevel�DEBUG�Warningr
rsrr:rB�objectrCZTestApprr?r�r�r�r�r�r�r�r�r�r�rrrr�r�r�r�r�r�r�rfr�r�rrrrr�<module>
s�


Q@~9

#








	1%