diff --git a/scrapy/http/request/form.py b/scrapy/http/request/form.py index 45cb0074a..91b8557c2 100644 --- a/scrapy/http/request/form.py +++ b/scrapy/http/request/form.py @@ -80,23 +80,26 @@ def _get_inputs(form, formdata, dont_click, clickdata, response): inputs = [(n, v) for n, v in form.form_values() if n not in formdata] if not dont_click: - clickables = [el for el in form.inputs if el.type == 'submit'] - if clickables: - clickable = _get_clickable(clickdata, clickables, form) + clickable = _get_clickable(clickdata, form) + if clickable and clickable[0] not in formdata: inputs.append(clickable) inputs.extend(formdata.iteritems()) return inputs -def _get_clickable(clickdata, clickables, form): +def _get_clickable(clickdata, form): """ Returns the clickable element specified in clickdata, if the latter is given. If not, it returns the first clickable element found """ + clickables = [el for el in form.inputs if el.type == 'submit'] + if not clickables: + return + # If we don't have clickdata, we just use the first clickable element if clickdata is None: - el = clickables.pop(0) + el = clickables[0] return (el.name, el.value) # If clickdata is given, we compare it to the clickable elements to find a @@ -122,4 +125,4 @@ def _get_clickable(clickdata, clickables, form): raise ValueError("Multiple elements found (%r) matching the criteria " "in clickdata: %r" % (el, clickdata)) else: - raise ValueError('No clickeable element matching clickdata: %r' % (clickdata,)) + raise ValueError('No clickable element matching clickdata: %r' % (clickdata,)) diff --git a/scrapy/tests/test_http_request.py b/scrapy/tests/test_http_request.py index d68da49ba..f3ce64af6 100644 --- a/scrapy/tests/test_http_request.py +++ b/scrapy/tests/test_http_request.py @@ -271,54 +271,54 @@ class FormRequestTest(RequestTest): self.assertEqual(fs['one'].value, '1') self.assertEqual(fs['two'].value, '2') - def test_from_response_submit_first_clickeable(self): + def test_from_response_submit_first_clickable(self): respbody = """
""" response = HtmlResponse("http://www.example.com/this/list.html", body=respbody) r1 = self.request_class.from_response(response, formdata={'two': '2'}) urlargs = cgi.parse_qs(urlparse(r1.url).query) - self.assertEqual(urlargs['clickeable1'], ['clicked1']) - self.assertFalse('clickeable2' in urlargs, urlargs) + self.assertEqual(urlargs['clickable1'], ['clicked1']) + self.assertFalse('clickable2' in urlargs, urlargs) self.assertEqual(urlargs['one'], ['1']) self.assertEqual(urlargs['two'], ['2']) - def test_from_response_submit_not_first_clickeable(self): + def test_from_response_submit_not_first_clickable(self): respbody = """ """ response = HtmlResponse("http://www.example.com/this/list.html", body=respbody) - r1 = self.request_class.from_response(response, formdata={'two': '2'}, clickdata={'name': 'clickeable2'}) + r1 = self.request_class.from_response(response, formdata={'two': '2'}, clickdata={'name': 'clickable2'}) urlargs = cgi.parse_qs(urlparse(r1.url).query) - self.assertEqual(urlargs['clickeable2'], ['clicked2']) - self.assertFalse('clickeable1' in urlargs, urlargs) + self.assertEqual(urlargs['clickable2'], ['clicked2']) + self.assertFalse('clickable1' in urlargs, urlargs) self.assertEqual(urlargs['one'], ['1']) self.assertEqual(urlargs['two'], ['2']) def test_from_response_multiple_clickdata(self): respbody = """ """ response = HtmlResponse("http://www.example.com/this/list.html", body=respbody) r1 = self.request_class.from_response(response, \ - clickdata={'name': 'clickeable', 'value': 'clicked2'}) + clickdata={'name': 'clickable', 'value': 'clicked2'}) urlargs = cgi.parse_qs(urlparse(r1.url).query) - self.assertEqual(urlargs['clickeable'], ['clicked2']) + self.assertEqual(urlargs['clickable'], ['clicked2']) self.assertEqual(urlargs['one'], ['clicked1']) self.assertEqual(urlargs['two'], ['clicked2']) @@ -341,45 +341,54 @@ class FormRequestTest(RequestTest): def test_from_response_multiple_forms_clickdata(self): body = u""" """ res = HtmlResponse("http://example.com", body=body, encoding='utf-8') req = self.request_class.from_response(res, \ formname='form2', \ - clickdata={'name': 'clickeable'}) + clickdata={'name': 'clickable'}) urlargs = cgi.parse_qs(urlparse(req.url).query) - self.assertEqual(urlargs['clickeable'], ['clicked']) + self.assertEqual(urlargs['clickable'], ['clicked']) self.assertEqual(urlargs['field2'], ['value2']) self.assertFalse('field1' in urlargs, urlargs) + def test_from_response_multiple_forms_clickdata(self): + body = u'' + res = HtmlResponse("http://example.com", body=body, encoding='utf-8') + req = self.request_class.from_response(res, \ + formdata={'clickme': 'two'}, \ + clickdata={'name': 'clickme'}) + urlargs = cgi.parse_qs(urlparse(req.url).query) + self.assertEqual(urlargs['clickme'], ['two']) + def test_from_response_dont_click(self): respbody = """ """ response = HtmlResponse("http://www.example.com/this/list.html", body=respbody) r1 = self.request_class.from_response(response, dont_click=True) urlargs = cgi.parse_qs(urlparse(r1.url).query) - self.assertFalse('clickeable1' in urlargs, urlargs) - self.assertFalse('clickeable2' in urlargs, urlargs) + self.assertFalse('clickable1' in urlargs, urlargs) + self.assertFalse('clickable2' in urlargs, urlargs) def test_from_response_ambiguous_clickdata(self): respbody = """ """ response = HtmlResponse("http://www.example.com/this/list.html", body=respbody) @@ -391,7 +400,7 @@ class FormRequestTest(RequestTest): def test_from_response_non_matching_clickdata(self): body = """ """ res = HtmlResponse("http://example.com", body=body)