99 lines
3.9 KiB
Python
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)
|