test_typing.py (15729B)
1 # This Source Code Form is subject to the terms of the Mozilla Public 2 # License, v. 2.0. If a copy of the MPL was not distributed with this 3 # file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 5 from urllib.parse import quote 6 7 from marionette_driver.by import By 8 from marionette_driver.errors import ElementNotInteractableException 9 from marionette_driver.keys import Keys 10 11 from marionette_harness import MarionetteTestCase, skip 12 13 14 def inline(doc): 15 return "data:text/html;charset=utf-8,{}".format(quote(doc)) 16 17 18 class TypingTestCase(MarionetteTestCase): 19 def setUp(self): 20 super(TypingTestCase, self).setUp() 21 22 if self.marionette.session_capabilities["platformName"] == "mac": 23 self.mod_key = Keys.META 24 else: 25 self.mod_key = Keys.CONTROL 26 27 28 class TestTypingChrome(TypingTestCase): 29 def setUp(self): 30 super(TestTypingChrome, self).setUp() 31 self.marionette.set_context("chrome") 32 33 def test_cut_and_paste_shortcuts(self): 34 with self.marionette.using_context("content"): 35 test_html = self.marionette.absolute_url("keyboard.html") 36 self.marionette.navigate(test_html) 37 38 key_reporter = self.marionette.find_element(By.ID, "keyReporter") 39 self.assertEqual("", key_reporter.get_property("value")) 40 key_reporter.send_keys("zyxwvutsr") 41 self.assertEqual("zyxwvutsr", key_reporter.get_property("value")) 42 43 # select all and cut 44 key_reporter.send_keys(self.mod_key, "a") 45 key_reporter.send_keys(self.mod_key, "x") 46 self.assertEqual("", key_reporter.get_property("value")) 47 48 url_bar = self.marionette.execute_script("return gURLBar.inputField") 49 50 # Clear contents first 51 url_bar.send_keys(self.mod_key, "a") 52 url_bar.send_keys(Keys.BACK_SPACE) 53 self.assertEqual("", url_bar.get_property("value")) 54 55 url_bar.send_keys(self.mod_key, "v") 56 self.assertEqual("zyxwvutsr", url_bar.get_property("value")) 57 58 59 class TestTypingContent(TypingTestCase): 60 def test_should_fire_key_press_events(self): 61 test_html = self.marionette.absolute_url("keyboard.html") 62 self.marionette.navigate(test_html) 63 key_reporter = self.marionette.find_element(By.ID, "keyReporter") 64 key_reporter.send_keys("a") 65 result = self.marionette.find_element(By.ID, "result") 66 self.assertTrue("press:" in result.text) 67 68 def test_should_fire_key_down_events(self): 69 test_html = self.marionette.absolute_url("keyboard.html") 70 self.marionette.navigate(test_html) 71 key_reporter = self.marionette.find_element(By.ID, "keyReporter") 72 key_reporter.send_keys("I") 73 result = self.marionette.find_element(By.ID, "result") 74 self.assertTrue("down" in result.text) 75 76 def test_should_fire_key_up_events(self): 77 test_html = self.marionette.absolute_url("keyboard.html") 78 self.marionette.navigate(test_html) 79 80 key_reporter = self.marionette.find_element(By.ID, "keyReporter") 81 key_reporter.send_keys("a") 82 result = self.marionette.find_element(By.ID, "result") 83 self.assertTrue("up:" in result.text) 84 85 def test_should_type_lowercase_characters(self): 86 test_html = self.marionette.absolute_url("keyboard.html") 87 self.marionette.navigate(test_html) 88 89 key_reporter = self.marionette.find_element(By.ID, "keyReporter") 90 key_reporter.send_keys("abc def") 91 self.assertEqual("abc def", key_reporter.get_property("value")) 92 93 def test_should_type_uppercase_characters(self): 94 test_html = self.marionette.absolute_url("keyboard.html") 95 self.marionette.navigate(test_html) 96 97 key_reporter = self.marionette.find_element(By.ID, "keyReporter") 98 key_reporter.send_keys("ABC DEF") 99 self.assertEqual("ABC DEF", key_reporter.get_property("value")) 100 101 def test_cut_and_paste_shortcuts(self): 102 test_html = self.marionette.absolute_url("keyboard.html") 103 self.marionette.navigate(test_html) 104 105 key_reporter = self.marionette.find_element(By.ID, "keyReporter") 106 self.assertEqual("", key_reporter.get_property("value")) 107 key_reporter.send_keys("zyxwvutsr") 108 self.assertEqual("zyxwvutsr", key_reporter.get_property("value")) 109 110 # select all and cut 111 key_reporter.send_keys(self.mod_key, "a") 112 key_reporter.send_keys(self.mod_key, "x") 113 self.assertEqual("", key_reporter.get_property("value")) 114 115 key_reporter.send_keys(self.mod_key, "v") 116 self.assertEqual("zyxwvutsr", key_reporter.get_property("value")) 117 118 def test_should_type_a_quote_characters(self): 119 test_html = self.marionette.absolute_url("keyboard.html") 120 self.marionette.navigate(test_html) 121 122 key_reporter = self.marionette.find_element(By.ID, "keyReporter") 123 key_reporter.send_keys('"') 124 self.assertEqual('"', key_reporter.get_property("value")) 125 126 def test_should_type_an_at_character(self): 127 test_html = self.marionette.absolute_url("keyboard.html") 128 self.marionette.navigate(test_html) 129 130 key_reporter = self.marionette.find_element(By.ID, "keyReporter") 131 key_reporter.send_keys("@") 132 self.assertEqual("@", key_reporter.get_property("value")) 133 134 def test_should_type_a_mix_of_upper_and_lower_case_character(self): 135 test_html = self.marionette.absolute_url("keyboard.html") 136 self.marionette.navigate(test_html) 137 138 key_reporter = self.marionette.find_element(By.ID, "keyReporter") 139 key_reporter.send_keys("me@eXample.com") 140 self.assertEqual("me@eXample.com", key_reporter.get_property("value")) 141 142 def test_arrow_keys_are_not_printable(self): 143 test_html = self.marionette.absolute_url("keyboard.html") 144 self.marionette.navigate(test_html) 145 146 key_reporter = self.marionette.find_element(By.ID, "keyReporter") 147 key_reporter.send_keys(Keys.ARROW_LEFT) 148 self.assertEqual("", key_reporter.get_property("value")) 149 150 def test_will_simulate_a_key_up_when_entering_text_into_input_elements(self): 151 test_html = self.marionette.absolute_url("keyboard.html") 152 self.marionette.navigate(test_html) 153 154 element = self.marionette.find_element(By.ID, "keyUp") 155 element.send_keys("I like cheese") 156 result = self.marionette.find_element(By.ID, "result") 157 self.assertEqual(result.text, "I like cheese") 158 159 def test_will_simulate_a_key_down_when_entering_text_into_input_elements(self): 160 test_html = self.marionette.absolute_url("keyboard.html") 161 self.marionette.navigate(test_html) 162 163 element = self.marionette.find_element(By.ID, "keyDown") 164 element.send_keys("I like cheese") 165 result = self.marionette.find_element(By.ID, "result") 166 # Because the key down gets the result before the input element is 167 # filled, we're a letter short here 168 self.assertEqual(result.text, "I like chees") 169 170 def test_will_simulate_a_key_press_when_entering_text_into_input_elements(self): 171 test_html = self.marionette.absolute_url("keyboard.html") 172 self.marionette.navigate(test_html) 173 174 element = self.marionette.find_element(By.ID, "keyPress") 175 element.send_keys("I like cheese") 176 result = self.marionette.find_element(By.ID, "result") 177 # Because the key down gets the result before the input element is 178 # filled, we're a letter short here 179 self.assertEqual(result.text, "I like chees") 180 181 def test_will_simulate_a_keyup_when_entering_text_into_textareas(self): 182 test_html = self.marionette.absolute_url("keyboard.html") 183 self.marionette.navigate(test_html) 184 185 element = self.marionette.find_element(By.ID, "keyUpArea") 186 element.send_keys("I like cheese") 187 result = self.marionette.find_element(By.ID, "result") 188 self.assertEqual("I like cheese", result.text) 189 190 def test_will_simulate_a_keydown_when_entering_text_into_textareas(self): 191 test_html = self.marionette.absolute_url("keyboard.html") 192 self.marionette.navigate(test_html) 193 194 element = self.marionette.find_element(By.ID, "keyDownArea") 195 element.send_keys("I like cheese") 196 result = self.marionette.find_element(By.ID, "result") 197 # Because the key down gets the result before the input element is 198 # filled, we're a letter short here 199 self.assertEqual(result.text, "I like chees") 200 201 def test_will_simulate_a_keypress_when_entering_text_into_textareas(self): 202 test_html = self.marionette.absolute_url("keyboard.html") 203 self.marionette.navigate(test_html) 204 205 element = self.marionette.find_element(By.ID, "keyPressArea") 206 element.send_keys("I like cheese") 207 result = self.marionette.find_element(By.ID, "result") 208 # Because the key down gets the result before the input element is 209 # filled, we're a letter short here 210 self.assertEqual(result.text, "I like chees") 211 212 def test_should_report_key_code_of_arrow_keys_up_down_events(self): 213 test_html = self.marionette.absolute_url("keyboard.html") 214 self.marionette.navigate(test_html) 215 216 result = self.marionette.find_element(By.ID, "result") 217 element = self.marionette.find_element(By.ID, "keyReporter") 218 219 element.send_keys(Keys.ARROW_DOWN) 220 221 self.assertIn("down: 40", result.text.strip()) 222 self.assertIn("up: 40", result.text.strip()) 223 224 element.send_keys(Keys.ARROW_UP) 225 self.assertIn("down: 38", result.text.strip()) 226 self.assertIn("up: 38", result.text.strip()) 227 228 element.send_keys(Keys.ARROW_LEFT) 229 self.assertIn("down: 37", result.text.strip()) 230 self.assertIn("up: 37", result.text.strip()) 231 232 element.send_keys(Keys.ARROW_RIGHT) 233 self.assertIn("down: 39", result.text.strip()) 234 self.assertIn("up: 39", result.text.strip()) 235 236 # And leave no rubbish/printable keys in the "keyReporter" 237 self.assertEqual("", element.get_property("value")) 238 239 @skip("Reenable in Bug 1068728") 240 def test_numeric_shift_keys(self): 241 test_html = self.marionette.absolute_url("keyboard.html") 242 self.marionette.navigate(test_html) 243 244 result = self.marionette.find_element(By.ID, "result") 245 element = self.marionette.find_element(By.ID, "keyReporter") 246 numeric_shifts_etc = '~!@#$%^&*()_+{}:i"<>?|END~' 247 element.send_keys(numeric_shifts_etc) 248 self.assertEqual(numeric_shifts_etc, element.get_property("value")) 249 self.assertIn(" up: 16", result.text.strip()) 250 251 def test_numeric_non_shift_keys(self): 252 test_html = self.marionette.absolute_url("keyboard.html") 253 self.marionette.navigate(test_html) 254 element = self.marionette.find_element(By.ID, "keyReporter") 255 numeric_line_chars_non_shifted = "`1234567890-=[]\\,.'/42" 256 element.send_keys(numeric_line_chars_non_shifted) 257 self.assertEqual(numeric_line_chars_non_shifted, element.get_property("value")) 258 259 def test_lowercase_alpha_keys(self): 260 test_html = self.marionette.absolute_url("keyboard.html") 261 self.marionette.navigate(test_html) 262 263 element = self.marionette.find_element(By.ID, "keyReporter") 264 lower_alphas = "abcdefghijklmnopqrstuvwxyz" 265 element.send_keys(lower_alphas) 266 self.assertEqual(lower_alphas, element.get_property("value")) 267 268 @skip("Reenable in Bug 1068735") 269 def test_uppercase_alpha_keys(self): 270 test_html = self.marionette.absolute_url("keyboard.html") 271 self.marionette.navigate(test_html) 272 273 result = self.marionette.find_element(By.ID, "result") 274 element = self.marionette.find_element(By.ID, "keyReporter") 275 upper_alphas = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 276 element.send_keys(upper_alphas) 277 self.assertEqual(upper_alphas, element.get_property("value")) 278 self.assertIn(" up: 16", result.text.strip()) 279 280 @skip("Reenable in Bug 1068726") 281 def test_all_printable_keys(self): 282 test_html = self.marionette.absolute_url("keyboard.html") 283 self.marionette.navigate(test_html) 284 285 result = self.marionette.find_element(By.ID, "result") 286 element = self.marionette.find_element(By.ID, "keyReporter") 287 all_printable = ( 288 "!\"#$%&'()*+,-./0123456789:<=>?@ " 289 "ABCDEFGHIJKLMNOPQRSTUVWXYZ [\\]^_`" 290 "abcdefghijklmnopqrstuvwxyz{|}~" 291 ) 292 element.send_keys(all_printable) 293 294 self.assertTrue(all_printable, element.get_property("value")) 295 self.assertIn(" up: 16", result.text.strip()) 296 297 @skip("Reenable in Bug 1068733") 298 def test_special_space_keys(self): 299 test_html = self.marionette.absolute_url("keyboard.html") 300 self.marionette.navigate(test_html) 301 302 element = self.marionette.find_element(By.ID, "keyReporter") 303 element.send_keys("abcd" + Keys.SPACE + "fgh" + Keys.SPACE + "ij") 304 self.assertEqual("abcd fgh ij", element.get_property("value")) 305 306 def test_should_type_an_integer(self): 307 test_html = self.marionette.absolute_url("keyboard.html") 308 self.marionette.navigate(test_html) 309 310 element = self.marionette.find_element(By.ID, "keyReporter") 311 element.send_keys(1234) 312 self.assertEqual("1234", element.get_property("value")) 313 314 def test_should_send_keys_to_elements_without_the_value_attribute(self): 315 test_html = self.marionette.absolute_url("keyboard.html") 316 self.marionette.navigate(test_html) 317 318 # If we don't get an error below we are good 319 self.marionette.find_element(By.TAG_NAME, "body").send_keys("foo") 320 321 def test_appends_to_input_text(self): 322 self.marionette.navigate(inline("<input>")) 323 el = self.marionette.find_element(By.TAG_NAME, "input") 324 el.send_keys("foo") 325 el.send_keys("bar") 326 self.assertEqual("foobar", el.get_property("value")) 327 328 def test_appends_to_textarea(self): 329 self.marionette.navigate(inline("<textarea></textarea>")) 330 textarea = self.marionette.find_element(By.TAG_NAME, "textarea") 331 textarea.send_keys("foo") 332 textarea.send_keys("bar") 333 self.assertEqual("foobar", textarea.get_property("value")) 334 335 def test_send_keys_to_type_input(self): 336 test_html = self.marionette.absolute_url("html5/test_html_inputs.html") 337 self.marionette.navigate(test_html) 338 339 num_input = self.marionette.find_element(By.ID, "number") 340 self.assertEqual( 341 "", self.marionette.execute_script("return arguments[0].value", [num_input]) 342 ) 343 num_input.send_keys("1234") 344 self.assertEqual( 345 "1234", 346 self.marionette.execute_script("return arguments[0].value", [num_input]), 347 ) 348 349 def test_insert_keys(self): 350 l = self.marionette.find_element(By.ID, "change") 351 l.send_keys("abde") 352 self.assertEqual( 353 "abde", self.marionette.execute_script("return arguments[0].value;", [l]) 354 ) 355 356 # Set caret position to the middle of the input text. 357 self.marionette.execute_script( 358 """var el = arguments[0]; 359 el.selectionStart = el.selectionEnd = el.value.length / 2;""", 360 script_args=[l], 361 ) 362 363 l.send_keys("c") 364 self.assertEqual( 365 "abcde", self.marionette.execute_script("return arguments[0].value;", [l]) 366 ) 367 368 369 class TestTypingContentLegacy(TestTypingContent): 370 def setUp(self): 371 super(TestTypingContent, self).setUp() 372 373 self.marionette.delete_session() 374 self.marionette.start_session({"moz:webdriverClick": False})