"Fossies" - the Fresh Open Source Software Archive

Member "selenium-selenium-4.8.1/py/test/selenium/webdriver/common/w3c_interaction_tests.py" (17 Feb 2023, 12982 Bytes) of package /linux/www/selenium-selenium-4.8.1.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Python source code syntax highlighting (style: standard) with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file. See also the last Fossies "Diffs" side-by-side code changes report for "w3c_interaction_tests.py": 4.8.0_vs_4.8.1.

    1 # Licensed to the Software Freedom Conservancy (SFC) under one
    2 # or more contributor license agreements.  See the NOTICE file
    3 # distributed with this work for additional information
    4 # regarding copyright ownership.  The SFC licenses this file
    5 # to you under the Apache License, Version 2.0 (the
    6 # "License"); you may not use this file except in compliance
    7 # with the License.  You may obtain a copy of the License at
    8 #
    9 #   http://www.apache.org/licenses/LICENSE-2.0
   10 #
   11 # Unless required by applicable law or agreed to in writing,
   12 # software distributed under the License is distributed on an
   13 # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   14 # KIND, either express or implied.  See the License for the
   15 # specific language governing permissions and limitations
   16 # under the License.
   17 
   18 import pytest
   19 
   20 from selenium.webdriver.common.actions import interaction
   21 from selenium.webdriver.common.actions.action_builder import ActionBuilder
   22 from selenium.webdriver.common.actions.pointer_input import PointerInput
   23 from selenium.webdriver.common.actions.wheel_input import WheelInput
   24 from selenium.webdriver.common.by import By
   25 from selenium.webdriver.common.keys import Keys
   26 from selenium.webdriver.support.ui import WebDriverWait
   27 
   28 
   29 def test_should_be_able_to_get_pointer_and_keyboard_inputs(driver, pages):
   30     actions = ActionBuilder(driver)
   31     pointers = actions.pointer_inputs
   32     keyboards = actions.key_inputs
   33 
   34     assert pointers is not None
   35     assert keyboards is not None
   36 
   37 
   38 @pytest.mark.xfail_safari
   39 @pytest.mark.xfail_remote
   40 def test_sending_keys_to_active_element_with_modifier(driver, pages):
   41     pages.load("formPage.html")
   42     e = driver.find_element(By.ID, "working")
   43     e.click()
   44 
   45     actions = ActionBuilder(driver)
   46     key_action = actions.key_action
   47     key_action.key_down(Keys.SHIFT).send_keys("abc").key_up(Keys.SHIFT)
   48 
   49     actions.perform()
   50 
   51     assert "ABC" == e.get_attribute("value")
   52 
   53 
   54 @pytest.mark.xfail_firefox
   55 @pytest.mark.xfail_remote
   56 def test_can_create_pause_action_on_keyboard(driver, pages):
   57     # If we don't get an error and takes less than 3 seconds to run, we are good
   58     import datetime
   59 
   60     start = datetime.datetime.now()
   61     actions1 = ActionBuilder(driver)
   62     key_actions = actions1.key_action
   63     key_actions.pause(1)
   64     actions1.perform()
   65     finish = datetime.datetime.now()
   66     assert (finish - start).seconds <= 3
   67 
   68     # Add a filler step
   69     actions2 = ActionBuilder(driver)
   70     key_action = actions2.key_action
   71     key_action.pause()
   72     actions2.perform()
   73 
   74 
   75 def test_can_create_pause_action_on_pointer(driver, pages):
   76     # If we don't get an error and takes less than 3 seconds to run, we are good
   77     import datetime
   78 
   79     start = datetime.datetime.now()
   80     actions1 = ActionBuilder(driver)
   81     key_actions = actions1.pointer_action
   82     key_actions.pause(1)
   83     actions1.perform()
   84     finish = datetime.datetime.now()
   85     assert (finish - start).seconds <= 3
   86 
   87     # Add a filler step
   88     actions2 = ActionBuilder(driver)
   89     key_action = actions2.pointer_action
   90     key_action.pause()
   91     actions2.perform()
   92 
   93 
   94 def test_can_clear_actions(driver, pages):
   95     actions = ActionBuilder(driver)
   96     actions.clear_actions()
   97 
   98 
   99 def test_move_and_click(driver, pages):
  100     pages.load("javascriptPage.html")
  101     toClick = driver.find_element(By.ID, "clickField")
  102 
  103     actions = ActionBuilder(driver)
  104     pointer = actions.pointer_action
  105 
  106     pointer.move_to(toClick).click()
  107 
  108     actions.perform()
  109     assert "Clicked" == toClick.get_attribute("value")
  110 
  111 
  112 def test_drag_and_drop(driver, pages):
  113     """Copied from org.openqa.selenium.interactions.TestBasicMouseInterface."""
  114     element_available_timeout = 15
  115     wait = WebDriverWait(driver, element_available_timeout)
  116     pages.load("droppableItems.html")
  117     wait.until(lambda dr: _is_element_available(driver, "draggable"))
  118 
  119     if not _is_element_available(driver, "draggable"):
  120         raise AssertionError("Could not find draggable element after 15 seconds.")
  121 
  122     toDrag = driver.find_element(By.ID, "draggable")
  123     dropInto = driver.find_element(By.ID, "droppable")
  124     actions = ActionBuilder(driver)
  125     pointer = actions.pointer_action
  126     pointer.click_and_hold(toDrag).move_to(dropInto).release()
  127 
  128     actions.perform()
  129 
  130     dropInto = driver.find_element(By.ID, "droppable")
  131     text = dropInto.find_element(By.TAG_NAME, "p").text
  132     assert "Dropped!" == text
  133 
  134 
  135 def test_context_click(driver, pages):
  136     pages.load("javascriptPage.html")
  137     toContextClick = driver.find_element(By.ID, "doubleClickField")
  138 
  139     actions = ActionBuilder(driver)
  140     pointer = actions.pointer_action
  141     pointer.context_click(toContextClick)
  142 
  143     actions.perform()
  144     assert "ContextClicked" == toContextClick.get_attribute("value")
  145 
  146 
  147 @pytest.mark.xfail_firefox
  148 @pytest.mark.xfail_safari
  149 @pytest.mark.xfail_remote(reason="Fails on Travis")
  150 @pytest.mark.xfail_chrome(reason="Fails on Travis")
  151 def test_double_click(driver, pages):
  152     """Copied from org.openqa.selenium.interactions.TestBasicMouseInterface."""
  153     pages.load("javascriptPage.html")
  154     toDoubleClick = driver.find_element(By.ID, "doubleClickField")
  155 
  156     actions = ActionBuilder(driver)
  157     pointer = actions.pointer_action
  158 
  159     pointer.double_click(toDoubleClick)
  160 
  161     actions.perform()
  162     assert "DoubleClicked" == toDoubleClick.get_attribute("value")
  163 
  164 
  165 def test_dragging_element_with_mouse_moves_it_to_another_list(driver, pages):
  166     _perform_drag_and_drop_with_mouse(driver, pages)
  167     dragInto = driver.find_element(By.ID, "sortable1")
  168     assert 6 == len(dragInto.find_elements(By.TAG_NAME, "li"))
  169 
  170 
  171 def test_dragging_element_with_mouse_fires_events(driver, pages):
  172     _perform_drag_and_drop_with_mouse(driver, pages)
  173     dragReporter = driver.find_element(By.ID, "dragging_reports")
  174     assert "Nothing happened. DragOut DropIn RightItem 3" == dragReporter.text
  175 
  176 
  177 @pytest.mark.xfail_firefox
  178 @pytest.mark.xfail_remote
  179 def test_pen_pointer_properties(driver, pages):
  180     pages.load("pointerActionsPage.html")
  181     pointerArea = driver.find_element(By.CSS_SELECTOR, "#pointerArea")
  182     pointer_input = PointerInput(interaction.POINTER_PEN, "pen")
  183     actions = ActionBuilder(driver, mouse=pointer_input)
  184     center = _get_inview_center(pointerArea.rect, _get_viewport_rect(driver))
  185     actions.pointer_action.move_to(pointerArea).pointer_down(pressure=0.36, tilt_x=-72, tilt_y=9, twist=86).move_to(
  186         pointerArea, x=5, y=10
  187     ).pointer_up().move_to(pointerArea, x=5, y=10)
  188     actions.perform()
  189     events = _get_events(driver)
  190     assert events[3]["type"] == "pointerdown"
  191     assert events[3]["pageX"] == pytest.approx(center["x"], abs=1.0)
  192     assert events[3]["pageY"] == pytest.approx(center["y"], abs=1.0)
  193     assert events[3]["target"] == "pointerArea"
  194     assert events[3]["pointerType"] == "pen"
  195     # The default value of width and height for mouse and pen inputs is 1
  196     assert round(events[3]["width"], 2) == 1
  197     assert round(events[3]["height"], 2) == 1
  198     assert round(events[3]["pressure"], 2) == 0.36
  199     assert events[3]["tiltX"] == -72
  200     assert events[3]["tiltY"] == 9
  201     assert events[3]["twist"] == 86
  202     assert events[6]["type"] == "pointermove"
  203     assert events[6]["target"] == "pointerArea"
  204     assert events[6]["pointerType"] == "pen"
  205     assert round(events[6]["width"], 2) == 1
  206     assert round(events[6]["height"], 2) == 1
  207     # The default value of pressure for all inputs is 0.5, other properties are 0
  208     assert round(events[6]["pressure"], 2) == 0.5
  209     assert events[6]["tiltX"] == 0
  210     assert events[6]["tiltY"] == 0
  211     assert events[6]["twist"] == 0
  212 
  213 
  214 @pytest.mark.xfail_firefox
  215 @pytest.mark.xfail_remote
  216 def test_touch_pointer_properties(driver, pages):
  217     pages.load("pointerActionsPage.html")
  218     pointerArea = driver.find_element(By.CSS_SELECTOR, "#pointerArea")
  219     center = _get_inview_center(pointerArea.rect, _get_viewport_rect(driver))
  220     touch_input = PointerInput(interaction.POINTER_TOUCH, "touch")
  221     touch_chain = ActionBuilder(driver, mouse=touch_input)
  222     touch_chain.pointer_action.move_to(pointerArea).pointer_down(
  223         width=23, height=31, pressure=0.78, tilt_x=21, tilt_y=-8, twist=355
  224     ).move_to(
  225         pointerArea, x=10, y=10, width=39, height=35, pressure=0.91, tilt_x=-19, tilt_y=62, twist=345
  226     ).pointer_up().move_to(
  227         pointerArea, x=15, y=15
  228     )
  229     touch_chain.perform()
  230     events = _get_events(driver)
  231     assert len(events) == 7
  232     event_types = [e["type"] for e in events]
  233     assert [
  234         "pointerover",
  235         "pointerenter",
  236         "pointerdown",
  237         "pointermove",
  238         "pointerup",
  239         "pointerout",
  240         "pointerleave",
  241     ] == event_types
  242     assert events[2]["type"] == "pointerdown"
  243     assert events[2]["pageX"] == pytest.approx(center["x"], abs=1.0)
  244     assert events[2]["pageY"] == pytest.approx(center["y"], abs=1.0)
  245     assert events[2]["target"] == "pointerArea"
  246     assert events[2]["pointerType"] == "touch"
  247     assert round(events[2]["width"], 2) == 23
  248     assert round(events[2]["height"], 2) == 31
  249     assert round(events[2]["pressure"], 2) == 0.78
  250     assert events[2]["tiltX"] == 21
  251     assert events[2]["tiltY"] == -8
  252     assert events[2]["twist"] == 355
  253     assert events[3]["type"] == "pointermove"
  254     assert events[3]["pageX"] == pytest.approx(center["x"] + 10, abs=1.0)
  255     assert events[3]["pageY"] == pytest.approx(center["y"] + 10, abs=1.0)
  256     assert events[3]["target"] == "pointerArea"
  257     assert events[3]["pointerType"] == "touch"
  258     assert round(events[3]["width"], 2) == 39
  259     assert round(events[3]["height"], 2) == 35
  260     assert round(events[3]["pressure"], 2) == 0.91
  261     assert events[3]["tiltX"] == -19
  262     assert events[3]["tiltY"] == 62
  263     assert events[3]["twist"] == 345
  264 
  265 
  266 @pytest.mark.xfail_firefox
  267 @pytest.mark.xfail_remote
  268 def test_can_scroll_mouse_wheel(driver, pages):
  269     pages.load("scrollingPage.html")
  270     driver.execute_script("document.scrollingElement.scrollTop = 0")
  271     scrollable = driver.find_element(By.CSS_SELECTOR, "#scrollable")
  272 
  273     wheel_input = WheelInput("wheel")
  274     actions = ActionBuilder(driver, wheel=wheel_input)
  275     actions.wheel_action.scroll(0, 0, 5, 10, 0, scrollable)
  276 
  277     actions.perform()
  278     events = _get_events(driver)
  279     assert len(events) == 1
  280     assert events[0]["type"] == "wheel"
  281     assert events[0]["deltaX"] >= 5
  282     assert events[0]["deltaY"] >= 10
  283     assert events[0]["deltaZ"] == 0
  284     assert events[0]["target"] == "scrollContent"
  285 
  286 
  287 def _perform_drag_and_drop_with_mouse(driver, pages):
  288     """Copied from org.openqa.selenium.interactions.TestBasicMouseInterface."""
  289     pages.load("draggableLists.html")
  290     dragReporter = driver.find_element(By.ID, "dragging_reports")
  291     toDrag = driver.find_element(By.ID, "rightitem-3")
  292     dragInto = driver.find_element(By.ID, "sortable1")
  293 
  294     actions = ActionBuilder(driver)
  295     pointer = actions.pointer_action
  296     pointer.click_and_hold(toDrag).move_to(driver.find_element(By.ID, "leftitem-4")).move_to(dragInto).release()
  297 
  298     assert "Nothing happened." == dragReporter.text
  299 
  300     actions.perform()
  301     assert "Nothing happened. DragOut" in dragReporter.text
  302 
  303 
  304 def _is_element_available(driver, id):
  305     """Copied from org.openqa.selenium.interactions.TestBasicMouseInterface."""
  306     try:
  307         driver.find_element(By.ID, id)
  308         return True
  309     except Exception:
  310         return False
  311 
  312 
  313 def _get_events(driver):
  314     """Return list of key events recorded in the test_keys_page fixture."""
  315     events = driver.execute_script("return allEvents.events;") or []
  316     # `key` values in `allEvents` may be escaped (see `escapeSurrogateHalf` in
  317     # test_keys_wdspec.html), so this converts them back into unicode literals.
  318     for e in events:
  319         # example: turn "U+d83d" (6 chars) into u"\ud83d" (1 char)
  320         if "key" in e and e["key"].startswith("U+"):
  321             key = e["key"]
  322             hex_suffix = key[key.index("+") + 1 :]
  323             e["key"] = chr(int(hex_suffix, 16))
  324 
  325         # WebKit sets code as 'Unidentified' for unidentified key codes, but
  326         # tests expect ''.
  327         if "code" in e and e["code"] == "Unidentified":
  328             e["code"] = ""
  329     return events
  330 
  331 
  332 def _get_inview_center(elem_rect, viewport_rect):
  333     x = {
  334         "left": max(0, min(elem_rect["x"], elem_rect["x"] + elem_rect["width"])),
  335         "right": min(viewport_rect["width"], max(elem_rect["x"], elem_rect["x"] + elem_rect["width"])),
  336     }
  337 
  338     y = {
  339         "top": max(0, min(elem_rect["y"], elem_rect["y"] + elem_rect["height"])),
  340         "bottom": min(viewport_rect["height"], max(elem_rect["y"], elem_rect["y"] + elem_rect["height"])),
  341     }
  342 
  343     return {
  344         "x": (x["left"] + x["right"]) / 2,
  345         "y": (y["top"] + y["bottom"]) / 2,
  346     }
  347 
  348 
  349 def _get_viewport_rect(driver):
  350     return driver.execute_script(
  351         """
  352         return {
  353           height: window.innerHeight || document.documentElement.clientHeight,
  354           width: window.innerWidth || document.documentElement.clientWidth,
  355         };
  356     """
  357     )