diff --git a/scrapy/http/request/form.py b/scrapy/http/request/form.py index d2ebf011a..50533ea42 100644 --- a/scrapy/http/request/form.py +++ b/scrapy/http/request/form.py @@ -77,11 +77,11 @@ def _get_inputs(form, formdata, dont_click, clickdata, response): except (ValueError, TypeError): raise ValueError('formdata should be a dict or iterable of tuples') - inputs = [(n, v) for n, v in form.form_values() if n not in formdata] + inputs = [(n, u'' if v is None else v) for n, v in form.fields.items() if n not in formdata] if not dont_click: clickable = _get_clickable(clickdata, form) - if clickable and clickable[0] not in formdata: + if clickable and clickable[0] not in formdata and not clickable[0] is None: inputs.append(clickable) inputs.extend(formdata.iteritems()) diff --git a/scrapy/tests/test_http_request.py b/scrapy/tests/test_http_request.py index 8a590f7eb..2110e73f4 100644 --- a/scrapy/tests/test_http_request.py +++ b/scrapy/tests/test_http_request.py @@ -496,6 +496,33 @@ class FormRequestTest(RequestTest): response = HtmlResponse("http://www.example.com/formname.html", body=respbody) self.assertRaises(IndexError, self.request_class.from_response, response, formname="form3", formnumber=2) + def test_from_response_missed_value(self): + respbody = """ +
+ """ + res = HtmlResponse("http://example.com", body=respbody, encoding='utf-8') + req = self.request_class.from_response(res) + fs = cgi.parse_qs(req.body, True) + self.assertEqual(fs['key1'], ['val1']) + self.assertEqual(fs['key2'], ['']) + self.assertEqual(fs['key3'], ['on']) + self.assertEqual(fs['key4'], ['on']) + self.assertEqual(fs['key5'], ['val5']) + self.assertEqual(fs['key6'], ['']) + self.assertEqual(fs['key7'], ['']) + self.assertEqual(set(fs), set(['key1', 'key2', 'key3', 'key4', 'key5', 'key6', 'key7'])) class XmlRpcRequestTest(RequestTest):