def FormFind(): from grab.ext.form import FormExtension g = Grab() g.setup(timeout=30000) g.go("http://www.zjxysy.com/Shownews.asp?id=109445") # form = g._lxml_tree.forms[0] g.choose_form(xpath='//form[@action="Comment.asp?id=109445"]') fields = g.form_fields() # check it g.set_input_by_xpath("//textarea", "sample text") g.set_input_by_xpath('//input[@type="text"]', "sample title") g.submit()
def test_set_methods(self): g = Grab(transport=GRAB_TRANSPORT) SERVER.RESPONSE['get'] = FORMS g.go(SERVER.BASE_URL) self.assertEqual(g._lxml_form, None) g.set_input('gender', '1') self.assertEqual('common_form', g._lxml_form.get('id')) self.assertRaises(KeyError, lambda: g.set_input('query', 'asdf')) g._lxml_form = None g.set_input_by_id('search_box', 'asdf') self.assertEqual('search_form', g._lxml_form.get('id')) g.choose_form(xpath='//form[@id="common_form"]') g.set_input_by_number(0, 'asdf') g._lxml_form = None g.set_input_by_xpath('//*[@name="gender"]', '2') self.assertEqual('common_form', g._lxml_form.get('id'))
def test_set_methods(self): g = Grab(transport=GRAB_TRANSPORT) SERVER.RESPONSE['get'] = FORMS g.go(SERVER.BASE_URL) self.assertEqual(g._lxml_form, None) g.set_input('gender', '1') self.assertEqual('common_form', g._lxml_form.get('id')) self.assertRaises(KeyError, lambda: g.set_input('query', 'asdf')) g._lxml_form = None g.set_input_by_id('search_box', 'asdf') self.assertEqual('search_form', g._lxml_form.get('id')) g.choose_form(xpath='//form[@id="common_form"]') g.set_input_by_number(0, 'asdf') g._lxml_form = None g.set_input_by_xpath('//*[@name="gender"]', '2') self.assertEqual('common_form', g._lxml_form.get('id'))
class TestHtmlForms(TestCase): def setUp(self): SERVER.reset() # Create fake grab instance with fake response self.g = Grab(transport=GRAB_TRANSPORT) self.g.fake_response(FORMS) def test_choose_form(self): """ Test ``choose_form`` method """ # raise errors self.assertRaises(DataNotFound, lambda: self.g.choose_form(10)) self.assertRaises(DataNotFound, lambda: self.g.choose_form(id='bad_id')) self.assertRaises(DataNotFound, lambda: self.g.choose_form(id='fake_form')) self.assertRaises(GrabMisuseError, lambda: self.g.choose_form()) # check results self.g.choose_form(0) self.assertEqual('form', self.g._lxml_form.tag) self.assertEqual('search_form', self.g._lxml_form.get('id')) # reset current form self.g._lxml_form = None self.g.choose_form(id='common_form') self.assertEqual('form', self.g._lxml_form.tag) self.assertEqual('common_form', self.g._lxml_form.get('id')) # reset current form self.g._lxml_form = None self.g.choose_form(name='dummy') self.assertEqual('form', self.g._lxml_form.tag) self.assertEqual('dummy', self.g._lxml_form.get('name')) # reset current form self.g._lxml_form = None self.g.choose_form(xpath='//form[contains(@action, "/dummy")]') self.assertEqual('form', self.g._lxml_form.tag) self.assertEqual('dummy', self.g._lxml_form.get('name')) def assertEqualQueryString(self, qs1, qs2): args1 = set([(x, y[0]) for x, y in parse_qsl(qs1)]) args2 = set([(x, y[0]) for x, y in parse_qsl(qs2)]) self.assertEqual(args1, args2) def test_submit(self): g = Grab(transport=GRAB_TRANSPORT) SERVER.RESPONSE['get'] = POST_FORM g.go(SERVER.BASE_URL) g.set_input('name', 'Alex') g.submit() self.assertEqualQueryString(SERVER.REQUEST['post'], 'name=Alex&secret=123') # Default submit control SERVER.RESPONSE['get'] = MULTIPLE_SUBMIT_FORM g.go(SERVER.BASE_URL) g.submit() self.assertEqualQueryString(SERVER.REQUEST['post'], 'secret=123&submit1=submit1') # Selected submit control SERVER.RESPONSE['get'] = MULTIPLE_SUBMIT_FORM g.go(SERVER.BASE_URL) g.submit(submit_name='submit2') self.assertEqualQueryString(SERVER.REQUEST['post'], 'secret=123&submit2=submit2') # Default submit control if submit control name is invalid SERVER.RESPONSE['get'] = MULTIPLE_SUBMIT_FORM g.go(SERVER.BASE_URL) g.submit(submit_name='submit3') self.assertEqualQueryString(SERVER.REQUEST['post'], 'secret=123&submit1=submit1') def test_set_methods(self): g = Grab(transport=GRAB_TRANSPORT) SERVER.RESPONSE['get'] = FORMS g.go(SERVER.BASE_URL) self.assertEqual(g._lxml_form, None) g.set_input('gender', '1') self.assertEqual('common_form', g._lxml_form.get('id')) self.assertRaises(KeyError, lambda: g.set_input('query', 'asdf')) g._lxml_form = None g.set_input_by_id('search_box', 'asdf') self.assertEqual('search_form', g._lxml_form.get('id')) g.choose_form(xpath='//form[@id="common_form"]') g.set_input_by_number(0, 'asdf') g._lxml_form = None g.set_input_by_xpath('//*[@name="gender"]', '2') self.assertEqual('common_form', g._lxml_form.get('id')) def test_html_without_forms(self): g = Grab(transport=GRAB_TRANSPORT) SERVER.RESPONSE['get'] = NO_FORM_HTML g.go(SERVER.BASE_URL) self.assertRaises(DataNotFound, lambda: g.form) def test_disabled_radio(self): """ Bug #57 """ g = Grab(transport=GRAB_TRANSPORT) SERVER.RESPONSE['get'] = DISABLED_RADIO_HTML g.go(SERVER.BASE_URL) g.submit(make_request=False)
class TestHtmlForms(TestCase): def setUp(self): SERVER.reset() # Create fake grab instance with fake response self.g = Grab(transport=GRAB_TRANSPORT) self.g.fake_response(FORMS) def test_choose_form(self): """ Test ``choose_form`` method """ # raise errors self.assertRaises(DataNotFound, lambda: self.g.choose_form(10)) self.assertRaises(DataNotFound, lambda: self.g.choose_form(id='bad_id')) self.assertRaises(DataNotFound, lambda: self.g.choose_form(id='fake_form')) self.assertRaises(GrabMisuseError, lambda: self.g.choose_form()) # check results self.g.choose_form(0) self.assertEqual('form', self.g._lxml_form.tag) self.assertEqual('search_form', self.g._lxml_form.get('id')) # reset current form self.g._lxml_form = None self.g.choose_form(id='common_form') self.assertEqual('form', self.g._lxml_form.tag) self.assertEqual('common_form', self.g._lxml_form.get('id')) # reset current form self.g._lxml_form = None self.g.choose_form(name='dummy') self.assertEqual('form', self.g._lxml_form.tag) self.assertEqual('dummy', self.g._lxml_form.get('name')) # reset current form self.g._lxml_form = None self.g.choose_form(xpath='//form[contains(@action, "/dummy")]') self.assertEqual('form', self.g._lxml_form.tag) self.assertEqual('dummy', self.g._lxml_form.get('name')) def assertEqualQueryString(self, qs1, qs2): args1 = set([(x, y[0]) for x, y in parse_qsl(qs1)]) args2 = set([(x, y[0]) for x, y in parse_qsl(qs2)]) self.assertEqual(args1, args2) def test_submit(self): g = Grab(transport=GRAB_TRANSPORT) SERVER.RESPONSE['get'] = POST_FORM g.go(SERVER.BASE_URL) g.set_input('name', 'Alex') g.submit() self.assertEqualQueryString(SERVER.REQUEST['post'], 'name=Alex&secret=123') # Default submit control SERVER.RESPONSE['get'] = MULTIPLE_SUBMIT_FORM g.go(SERVER.BASE_URL) g.submit() self.assertEqualQueryString(SERVER.REQUEST['post'], 'secret=123&submit1=submit1') # Selected submit control SERVER.RESPONSE['get'] = MULTIPLE_SUBMIT_FORM g.go(SERVER.BASE_URL) g.submit(submit_name='submit2') self.assertEqualQueryString(SERVER.REQUEST['post'], 'secret=123&submit2=submit2') # Default submit control if submit control name is invalid SERVER.RESPONSE['get'] = MULTIPLE_SUBMIT_FORM g.go(SERVER.BASE_URL) g.submit(submit_name='submit3') self.assertEqualQueryString(SERVER.REQUEST['post'], 'secret=123&submit1=submit1') def test_set_methods(self): g = Grab(transport=GRAB_TRANSPORT) SERVER.RESPONSE['get'] = FORMS g.go(SERVER.BASE_URL) self.assertEqual(g._lxml_form, None) g.set_input('gender', '1') self.assertEqual('common_form', g._lxml_form.get('id')) self.assertRaises(KeyError, lambda: g.set_input('query', 'asdf')) g._lxml_form = None g.set_input_by_id('search_box', 'asdf') self.assertEqual('search_form', g._lxml_form.get('id')) g.choose_form(xpath='//form[@id="common_form"]') g.set_input_by_number(0, 'asdf') g._lxml_form = None g.set_input_by_xpath('//*[@name="gender"]', '2') self.assertEqual('common_form', g._lxml_form.get('id')) def test_html_without_forms(self): g = Grab(transport=GRAB_TRANSPORT) SERVER.RESPONSE['get'] = NO_FORM_HTML g.go(SERVER.BASE_URL) self.assertRaises(DataNotFound, lambda: g.form) def test_disabled_radio(self): """ Bug #57 """ g = Grab(transport=GRAB_TRANSPORT) SERVER.RESPONSE['get'] = DISABLED_RADIO_HTML g.go(SERVER.BASE_URL) g.submit(make_request=False)