5

I am using the robobrowser library, I have come across a form:

<form action="/results" id="search">
            <div class="s_ctr">
                <fieldset>
                    <label class="jaw" for="ln">Search by Name</label><input type="text" placeholder="Search by Name" autocomplete="off" value="" tabindex="1" name="ln" maxlength="255" class="name" id="ln" data-key="true"><span>near</span><label class="jaw" for="loc">Enter City, State</label><input type="text" placeholder="Enter City, State" autocomplete="off" value="" tabindex="2" name="loc" maxlength="255" class="location" id="loc" data-key="true">
                </fieldset>
                <input type="submit" value="Find Physician" class="orange-btn" tabindex="4" id="btn-submit">

            </div>
        </form>

My code:

search_form = browser.get_form(id='search')
search_form        
search_form.fields['1']= name
search_form.fields['2']= address
# # Submit the form
browser.submit_form(search_form)
browser

I get the following error and traceback:

Traceback:
File "C:\r1\lib\site-packages\django\core\handlers\base.py" in get_response
  114.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\r1\lib\site-packages\django\views\decorators\csrf.py" in wrapped_view
  57.         return view_func(*args, **kwargs)
File "C:\r1\mlist\ml1\views.py" in ph
  48.             p = getPhone(A.name,A.address)
File "C:\r1\mlist\ml1\views.py" in getPhone
  191.     browser.submit_form(search_form)
File "C:\r1\lib\site-packages\robobrowser\browser.py" in submit_form
  343.         payload = form.serialize(submit=submit)
File "C:\r1\lib\site-packages\robobrowser\forms\form.py" in serialize
  225.         return Payload.from_fields(include_fields)
File "C:\r1\lib\site-packages\robobrowser\forms\form.py" in from_fields
  118.             payload.add(field.serialize(), field.payload_key)    

Exception Type: AttributeError at /ph/
Exception Value: 'unicode' object has no attribute 'serialize'

Can this form be submitted with robobrowser?

user1592380
  • 34,265
  • 92
  • 284
  • 515
  • There is not enough information here at all to help you; most of the form is missing. Can you also include the full traceback please? – Martijn Pieters Jul 31 '14 at 20:04

1 Answers1

4

The issue is the way you're setting the values of the form fields. To change the value of a field, write to its value attribute:

form.fields['ln'].value = name
# Or, as a shortcut...
form['ln'].value = name

Instead of setting the values of the form fields, your example code actually replaces the fields with unicode objects. Running form['ln'] = name doesn't set the value of the ln field to name; it deletes the ln field and replaces it with the name string. Then, when the form attempts to serialize its contents, it tries to call the serialize method of each of its fields. But strings don't define that method, which leads to the traceback you encountered.

jm.carp
  • 388
  • 2
  • 11
  • 2
    Thank you very much. BTW does robobrowser have any functionality to handle javascript or ajax in pages (or do you plan to introduce it)? - Bill – user1592380 Aug 02 '14 at 18:47