1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
from __future__ import absolute_import
import unittest
import lxml.html
from .common_imports import doctest, HelperTestCase, skipif
try:
import cssselect
except ImportError:
cssselect = None
HTML = '''
<div>
<a href="foo">link</a>
<a>anchor</a>
</div>
'''
class CSSTestCase(HelperTestCase):
pytestmark = skipif('cssselect is None')
def test_cssselect(self):
div, = lxml.html.fromstring(HTML).xpath('//div')
def count(selector, expected_count, **kwargs):
result = div.cssselect(selector, **kwargs)
self.assertEqual(len(result), expected_count)
count('div', 1)
count('a', 2)
count('em', 0)
# Element names are case-insensitive in HTML
count('DIV', 1)
# ... but not in XHTML or XML
count('DIV', 0, translator='xhtml')
count('DIV', 0, translator='xml')
# :contains() is case-insensitive in lxml
count(':contains("link")', 2) # div, a
count(':contains("LInk")', 2)
# Whatever the document language
count(':contains("LInk")', 2, translator='xhtml')
count(':contains("LInk")', 2, translator='xml')
# ... but not in upstream cssselect
import cssselect
count(':contains("link")', 2, translator=cssselect.HTMLTranslator())
count(':contains("LInk")', 0, translator=cssselect.HTMLTranslator())
def test_suite():
suite = unittest.TestSuite()
try:
import cssselect
except ImportError:
# no 'cssselect' installed
print("Skipping tests in lxml.cssselect - external cssselect package is not installed")
return suite
import lxml.cssselect
suite.addTests(doctest.DocTestSuite(lxml.cssselect))
suite.addTests([unittest.makeSuite(CSSTestCase)])
return suite
|