Exemplo n.º 1
0
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()
Exemplo n.º 2
0
    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'))
Exemplo n.º 3
0
    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'))
Exemplo n.º 4
0
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)
Exemplo n.º 5
0
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)