|
Packit Service |
b74dd5 |
import unittest
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
import lxml.html
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
from lxml.tests.common_imports import doctest, HelperTestCase, skipif
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
try:
|
|
Packit Service |
b74dd5 |
import cssselect
|
|
Packit Service |
b74dd5 |
except ImportError:
|
|
Packit Service |
b74dd5 |
cssselect = None
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
HTML = '''
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
link
|
|
Packit Service |
b74dd5 |
anchor
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
'''
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
class CSSTestCase(HelperTestCase):
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
pytestmark = skipif('cssselect is None')
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
def test_cssselect(self):
|
|
Packit Service |
b74dd5 |
div, = lxml.html.fromstring(HTML).xpath('//div')
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
def count(selector, expected_count, **kwargs):
|
|
Packit Service |
b74dd5 |
result = div.cssselect(selector, **kwargs)
|
|
Packit Service |
b74dd5 |
self.assertEqual(len(result), expected_count)
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
count('div', 1)
|
|
Packit Service |
b74dd5 |
count('a', 2)
|
|
Packit Service |
b74dd5 |
count('em', 0)
|
|
Packit Service |
b74dd5 |
# Element names are case-insensitive in HTML
|
|
Packit Service |
b74dd5 |
count('DIV', 1)
|
|
Packit Service |
b74dd5 |
# ... but not in XHTML or XML
|
|
Packit Service |
b74dd5 |
count('DIV', 0, translator='xhtml')
|
|
Packit Service |
b74dd5 |
count('DIV', 0, translator='xml')
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
# :contains() is case-insensitive in lxml
|
|
Packit Service |
b74dd5 |
count(':contains("link")', 2) # div, a
|
|
Packit Service |
b74dd5 |
count(':contains("LInk")', 2)
|
|
Packit Service |
b74dd5 |
# Whatever the document language
|
|
Packit Service |
b74dd5 |
count(':contains("LInk")', 2, translator='xhtml')
|
|
Packit Service |
b74dd5 |
count(':contains("LInk")', 2, translator='xml')
|
|
Packit Service |
b74dd5 |
# ... but not in upstream cssselect
|
|
Packit Service |
b74dd5 |
import cssselect
|
|
Packit Service |
b74dd5 |
count(':contains("link")', 2, translator=cssselect.HTMLTranslator())
|
|
Packit Service |
b74dd5 |
count(':contains("LInk")', 0, translator=cssselect.HTMLTranslator())
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
def test_suite():
|
|
Packit Service |
b74dd5 |
suite = unittest.TestSuite()
|
|
Packit Service |
b74dd5 |
try:
|
|
Packit Service |
b74dd5 |
import cssselect
|
|
Packit Service |
b74dd5 |
except ImportError:
|
|
Packit Service |
b74dd5 |
# no 'cssselect' installed
|
|
Packit Service |
b74dd5 |
print("Skipping tests in lxml.cssselect - external cssselect package is not installed")
|
|
Packit Service |
b74dd5 |
return suite
|
|
Packit Service |
b74dd5 |
|
|
Packit Service |
b74dd5 |
import lxml.cssselect
|
|
Packit Service |
b74dd5 |
suite.addTests(doctest.DocTestSuite(lxml.cssselect))
|
|
Packit Service |
b74dd5 |
suite.addTests([unittest.makeSuite(CSSTestCase)])
|
|
Packit Service |
b74dd5 |
return suite
|