Skip to content

Commit

Permalink
[wdspec] Extend "WebDriver:FindElementFromShadowRoot" and "WebDriver:…
Browse files Browse the repository at this point in the history
…FindElementsFromShadowRoot" tests for nested shadow roots.

Differential Revision: https://phabricator.services.mozilla.com/D181039

bugzilla-url: https://bugzilla.mozilla.org/show_bug.cgi?id=1822894
gecko-commit: adc3f9bddb8cf0c2bf3ede9f48648c4598dadef7
gecko-reviewers: webdriver-reviewers, whimboo
  • Loading branch information
lutien authored and pull[bot] committed Sep 21, 2023
1 parent 59f5328 commit 98b4a78
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 21 deletions.
39 changes: 29 additions & 10 deletions webdriver/tests/classic/find_element_from_shadow_root/find.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import pytest
from webdriver.client import ShadowRoot
from webdriver.client import Element, ShadowRoot
from webdriver.transport import Response

from tests.support.asserts import assert_error, assert_same_element, assert_success
Expand Down Expand Up @@ -164,21 +164,18 @@ def test_found_element_equivalence(session, get_test_page):
("xpath", "//a")])
@pytest.mark.parametrize("mode", ["open", "closed"])
def test_find_element(session, get_test_page, using, value, mode):
expected_text = "full link text"
session.url = get_test_page(
shadow_doc="<div><a href=# id=linkText>full link text</a></div>",
shadow_doc=f"<div><a href=# id=linkText>{expected_text}</a></div>",
shadow_root_mode=mode,
)
shadow_root = session.find.css("custom-element", all=False).shadow_root

response = find_element(session, shadow_root.id, using, value)
response_value = assert_success(response)
result = find_element(session, shadow_root.id, using, value)
value = assert_success(result)

# Script evaluation cannot use the DOM within a closed shadow root,
# that's why we assert on the copy of the shadow root on window.
expected = session.execute_script("""
return window._shadowRoot.querySelector('#linkText')
""")
assert_same_element(session, response_value, expected)
element = Element.from_json(value, session)
assert element.text == expected_text


@pytest.mark.parametrize("document,value", [
Expand Down Expand Up @@ -226,3 +223,25 @@ def test_find_element_partial_link_text(session, get_test_page, document, value)
response = find_element(session, shadow_root.id, "partial link text", value)
value = assert_success(response)
assert_same_element(session, value, expected)


@pytest.mark.parametrize("mode", ["open", "closed"])
def test_find_element_in_nested_shadow_root(session, get_test_page, mode):
expected_text = "full link text"
session.url = get_test_page(
shadow_doc=f"<div><a href=# id=linkText>{expected_text}</a></div>",
shadow_root_mode=mode,
nested_shadow_dom=True,
)
shadow_root = session.find.css("custom-element", all=False).shadow_root

inner_custom_element = shadow_root.find_element(
"css selector", "inner-custom-element"
)
nested_shadow_root = inner_custom_element.shadow_root

result = find_element(session, nested_shadow_root.id, "css selector", "#linkText")
value = assert_success(result)

element = Element.from_json(value, session)
assert element.text == expected_text
45 changes: 34 additions & 11 deletions webdriver/tests/classic/find_elements_from_shadow_root/find.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import pytest
from webdriver.client import ShadowRoot
from webdriver.client import Element, ShadowRoot
from webdriver.transport import Response

from tests.support.asserts import assert_error, assert_same_element, assert_success
Expand Down Expand Up @@ -165,23 +165,20 @@ def test_find_elements_equivalence(session, get_test_page):
("xpath", "//a")])
@pytest.mark.parametrize("mode", ["open", "closed"])
def test_find_elements(session, get_test_page, using, value, mode):
expected_text = "full link text"
session.url = get_test_page(
shadow_doc="<div><a href=# id=linkText>full link text</a></div>",
shadow_doc=f"<div><a href=# id=linkText>{expected_text}</a></div>",
shadow_root_mode=mode,
)
shadow_root = session.find.css("custom-element", all=False).shadow_root

response = find_elements(session, shadow_root.id, using, value)
response_value = assert_success(response)
result = find_elements(session, shadow_root.id, using, value)
value = assert_success(result)

assert len(response_value) == 1
assert len(value) == 1

# Script evaluation cannot use the DOM within a closed shadow root,
# that's why we assert on the copy of the shadow root on window.
expected = session.execute_script("""
return window._shadowRoot.querySelector('#linkText')
""")
assert_same_element(session, response_value[0], expected)
element = Element.from_json(value[0], session)
assert element.text == expected_text


@pytest.mark.parametrize("document,value", [
Expand Down Expand Up @@ -235,3 +232,29 @@ def test_find_elements_partial_link_text(session, get_test_page, document, value
assert len(value) == 1

assert_same_element(session, value[0], expected)


@pytest.mark.parametrize("mode", ["open", "closed"])
def test_find_elements_in_nested_shadow_root(
session, get_test_page, mode
):
expected_text = "full link text"
session.url = get_test_page(
shadow_doc=f"<div><a href=# id=linkText>{expected_text}</a></div>",
shadow_root_mode=mode,
nested_shadow_dom=True,
)
shadow_root = session.find.css("custom-element", all=False).shadow_root

inner_custom_element = shadow_root.find_element(
"css selector", "inner-custom-element"
)
nested_shadow_root = inner_custom_element.shadow_root

result = find_elements(session, nested_shadow_root.id, "css selector", "#linkText")
value = assert_success(result)

assert len(value) == 1

element = Element.from_json(value[0], session)
assert element.text == expected_text

0 comments on commit 98b4a78

Please sign in to comment.