From bce102e10fe26fde20c1c32cc971d79a6c7a0fb8 Mon Sep 17 00:00:00 2001 From: "dmy.berezovskyi" Date: Mon, 10 Mar 2025 23:13:41 +0200 Subject: [PATCH] added to swipe and tap --- src/screens/base_screen.py | 70 ++++++++++++++----- src/screens/{main => main_screen}/__init__.py | 0 .../{main => main_screen}/main_screen.py | 5 +- tests/test_p1/test_actions.py | 15 ++++ tests/test_p1/test_p1.py | 7 -- 5 files changed, 73 insertions(+), 24 deletions(-) rename src/screens/{main => main_screen}/__init__.py (100%) rename src/screens/{main => main_screen}/main_screen.py (63%) create mode 100644 tests/test_p1/test_actions.py delete mode 100644 tests/test_p1/test_p1.py diff --git a/src/screens/base_screen.py b/src/screens/base_screen.py index ee5036d..8583d46 100644 --- a/src/screens/base_screen.py +++ b/src/screens/base_screen.py @@ -1,6 +1,9 @@ import time from typing import Tuple, Literal +from selenium.webdriver.common.actions.action_builder import ActionBuilder +from selenium.webdriver.common.actions.pointer_actions import PointerActions + from screens.element_interactor import ElementInteractor from appium.webdriver.extensions.action_helpers import ActionHelpers, ActionChains @@ -21,22 +24,57 @@ def click( element.click() def tap(self, locator, **kwargs): - element = self.element(locator, condition="clickable", **kwargs) - self.driver.tap() - action_helpers = ActionHelpers() - action_helpers.tap(element) - - def tap_by_coordinates(self): - pass - - def swipe(self): - pass - - def type(self): - pass - - def double_tap(self): - pass + """Taps on an element using ActionHelpers.""" + try: + element = self.element(locator, condition="clickable", **kwargs) + location = element.location + size = element.size + x = location["x"] + size["width"] // 2 + y = location["y"] + size["height"] // 2 + self.driver.tap([(x, y)]) + except Exception as e: + print(f"Error during tap action: {e}") + + def swipe( + self, + relative_start_x: float, + relative_start_y: float, + relative_end_x: float, + relative_end_y: float, + duration_ms: int = 200, + ) -> None: + size = self.driver.get_window_size() + width = size["width"] + height = size["height"] + start_x = int(width * relative_start_x) + start_y = int(height * relative_start_y) + end_x = int(width * relative_end_x) + end_y = int(height * relative_end_y) + self.driver.swipe( + start_x=start_x, + start_y=start_y, + end_x=end_x, + end_y=end_y, + duration_ms=duration_ms, + ) + + def type(self, locator: Locator, text: str): + element = self.element(locator) + element.send_keys(text) + + def double_tap( + self, + locator: Locator, + condition: Literal["clickable", "visible", "present"] = "clickable", + **kwargs, + ): + """Double taps on an element.""" + try: + element = self.element(locator, condition=condition, **kwargs) + action = ActionHelpers() + action.double_tap(element).perform() + except Exception as e: + print(f"Error during double tap action: {e}") def long_press(self): pass diff --git a/src/screens/main/__init__.py b/src/screens/main_screen/__init__.py similarity index 100% rename from src/screens/main/__init__.py rename to src/screens/main_screen/__init__.py diff --git a/src/screens/main/main_screen.py b/src/screens/main_screen/main_screen.py similarity index 63% rename from src/screens/main/main_screen.py rename to src/screens/main_screen/main_screen.py index 476db3f..ddd3440 100644 --- a/src/screens/main/main_screen.py +++ b/src/screens/main_screen/main_screen.py @@ -8,4 +8,7 @@ def __init__(self, driver): super().__init__(driver) def click_on_text_link(self): - self.click(locator = Common.text_link) \ No newline at end of file + self.click(locator = Common.text_link) + + def tap_on_text_link(self): + self.tap(locator = Common.text_link) \ No newline at end of file diff --git a/tests/test_p1/test_actions.py b/tests/test_p1/test_actions.py new file mode 100644 index 0000000..628ff90 --- /dev/null +++ b/tests/test_p1/test_actions.py @@ -0,0 +1,15 @@ +import pytest +from screens.main_screen.main_screen import MainScreen + + +class TestClick: + @pytest.fixture(autouse=True) + def setup(self, driver) -> None: + """Setup common objects for tests after address is set.""" + self.main_screen = MainScreen(driver) + + def test_click(self, setup): + self.main_screen.click_on_text_link() + + def test_tap(self, setup): + self.main_screen.tap_on_text_link() \ No newline at end of file diff --git a/tests/test_p1/test_p1.py b/tests/test_p1/test_p1.py deleted file mode 100644 index c19c875..0000000 --- a/tests/test_p1/test_p1.py +++ /dev/null @@ -1,7 +0,0 @@ -from screens.main.main_screen import MainScreen - - -class TestClick: - def test_click(self, driver): - main = MainScreen(driver) - main.click_on_text_link()