feat(http/parser): extend query selector
This commit is contained in:
parent
db72017810
commit
a4e215c69c
2 changed files with 151 additions and 51 deletions
|
|
@ -7,14 +7,6 @@ from byteb4rb1e.utils.http.parser import Node, TreeBuilder
|
|||
def sample_dom():
|
||||
"""
|
||||
Build a small DOM tree for testing:
|
||||
|
||||
<div id="root" class="container">
|
||||
<p class="text">Hello</p>
|
||||
<span class="text highlight">World</span>
|
||||
<div class="box">
|
||||
<span id="inner">Inside</span>
|
||||
</div>
|
||||
</div>
|
||||
"""
|
||||
html = """
|
||||
<div id="root" class="container">
|
||||
|
|
@ -22,6 +14,7 @@ def sample_dom():
|
|||
<span class="text highlight">World</span>
|
||||
<div class="box">
|
||||
<span id="inner">Inside</span>
|
||||
<span id="inner2">Inside Too</span>
|
||||
</div>
|
||||
</div>
|
||||
"""
|
||||
|
|
@ -33,9 +26,10 @@ def sample_dom():
|
|||
class TestGetElementsByTagName:
|
||||
def test_find_all_spans(self, sample_dom):
|
||||
spans = sample_dom.get_elements_by_tag_name("span")
|
||||
assert len(spans) == 2
|
||||
assert len(spans) == 3
|
||||
assert spans[0].tag == "span"
|
||||
assert spans[1].tag == "span"
|
||||
assert spans[2].tag == "span"
|
||||
|
||||
def test_find_no_matches(self, sample_dom):
|
||||
assert sample_dom.get_elements_by_tag_name("table") == []
|
||||
|
|
@ -82,15 +76,53 @@ class TestQuerySelectorAll:
|
|||
assert items[0].inner_content == "Hello"
|
||||
|
||||
def test_chained_selector(self, sample_dom):
|
||||
items = sample_dom.query_selector_all("div .highlight")
|
||||
items = sample_dom.query_selector_all(".text .highlight")
|
||||
assert len(items) == 1
|
||||
assert items[0].inner_content == "World"
|
||||
|
||||
def test_direct_child(self, sample_dom):
|
||||
items = sample_dom.query_selector_all(".box > #inner")
|
||||
assert len(items) == 1
|
||||
assert items[0].inner_content == "Inside"
|
||||
|
||||
def test_direct_child_no_match(self, sample_dom):
|
||||
items = sample_dom.query_selector_all("div > span.highlight")
|
||||
# highlight span is NOT a direct child of inner div
|
||||
assert len(items) == 0
|
||||
|
||||
def test_attribute_match(self, sample_dom):
|
||||
items = sample_dom.query_selector_all('[id="inner"]')
|
||||
assert len(items) == 1
|
||||
assert items[0].inner_content == "Inside"
|
||||
|
||||
def test_attribute_no_match(self, sample_dom):
|
||||
items = sample_dom.query_selector_all('[data-x="nope"]')
|
||||
assert items == []
|
||||
|
||||
def test_tag_class(self, sample_dom):
|
||||
items = sample_dom.query_selector_all("span.highlight")
|
||||
assert len(items) == 1
|
||||
assert items[0].inner_content == "World"
|
||||
|
||||
def test_multiple_classes(self, sample_dom):
|
||||
items = sample_dom.query_selector_all(".text.highlight")
|
||||
assert len(items) == 1
|
||||
assert items[0].inner_content == "World"
|
||||
|
||||
def test_tag_id_class(self, sample_dom):
|
||||
items = sample_dom.query_selector_all("span#inner")
|
||||
assert len(items) == 1
|
||||
assert items[0].inner_content == "Inside"
|
||||
|
||||
def test_descendant(self, sample_dom):
|
||||
items = sample_dom.query_selector_all("div span")
|
||||
assert len(items) == 2
|
||||
|
||||
|
||||
class TestXPath:
|
||||
def test_simple_tag(self, sample_dom):
|
||||
spans = sample_dom.xpath("//span")
|
||||
assert len(spans) == 2
|
||||
assert len(spans) == 3
|
||||
|
||||
def test_attribute_match(self, sample_dom):
|
||||
nodes = sample_dom.xpath('//span[@id="inner"]')
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue