1import pytest 2 3from tests.support.asserts import assert_error, assert_files_uploaded, assert_success 4 5from . import map_files_to_multiline_text 6 7 8def element_send_keys(session, element, text): 9 return session.transport.send( 10 "POST", "/session/{session_id}/element/{element_id}/value".format( 11 session_id=session.session_id, 12 element_id=element.id), 13 {"text": text}) 14 15 16def test_empty_text(session, inline): 17 session.url = inline("<input type=file>") 18 element = session.find.css("input", all=False) 19 20 response = element_send_keys(session, element, "") 21 assert_error(response, "invalid argument") 22 23 24def test_multiple_files(session, create_files, inline): 25 files = create_files(["foo", "bar"]) 26 27 session.url = inline("<input type=file multiple>") 28 element = session.find.css("input", all=False) 29 30 response = element_send_keys(session, element, 31 map_files_to_multiline_text(files)) 32 assert_success(response) 33 34 assert_files_uploaded(session, element, files) 35 36 37def test_multiple_files_last_path_not_found(session, create_files, inline): 38 files = create_files(["foo", "bar"]) 39 files.append("foo bar") 40 41 session.url = inline("<input type=file multiple>") 42 element = session.find.css("input", all=False) 43 44 response = element_send_keys(session, element, 45 map_files_to_multiline_text(files)) 46 assert_error(response, "invalid argument") 47 48 assert_files_uploaded(session, element, []) 49 50 51def test_multiple_files_without_multiple_attribute(session, create_files, inline): 52 files = create_files(["foo", "bar"]) 53 54 session.url = inline("<input type=file>") 55 element = session.find.css("input", all=False) 56 57 response = element_send_keys(session, element, 58 map_files_to_multiline_text(files)) 59 assert_error(response, "invalid argument") 60 61 assert_files_uploaded(session, element, []) 62 63 64def test_multiple_files_send_twice(session, create_files, inline): 65 first_files = create_files(["foo", "bar"]) 66 second_files = create_files(["john", "doe"]) 67 68 session.url = inline("<input type=file multiple>") 69 element = session.find.css("input", all=False) 70 71 response = element_send_keys(session, element, 72 map_files_to_multiline_text(first_files)) 73 assert_success(response) 74 75 response = element_send_keys(session, element, 76 map_files_to_multiline_text(second_files)) 77 assert_success(response) 78 79 assert_files_uploaded(session, element, first_files + second_files) 80 81 82def test_multiple_files_reset_with_element_clear(session, create_files, inline): 83 first_files = create_files(["foo", "bar"]) 84 second_files = create_files(["john", "doe"]) 85 86 session.url = inline("<input type=file multiple>") 87 element = session.find.css("input", all=False) 88 89 response = element_send_keys(session, element, 90 map_files_to_multiline_text(first_files)) 91 assert_success(response) 92 93 # Reset already uploaded files 94 element.clear() 95 assert_files_uploaded(session, element, []) 96 97 response = element_send_keys(session, element, 98 map_files_to_multiline_text(second_files)) 99 assert_success(response) 100 101 assert_files_uploaded(session, element, second_files) 102 103 104def test_single_file(session, create_files, inline): 105 files = create_files(["foo"]) 106 107 session.url = inline("<input type=file>") 108 element = session.find.css("input", all=False) 109 110 response = element_send_keys(session, element, str(files[0])) 111 assert_success(response) 112 113 assert_files_uploaded(session, element, files) 114 115 116def test_single_file_replaces_without_multiple_attribute(session, create_files, inline): 117 files = create_files(["foo", "bar"]) 118 119 session.url = inline("<input type=file>") 120 element = session.find.css("input", all=False) 121 122 response = element_send_keys(session, element, str(files[0])) 123 assert_success(response) 124 125 response = element_send_keys(session, element, str(files[1])) 126 assert_success(response) 127 128 assert_files_uploaded(session, element, [files[1]]) 129 130 131def test_single_file_appends_with_multiple_attribute(session, create_files, inline): 132 files = create_files(["foo", "bar"]) 133 134 session.url = inline("<input type=file multiple>") 135 element = session.find.css("input", all=False) 136 137 response = element_send_keys(session, element, str(files[0])) 138 assert_success(response) 139 140 response = element_send_keys(session, element, str(files[1])) 141 assert_success(response) 142 143 assert_files_uploaded(session, element, files) 144 145 146def test_transparent(session, create_files, inline): 147 files = create_files(["foo"]) 148 session.url = inline("""<input type=file style="opacity: 0">""") 149 element = session.find.css("input", all=False) 150 151 response = element_send_keys(session, element, str(files[0])) 152 assert_success(response) 153 assert_files_uploaded(session, element, files) 154 155 156def test_obscured(session, create_files, inline): 157 files = create_files(["foo"]) 158 session.url = inline(""" 159 <style> 160 div { 161 position: absolute; 162 width: 100vh; 163 height: 100vh; 164 background: blue; 165 top: 0; 166 left: 0; 167 } 168 </style> 169 170 <input type=file> 171 <div></div> 172 """) 173 element = session.find.css("input", all=False) 174 175 response = element_send_keys(session, element, str(files[0])) 176 assert_success(response) 177 assert_files_uploaded(session, element, files) 178 179 180def test_outside_viewport(session, create_files, inline): 181 files = create_files(["foo"]) 182 session.url = inline("""<input type=file style="margin-left: -100vh">""") 183 element = session.find.css("input", all=False) 184 185 response = element_send_keys(session, element, str(files[0])) 186 assert_success(response) 187 assert_files_uploaded(session, element, files) 188 189 190def test_hidden(session, create_files, inline): 191 files = create_files(["foo"]) 192 session.url = inline("<input type=file hidden>") 193 element = session.find.css("input", all=False) 194 195 response = element_send_keys(session, element, str(files[0])) 196 assert_success(response) 197 assert_files_uploaded(session, element, files) 198 199 200def test_display_none(session, create_files, inline): 201 files = create_files(["foo"]) 202 session.url = inline("""<input type=file style="display: none">""") 203 element = session.find.css("input", all=False) 204 205 response = element_send_keys(session, element, str(files[0])) 206 assert_success(response) 207 assert_files_uploaded(session, element, files) 208 209 210@pytest.mark.capabilities({"strictFileInteractability": True}) 211def test_strict_hidden(session, create_files, inline): 212 files = create_files(["foo"]) 213 session.url = inline("<input type=file hidden>") 214 element = session.find.css("input", all=False) 215 216 response = element_send_keys(session, element, str(files[0])) 217 assert_error(response, "element not interactable") 218 219 220@pytest.mark.capabilities({"strictFileInteractability": True}) 221def test_strict_display_none(session, create_files, inline): 222 files = create_files(["foo"]) 223 session.url = inline("""<input type=file style="display: none">""") 224 element = session.find.css("input", all=False) 225 226 response = element_send_keys(session, element, str(files[0])) 227 assert_error(response, "element not interactable") 228