diff --git a/weboob/browser/filters/html.py b/weboob/browser/filters/html.py index 5ab7bfa6b631cbdf8b5a2ed74af0f2fce96843bc..889476f76fe51e5ab8417756465927227aa18586 100644 --- a/weboob/browser/filters/html.py +++ b/weboob/browser/filters/html.py @@ -17,6 +17,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with weboob. If not, see . +from decimal import Decimal import lxml.html as html from six.moves.html_parser import HTMLParser @@ -185,7 +186,16 @@ def filter(self, el): return unicode(el.attrib['value']) except KeyError: return self.default_or_raise(AttributeNotFound('Element %s does not have attribute value' % el)) - # TODO handle html5 number, datetime, etc. + # numeric input + elif el.attrib.get('type', '') in ('number', 'range'): + try: + if '.' in el.attrib.get('step', ''): + + return Decimal(el.attrib['value']) + else: + return int(el.attrib['value']) + except KeyError: + return self.default_or_raise(AttributeNotFound('Element %s does not have attribute value' % el)) else: raise UnrecognizedElement('Element %s is not recognized' % el) elif el.tag == 'textarea': diff --git a/weboob/browser/tests/filters.py b/weboob/browser/tests/filters.py index 1436a607f5b156342497b67207313e65ad3554f1..ce12e898be2f63c65ac02ab02a9574b44e8eeabe 100644 --- a/weboob/browser/tests/filters.py +++ b/weboob/browser/tests/filters.py @@ -15,10 +15,12 @@ # # You should have received a copy of the GNU Lesser General Public License # along with weboob. If not, see . + +from decimal import Decimal from unittest import TestCase from lxml.html import fromstring -from weboob.browser.filters.html import Link +from weboob.browser.filters.html import FormValue, Link from weboob.browser.filters.standard import RawText @@ -51,6 +53,29 @@ def test_first_node_is_element_recursive(self): self.assertEqual("229,90 EUR", RawText('//p', default="foo", children=True)(e)) +class FormValueTest(TestCase): + def setUp(self): + self.e = fromstring(''' +
+ + + + + + + +
+ ''') + + def test_value(self): + self.assertEqual('bonjour', FormValue('//form//input[@name="test_text"]')(self.e)) + self.assertEqual(5, FormValue('//form//input[@name="test_number1"]')(self.e)) + self.assertEqual(Decimal('0.05'), FormValue('//form//input[@name="test_number2"]')(self.e)) + self.assertEqual(True, FormValue('//form//input[@name="test_checkbox1"]')(self.e)) + self.assertEqual(False, FormValue('//form//input[@name="test_checkbox2"]')(self.e)) + self.assertEqual(20, FormValue('//form//input[@name="test_range"]')(self.e)) + + class LinkTest(TestCase): def test_link(self): e = fromstring('Google')