import logging from contextlib import suppress, nullcontext from ui_automation_framework.utils import CoreConfig from appium.webdriver.webdriver import WebDriver from selenium.common.exceptions import NoSuchElementException, ElementNotVisibleException, \ ElementNotSelectableException, StaleElementReferenceException from waiting import TimeoutExpired from ui_automation_framework.utils import logger as cl from src.helpers.waiting_wrapper import wait class BaseUIElement: log = cl.Logger(logging.DEBUG) def __init__(self, driver: WebDriver, locator, name): self.driver = driver self.locator = locator self.name = name @property def _element(self): self.log.info(f"Getting an element {self.locator[1]} using locating strategy {self.locator[0]}") try: element = self.driver.find_element(self.locator[0], self.locator[1]) except StaleElementReferenceException: element = self.driver.find_element(self.locator[0], self.locator[1]) return element @property def enabled(self): return self._element.get_attribute("enabled") @property def label(self): return self._element.get_attribute("label") @property def attr_name(self): return self._element.get_attribute("name") @property def value(self): return self._element.get_attribute("value") @property def visible_text(self): self.wait(to_assert=False) return self._element.text def is_visible(self): with suppress(NoSuchElementException, ElementNotVisibleException, ElementNotSelectableException): self.log.info(f"Element is {self._element}") self.log.info(f"Getting visibility attribute of an {self.locator[1]} is {self._element.is_displayed()}") return self._element.is_displayed() return False def swipe_right_long(self): # aka mobile_horizontal_swipe_right size = self.driver.get_window_size() location = self._element.location start_x = size["width"] * 0.07 start_y = location["y"] + 30 end_x = size["width"] * 0.09 end_y = location["y"] + 30 self.driver.swipe(start_x, start_y, end_x, end_y, ) # TouchAction(self.driver).long_press(x=size["width"] * 0.07, y=location["y"] + 30).move_to( # x=size["width"] * 0.9, y=location["y"] + 30 # ).release().perform() def swipe_left_long(self): # aka mobile_horizontal_swipe_left size = self.driver.get_window_size() location = self._element.location start_x = size["width"] * 0.9 start_y = location["y"] + 30 end_x = size["width"] * 0.07 end_y = location["y"] + 30 self.driver.swipe(start_x, start_y, end_x, end_y) # TouchAction(self.driver).long_press(x=size["width"] * 0.9, y=location["y"] + 30).move_to( # x=size["width"] * 0.07, y=location["y"] + 30 # ).release().perform() def wait(self, timeout=int(CoreConfig.SELENIUM_TIMEOUT), to_assert=True): cm = nullcontext() if to_assert else suppress(TimeoutExpired) with cm: wait(self.is_visible, timeout=timeout, exceptions=(NoSuchElementException, ElementNotVisibleException, ElementNotSelectableException, StaleElementReferenceException)) self.log.info(f"Waiting for visibility of an {self.locator[1]} for {timeout}") def __repr__(self): return self.__str__()