Comment soumettre un formulaire avec une action get à l'aide de Robobrowser
-
26-12-2019 - |
Question
J'utilise la bibliothèque robobrowser, je suis tombé sur un formulaire :
<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>
Mon 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
J'obtiens l'erreur et le traçage suivants :
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'
Ce formulaire peut-il être soumis avec RoboBrowser ?
La solution
Le problème réside dans la façon dont vous définissez les valeurs des champs du formulaire.Pour modifier la valeur d'un champ, écrivez dans son value
attribut:
form.fields['ln'].value = name
# Or, as a shortcut...
form['ln'].value = name
Au lieu de définir les valeurs des champs du formulaire, votre exemple de code remplace les champs par des objets Unicode.En cours d'exécution form['ln'] = name
ne définit pas la valeur du ln
champ à name
;il supprime le ln
champ et le remplace par le name
chaîne.Ensuite, lorsque le formulaire tente de sérialiser son contenu, il tente d'appeler le serialize
méthode de chacun de ses champs.Mais les chaînes ne définissent pas cette méthode, ce qui conduit au traçage que vous avez rencontré.