If you have a single html form in your page, just use the .form attribute:
>>> res = app.get('/form.html')
>>> form = res.form
You can use the form index if your html contains more than one form:
>>> form = res.forms[0]
Or the form id:
>>> form = res.forms['myform']
You can check form attributes:
>>> print(form.id)
myform
>>> print(form.action)
/form-submit
>>> print(form.method)
POST
You can fill out and submit forms from your tests. Fields are a dict like object:
>>> # dict of fields
>>> form.fields.values()
[(u'text', [<Text name="text">]), ..., (u'submit', [<Submit name="submit">])]
You can check the current value:
>>> print(form['text'].value)
Foo
Then you fill it in fields:
>>> form['text'] = 'Bar'
>>> # When names don't point to a single field:
>>> form.set('text', 'Bar', index=0)
>>> print(form['textarea'].value)
Some text
>>> form['textarea'] = 'Some other text'
You can force the value of an hidden field:
>>> form['hidden'].force_value('2')
Simple select:
>>> print(form['select'].value)
option2
>>> form['select'] = 'option1'
Select multiple:
>>> print(form['multiple'].value)
['option2', 'option3']
>>> form['multiple'] = ['option1']
Select fields can only be set to valid values (i.e., values in an <option>) but you can also use .force_value() to enter values not present in an option.
>>> form['select'].force_value(['optionX'])
>>> form['multiple'].force_value(['optionX'])
You can check if the checkbox is checked and is value:
>>> print(form['checkbox'].checked)
False
>>> print(form['checkbox'].value)
None
You can change the status with the value:
>>> form['checkbox'] = True
Or with the checked attribute:
>>> form['checkbox'].checked =True
If the checkbox is checked then you’ll get the value:
>>> print(form['checkbox'].checked)
True
>>> print(form['checkbox'].value)
checkbox 1
If the checkbox has no value then it will be ‘on’ if you checked it:
>>> print(form['checkbox2'].value)
None
>>> form['checkbox2'].checked = True
>>> print(form['checkbox2'].value)
on
>>> print(form['radio'].value)
Radio 2
>>> form['radio'] = 'Radio 1'
You can deal with file upload by using the Upload class:
>>> from webtest import Upload
>>> form['file'] = Upload('README.rst')
>>> form['file'] = Upload('README.rst', b'data')
Then you can submit the form:
>>> # Submit with no particular submit button pressed:
>>> res = form.submit()
>>> # Or submit a button:
>>> res = form.submit('submit')
>>> print(res)
Response: 200 OK
Content-Type: text/plain
text=Bar
...
submit=Submit
You can also use a specific submit button:
>>> res = form.submit('submit', index=1)
>>> print(res)
Response: 200 OK
Content-Type: text/plain
...
submit=Submit 2