Tests/tests/ui/pages/base_page.py
2026-01-19 23:32:11 +04:00

99 lines
3.9 KiB
Python

from selenium.webdriver import ActionChains
from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException, NoSuchElementException
import allure
import logging
logger = logging.getLogger(__name__)
class BasePage:
def __init__(self, driver: WebDriver):
self.driver = driver
self.wait = WebDriverWait(driver, 10)
self.logger = logger
@allure.step("Открыть URL: {url}")
def open(self, url):
self.driver.get(url)
self.logger.info(f"Открыта страница: {url}")
@allure.step("Обновить страницу")
def refresh(self):
self.driver.refresh()
self.logger.info("Страница обновлена")
@allure.step("Найти элемент: {locator}")
def find_element(self, locator):
try:
element = self.wait.until(EC.visibility_of_element_located(locator))
self.logger.debug(f"Элемент найден: {locator}")
return element
except TimeoutException:
self.logger.error(f"Элемент не найден: {locator}")
allure.attach(
self.driver.get_screenshot_as_png(),
name="element_not_found",
attachment_type=allure.attachment_type.PNG
)
raise
@allure.step("Кликнуть на элемент: {locator}")
def click(self, locator):
element = self.find_element(locator)
element.click()
self.logger.info(f"Клик по элементу: {locator}")
@allure.step("Ввести текст '{text}' в элемент: {locator}")
def type_text(self, locator, text):
element = self.find_element(locator)
element.clear()
element.send_keys(text)
self.logger.info(f"Введен текст '{text}' в элемент: {locator}")
@allure.step("Получить текст элемента: {locator}")
def get_text(self, locator):
element = self.find_element(locator)
text = element.text
self.logger.info(f"Получен текст '{text}' из элемента: {locator}")
return text
@allure.step("Проверить, что элемент видим: {locator}")
def is_visible(self, locator):
try:
element = self.find_element(locator)
is_displayed = element.is_displayed()
self.logger.info(f"Элемент {locator} видим: {is_displayed}")
return is_displayed
except (TimeoutException, NoSuchElementException):
return False
@allure.step("Получить текущий URL")
def get_current_url(self):
url = self.driver.current_url
self.logger.info(f"Текущий URL: {url}")
return url
@allure.step("Сделать скриншот")
def take_screenshot(self, name="screenshot"):
screenshot = self.driver.get_screenshot_as_png()
allure.attach(
screenshot,
name=name,
attachment_type=allure.attachment_type.PNG
)
self.logger.info(f"Скриншот сохранен: {name}")
@allure.step("Ожидание загрузки элемента: {locator}")
def wait_for_element(self, locator, timeout=10):
wait = WebDriverWait(self.driver, timeout)
element = wait.until(EC.visibility_of_element_located(locator))
self.logger.info(f"Элемент загружен: {locator}")
return element
@allure.step("Скролл до элемента")
def scroll_to_element(self, locator):
element = self.find_element(locator)
self.driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", element)