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=#> link text </a>", "link text"), 57 ("<a href=#>link<br>text</a>", "link\ntext"), 58 ("<a href=#>link&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=#> partial link text </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&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