tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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})