1import pytest
2
3from tests.support.asserts import assert_error, assert_same_element, assert_success
4
5
6def get_shadow_root(session, element_id):
7    return session.transport.send(
8        "GET", "session/{session_id}/element/{element_id}/shadow".format(
9            session_id=session.session_id,
10            element_id=element_id))
11
12
13def test_no_top_browsing_context(session, closed_window):
14    original_handle, element = closed_window
15    response = get_shadow_root(session, element.id)
16    assert_error(response, "no such window")
17    response = get_shadow_root(session, "foo")
18    assert_error(response, "no such window")
19
20    session.window_handle = original_handle
21    response = get_shadow_root(session, element.id)
22    assert_error(response, "no such element")
23
24
25def test_no_browsing_context(session, closed_frame):
26    response = get_shadow_root(session, "foo")
27    assert_error(response, "no such window")
28
29
30def test_element_not_found(session):
31    result = get_shadow_root(session, "foo")
32    assert_error(result, "no such element")
33
34
35def test_element_stale(session, checkbox_dom):
36    session.url = checkbox_dom
37    element = session.find.css("custom-checkbox-element", all=False)
38    session.refresh()
39
40    result = get_shadow_root(session, element.id)
41    assert_error(result, "stale element reference")
42
43
44def test_get_shadow_root(session, checkbox_dom):
45    session.url = checkbox_dom
46    expected = session.execute_script(
47        "return document.querySelector('custom-checkbox-element').shadowRoot.host")
48    custom_element = session.find.css("custom-checkbox-element", all=False)
49    response = get_shadow_root(session, custom_element.id)
50    assert_success(response)
51    assert_same_element(session, custom_element, expected)
52
53
54def test_no_shadow_root(session, inline):
55    session.url = inline("<div><p>no shadow root</p></div>")
56    element = session.find.css("div", all=False)
57    response = get_shadow_root(session, element.id)
58    assert_error(response, "no such shadow root")
59