1import pytest
2
3from webdriver.transport import Response
4
5from tests.support.asserts import assert_error, assert_same_element, assert_success
6from tests.support.inline import inline
7
8
9def find_element(session, using, value):
10    return session.transport.send(
11        "POST", "session/{session_id}/element".format(**vars(session)),
12        {"using": using, "value": value})
13
14
15def test_null_parameter_value(session, http):
16    path = "/session/{session_id}/element".format(**vars(session))
17    with http.post(path, None) as response:
18        assert_error(Response.from_http(response), "invalid argument")
19
20
21def test_no_browsing_context(session, closed_window):
22    response = find_element(session, "css selector", "foo")
23    assert_error(response, "no such window")
24
25
26@pytest.mark.parametrize("using", ["a", True, None, 1, [], {}])
27def test_invalid_using_argument(session, using):
28    # Step 1 - 2
29    response = find_element(session, using, "value")
30    assert_error(response, "invalid argument")
31
32
33@pytest.mark.parametrize("value", [None, [], {}])
34def test_invalid_selector_argument(session, value):
35    # Step 3 - 4
36    response = find_element(session, "css selector", value)
37    assert_error(response, "invalid argument")
38
39
40@pytest.mark.parametrize("using,value",
41                         [("css selector", "#linkText"),
42                          ("link text", "full link text"),
43                          ("partial link text", "link text"),
44                          ("tag name", "a"),
45                          ("xpath", "//a")])
46def test_find_element(session, using, value):
47    # Step 8 - 9
48    session.url = inline("<a href=# id=linkText>full link text</a>")
49
50    response = find_element(session, using, value)
51    assert_success(response)
52
53
54@pytest.mark.parametrize("document,value", [
55    ("<a href=#>link text</a>", "link text"),
56    ("<a href=#>&nbsp;link text&nbsp;</a>", "link text"),
57    ("<a href=#>link<br>text</a>", "link\ntext"),
58    ("<a href=#>link&amp;text</a>", "link&text"),
59    ("<a href=#>LINK TEXT</a>", "LINK TEXT"),
60    ("<a href=# style='text-transform: uppercase'>link text</a>", "LINK TEXT"),
61])
62def test_find_element_link_text(session, document, value):
63    # Step 8 - 9
64    session.url = inline(document)
65
66    response = find_element(session, "link text", value)
67    assert_success(response)
68
69
70@pytest.mark.parametrize("document,value", [
71    ("<a href=#>partial link text</a>", "link"),
72    ("<a href=#>&nbsp;partial link text&nbsp;</a>", "link"),
73    ("<a href=#>partial link text</a>", "k t"),
74    ("<a href=#>partial link<br>text</a>", "k\nt"),
75    ("<a href=#>partial link&amp;text</a>", "k&t"),
76    ("<a href=#>PARTIAL LINK TEXT</a>", "LINK"),
77    ("<a href=# style='text-transform: uppercase'>partial link text</a>", "LINK"),
78])
79def test_find_element_partial_link_text(session, document, value):
80    # Step 8 - 9
81    session.url = inline(document)
82
83    response = find_element(session, "partial link text", value)
84    assert_success(response)
85
86
87@pytest.mark.parametrize("using,value", [("css selector", "#wontExist")])
88def test_no_element(session, using, value):
89    # Step 8 - 9
90    response = find_element(session, using, value)
91    assert_error(response, "no such element")
92
93
94@pytest.mark.parametrize("using,value",
95                         [("css selector", "#linkText"),
96                          ("link text", "full link text"),
97                          ("partial link text", "link text"),
98                          ("tag name", "a"),
99                          ("xpath", "//*[name()='a']")])
100def test_xhtml_namespace(session, using, value):
101    session.url = inline("""<a href="#" id="linkText">full link text</a>""",
102                         doctype="xhtml")
103    expected = session.execute_script("return document.links[0]")
104
105    response = find_element(session, using, value)
106    value = assert_success(response)
107    assert_same_element(session, value, expected)
108
109
110@pytest.mark.parametrize("using,value",
111                         [("css selector", ":root"),
112                          ("tag name", "html"),
113                          ("xpath", "/html")])
114def test_htmldocument(session, using, value):
115    session.url = inline("")
116    response = find_element(session, using, value)
117    assert_success(response)
118