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)