feat(base_element): добавлены аннотации типов для базового элемента
- обавлены аннотации для параметров методов: * msg: str в check_have_text() и check_presence() * timeout: int в wait_for_element(), is_present(), is_not_present() - обавлены возвращаемые типы: * -> None для методов click(), wait_for_element(), check_have_text(), check_presence() * -> bool для is_present() и is_not_present() - обавлена аннотация типа для атрибута locator: Locator зменения улучшают статическую проверку типов и документирование.pull/1/head
parent
1ca9822bac
commit
855d6810fa
|
|
@ -1,4 +1,5 @@
|
||||||
from playwright.sync_api import Page, Locator, expect, TimeoutError
|
from playwright.sync_api import Page, Locator, expect, TimeoutError
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
from tools.logger import get_logger
|
from tools.logger import get_logger
|
||||||
|
|
||||||
|
|
@ -6,27 +7,12 @@ logger = get_logger("BASE_ELEMENT")
|
||||||
|
|
||||||
|
|
||||||
class BaseElement:
|
class BaseElement:
|
||||||
"""Базовый класс для работы с элементами страницы.
|
"""Базовый класс для работы с элементами страницы."""
|
||||||
|
|
||||||
Атрибуты:
|
|
||||||
page: Экземпляр страницы Playwright.
|
|
||||||
name: Название элемента (для логирования).
|
|
||||||
locator: Локатор элемента (строка или объект Locator).
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, page: Page, locator: str | Locator, name: str) -> None:
|
def __init__(self, page: Page, locator: str | Locator, name: str) -> None:
|
||||||
"""Инициализирует базовый элемент страницы.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
page: Экземпляр страницы Playwright.
|
|
||||||
locator: Локатор элемента (строка или объект Locator).
|
|
||||||
name: Название элемента (для логирования).
|
|
||||||
|
|
||||||
Raises:
|
|
||||||
TypeError: Если передан некорректный тип локатора.
|
|
||||||
"""
|
|
||||||
self.page = page
|
self.page = page
|
||||||
self.name = name
|
self.name = name
|
||||||
|
self.locator: Locator
|
||||||
|
|
||||||
if isinstance(locator, Locator):
|
if isinstance(locator, Locator):
|
||||||
self.locator = locator
|
self.locator = locator
|
||||||
|
|
@ -37,70 +23,32 @@ class BaseElement:
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def type_of(self) -> str:
|
def type_of(self) -> str:
|
||||||
"""Возвращает тип элемента.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
Строка с описанием типа элемента.
|
|
||||||
"""
|
|
||||||
return "base element"
|
return "base element"
|
||||||
|
|
||||||
# Действия:
|
# Действия:
|
||||||
def click(self) -> None:
|
def click(self) -> None:
|
||||||
"""Кликает на элемент."""
|
|
||||||
logger.info(f'Clicking {self.type_of} "{self.name}"')
|
logger.info(f'Clicking {self.type_of} "{self.name}"')
|
||||||
self.locator.click()
|
self.locator.click()
|
||||||
|
|
||||||
def get_text(self, index: int) -> str:
|
def get_text(self, index: int) -> str:
|
||||||
"""Получает текст элемента по указанному индексу.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
index: Индекс элемента (0 для единичного локатора).
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
Текст элемента.
|
|
||||||
"""
|
|
||||||
logger.info(f'Get text for {self.type_of} "{self.name}"')
|
logger.info(f'Get text for {self.type_of} "{self.name}"')
|
||||||
return self.locator.nth(index).text_content()
|
return self.locator.nth(index).text_content()
|
||||||
|
|
||||||
def wait_for_element(self, timeout=12000) -> None:
|
def wait_for_element(self, timeout: int = 12000) -> None:
|
||||||
"""Ожидает появления элемента на странице.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
timeout: Время ожидания в миллисекундах.
|
|
||||||
"""
|
|
||||||
logger.info(f'Wait for {self.type_of} "{self.name}"')
|
logger.info(f'Wait for {self.type_of} "{self.name}"')
|
||||||
self.locator.wait_for(timeout=timeout)
|
self.locator.wait_for(timeout=timeout)
|
||||||
|
|
||||||
# Проверки:
|
# Проверки:
|
||||||
def check_have_text(self, text: str, msg):
|
def check_have_text(self, text: str, msg: str) -> None:
|
||||||
"""Проверяет, что элемент содержит указанный текст.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
text: Ожидаемый текст.
|
|
||||||
msg: Сообщение об ошибке при неудачной проверке.
|
|
||||||
"""
|
|
||||||
logger.info(f'Check that {self.type_of} "{self.name}" has text "{text}"')
|
logger.info(f'Check that {self.type_of} "{self.name}" has text "{text}"')
|
||||||
expect(self.locator).to_have_text(text), msg
|
expect(self.locator).to_have_text(text), msg
|
||||||
|
|
||||||
def check_presence(self, msg):
|
def check_presence(self, msg: str) -> None:
|
||||||
"""Проверяет видимость элемента на странице.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
msg: Сообщение об ошибке при неудачной проверке.
|
|
||||||
"""
|
|
||||||
logger.info(f'Check that {self.type_of} "{self.name}" is present')
|
logger.info(f'Check that {self.type_of} "{self.name}" is present')
|
||||||
print(self.locator)
|
print(self.locator)
|
||||||
expect(self.locator).to_be_visible(visible=True, timeout=12000), msg
|
expect(self.locator).to_be_visible(visible=True, timeout=12000), msg
|
||||||
|
|
||||||
def is_present(self, timeout: int = 5000) -> bool:
|
def is_present(self, timeout: int = 5000) -> bool:
|
||||||
"""Проверяет наличие элемента на странице.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
timeout: Время ожидания в миллисекундах.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
True, если элемент присутствует, иначе False.
|
|
||||||
"""
|
|
||||||
logger.info(f'Check that {self.type_of} "{self.name}" is present')
|
logger.info(f'Check that {self.type_of} "{self.name}" is present')
|
||||||
try:
|
try:
|
||||||
self.locator.wait_for(timeout=timeout)
|
self.locator.wait_for(timeout=timeout)
|
||||||
|
|
@ -109,14 +57,6 @@ class BaseElement:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def is_not_present(self, timeout: int = 5000) -> bool:
|
def is_not_present(self, timeout: int = 5000) -> bool:
|
||||||
"""Проверяет отсутствие элемента на странице.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
timeout: Время ожидания в миллисекундах.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
True, если элемент отсутствует, иначе False.
|
|
||||||
"""
|
|
||||||
logger.info(f'Check that {self.type_of} "{self.name}" is missing')
|
logger.info(f'Check that {self.type_of} "{self.name}" is missing')
|
||||||
try:
|
try:
|
||||||
self.locator.wait_for(timeout=timeout)
|
self.locator.wait_for(timeout=timeout)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue