Skip to content

BaseElement

Модуль base_element содержит базовый класс для работы с элементами страницы.

Класс BaseElement предоставляет основные методы взаимодействия с элементами и их проверки через Playwright.

BaseElement

Базовый класс для работы с элементами страницы через Playwright.

Предоставляет основные методы взаимодействия с элементами: клики, получение текста, ожидание и проверки состояния.

Source code in elements\base_element.py
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
class BaseElement:
    """Базовый класс для работы с элементами страницы через Playwright.

    Предоставляет основные методы взаимодействия с элементами:
    клики, получение текста, ожидание и проверки состояния.
    """

    def __init__(self, page: Page, locator: str | Locator, name: str) -> None:
        """Инициализирует базовый элемент страницы.

        Args:
            page: Экземпляр страницы Playwright
            locator: Локатор элемента (строка или объект Locator)
            name: Имя элемента для логирования
        """

        self.page = page
        self.name = name
        self.locator: Locator

        if isinstance(locator, Locator):
            self.locator = locator
        elif isinstance(locator, str):
            self.locator = self.page.locator(locator)
        else:
            raise TypeError("locator value should be string type or Locator type")

    @property
    def type_of(self) -> str:
        """Возвращает тип элемента (для логирования)."""

        return "base element"

    # Действия:
    def click(self) -> None:
        """Выполняет клик по элементу."""

        logger.info(f"Clicking {self.type_of} '{self.name}'")
        self.locator.click()

    def get_text(self, index: int) -> str:
        """Возвращает текст элемента по указанному индексу."""

        logger.info(f"Get text for {self.type_of} '{self.name}'")
        return self.locator.nth(index).text_content()

    def update_locator(self, new_locator: Locator) -> None:
        """Меняет значение локатора для элемента"""

        logger.info(f"Update locator for {self.type_of} '{self.name}'")
        self.locator = new_locator

    def wait_for_element(self, timeout: int = 12000) -> None:
        """Ожидает появление элемента в течение заданного времени."""

        logger.info(f"Wait for {self.type_of} '{self.name}'")
        self.locator.wait_for(timeout=timeout)

    # Проверки:
    def check_have_text(self, text: str, msg: str) -> None:
        """Проверяет наличие указанного текста в элементе."""

        logger.info(f"Check that {self.type_of} '{self.name}' has text '{text}'")
        expect(self.locator).to_have_text(text), msg

    def check_visibility(self, msg: str) -> None:
        """Проверяет видимость элемента на странице."""

        logger.info(f"Check that {self.type_of} '{self.name}' is present")
        # print(f"Check that {self.type_of} '{self.name}' is present")
        # print(self.locator)
        expect(self.locator).to_be_visible(visible=True, timeout=12000), msg

    def is_present(self, timeout: int = 5000) -> bool:
        """Проверяет наличие элемента в течение заданного времени."""

        logger.info(f"Check that {self.type_of} '{self.name}' is present")
        try:
            self.locator.wait_for(timeout=timeout)
        except TimeoutError:
            return False
        return True

    def is_not_present(self, timeout: int = 5000) -> bool:
        """Проверяет отсутствие элемента в течение заданного времени."""

        logger.info(f"Check that {self.type_of} '{self.name}' is missing")
        try:
            self.locator.wait_for(timeout=timeout)
        except TimeoutError:
            return True
        return False

type_of property

Возвращает тип элемента (для логирования).

__init__(page, locator, name)

Инициализирует базовый элемент страницы.

Parameters:

Name Type Description Default
page Page

Экземпляр страницы Playwright

required
locator str | Locator

Локатор элемента (строка или объект Locator)

required
name str

Имя элемента для логирования

required
Source code in elements\base_element.py
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
def __init__(self, page: Page, locator: str | Locator, name: str) -> None:
    """Инициализирует базовый элемент страницы.

    Args:
        page: Экземпляр страницы Playwright
        locator: Локатор элемента (строка или объект Locator)
        name: Имя элемента для логирования
    """

    self.page = page
    self.name = name
    self.locator: Locator

    if isinstance(locator, Locator):
        self.locator = locator
    elif isinstance(locator, str):
        self.locator = self.page.locator(locator)
    else:
        raise TypeError("locator value should be string type or Locator type")

check_have_text(text, msg)

Проверяет наличие указанного текста в элементе.

Source code in elements\base_element.py
71
72
73
74
75
def check_have_text(self, text: str, msg: str) -> None:
    """Проверяет наличие указанного текста в элементе."""

    logger.info(f"Check that {self.type_of} '{self.name}' has text '{text}'")
    expect(self.locator).to_have_text(text), msg

check_visibility(msg)

Проверяет видимость элемента на странице.

Source code in elements\base_element.py
77
78
79
80
81
82
83
def check_visibility(self, msg: str) -> None:
    """Проверяет видимость элемента на странице."""

    logger.info(f"Check that {self.type_of} '{self.name}' is present")
    # print(f"Check that {self.type_of} '{self.name}' is present")
    # print(self.locator)
    expect(self.locator).to_be_visible(visible=True, timeout=12000), msg

click()

Выполняет клик по элементу.

Source code in elements\base_element.py
46
47
48
49
50
def click(self) -> None:
    """Выполняет клик по элементу."""

    logger.info(f"Clicking {self.type_of} '{self.name}'")
    self.locator.click()

get_text(index)

Возвращает текст элемента по указанному индексу.

Source code in elements\base_element.py
52
53
54
55
56
def get_text(self, index: int) -> str:
    """Возвращает текст элемента по указанному индексу."""

    logger.info(f"Get text for {self.type_of} '{self.name}'")
    return self.locator.nth(index).text_content()

is_not_present(timeout=5000)

Проверяет отсутствие элемента в течение заданного времени.

Source code in elements\base_element.py
 95
 96
 97
 98
 99
100
101
102
103
def is_not_present(self, timeout: int = 5000) -> bool:
    """Проверяет отсутствие элемента в течение заданного времени."""

    logger.info(f"Check that {self.type_of} '{self.name}' is missing")
    try:
        self.locator.wait_for(timeout=timeout)
    except TimeoutError:
        return True
    return False

is_present(timeout=5000)

Проверяет наличие элемента в течение заданного времени.

Source code in elements\base_element.py
85
86
87
88
89
90
91
92
93
def is_present(self, timeout: int = 5000) -> bool:
    """Проверяет наличие элемента в течение заданного времени."""

    logger.info(f"Check that {self.type_of} '{self.name}' is present")
    try:
        self.locator.wait_for(timeout=timeout)
    except TimeoutError:
        return False
    return True

update_locator(new_locator)

Меняет значение локатора для элемента

Source code in elements\base_element.py
58
59
60
61
62
def update_locator(self, new_locator: Locator) -> None:
    """Меняет значение локатора для элемента"""

    logger.info(f"Update locator for {self.type_of} '{self.name}'")
    self.locator = new_locator

wait_for_element(timeout=12000)

Ожидает появление элемента в течение заданного времени.

Source code in elements\base_element.py
64
65
66
67
68
def wait_for_element(self, timeout: int = 12000) -> None:
    """Ожидает появление элемента в течение заданного времени."""

    logger.info(f"Wait for {self.type_of} '{self.name}'")
    self.locator.wait_for(timeout=timeout)