Skip to content

BaseElement

BaseElement

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

Атрибуты

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

Source code in elements\base_element.py
  8
  9
 10
 11
 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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
class BaseElement:
    """Базовый класс для работы с элементами страницы.

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

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

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

        Raises:
            TypeError: Если передан некорректный тип локатора.
        """
        self.page = page
        self.name = name

        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:
        """Возвращает тип элемента.

        Returns:
            Строка с описанием типа элемента.
        """
        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:
        """Получает текст элемента по указанному индексу.

        Args:
            index: Индекс элемента (0 для единичного локатора).

        Returns:
            Текст элемента.
        """
        logger.info(f'Get text for {self.type_of} "{self.name}"')
        return self.locator.nth(index).text_content()

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

        Args:
            timeout: Время ожидания в миллисекундах.
        """
        logger.info(f'Wait for {self.type_of} "{self.name}"')
        self.locator.wait_for(timeout=timeout)

    # Проверки:
    def check_have_text(self, text: str, msg):
        """Проверяет, что элемент содержит указанный текст.

        Args:
            text: Ожидаемый текст.
            msg: Сообщение об ошибке при неудачной проверке.
        """
        logger.info(f'Check that {self.type_of} "{self.name}" has text "{text}"')
        expect(self.locator).to_have_text(text), msg

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

        Args:
            msg: Сообщение об ошибке при неудачной проверке.
        """
        logger.info(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:
        """Проверяет наличие элемента на странице.

        Args:
            timeout: Время ожидания в миллисекундах.

        Returns:
            True, если элемент присутствует, иначе False.
        """
        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:
        """Проверяет отсутствие элемента на странице.

        Args:
            timeout: Время ожидания в миллисекундах.

        Returns:
            True, если элемент отсутствует, иначе False.
        """
        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

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

Returns:

Type Description
str

Строка с описанием типа элемента.

__init__(page, locator, name)

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

Parameters:

Name Type Description Default
page Page

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

required
locator str | Locator

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

required
name str

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

required

Raises:

Type Description
TypeError

Если передан некорректный тип локатора.

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

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

    Raises:
        TypeError: Если передан некорректный тип локатора.
    """
    self.page = page
    self.name = name

    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)

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

Parameters:

Name Type Description Default
text str

Ожидаемый текст.

required
msg

Сообщение об ошибке при неудачной проверке.

required
Source code in elements\base_element.py
75
76
77
78
79
80
81
82
83
def check_have_text(self, text: str, msg):
    """Проверяет, что элемент содержит указанный текст.

    Args:
        text: Ожидаемый текст.
        msg: Сообщение об ошибке при неудачной проверке.
    """
    logger.info(f'Check that {self.type_of} "{self.name}" has text "{text}"')
    expect(self.locator).to_have_text(text), msg

check_presence(msg)

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

Parameters:

Name Type Description Default
msg

Сообщение об ошибке при неудачной проверке.

required
Source code in elements\base_element.py
85
86
87
88
89
90
91
92
93
def check_presence(self, msg):
    """Проверяет видимость элемента на странице.

    Args:
        msg: Сообщение об ошибке при неудачной проверке.
    """
    logger.info(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
48
49
50
51
def click(self) -> None:
    """Кликает на элемент."""
    logger.info(f'Clicking {self.type_of} "{self.name}"')
    self.locator.click()

get_text(index)

Получает текст элемента по указанному индексу.

Parameters:

Name Type Description Default
index int

Индекс элемента (0 для единичного локатора).

required

Returns:

Type Description
str

Текст элемента.

Source code in elements\base_element.py
53
54
55
56
57
58
59
60
61
62
63
def get_text(self, index: int) -> str:
    """Получает текст элемента по указанному индексу.

    Args:
        index: Индекс элемента (0 для единичного локатора).

    Returns:
        Текст элемента.
    """
    logger.info(f'Get text for {self.type_of} "{self.name}"')
    return self.locator.nth(index).text_content()

is_not_present(timeout=5000)

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

Parameters:

Name Type Description Default
timeout int

Время ожидания в миллисекундах.

5000

Returns:

Type Description
bool

True, если элемент отсутствует, иначе False.

Source code in elements\base_element.py
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
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')
    try:
        self.locator.wait_for(timeout=timeout)
    except TimeoutError:
        return True
    return False

is_present(timeout=5000)

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

Parameters:

Name Type Description Default
timeout int

Время ожидания в миллисекундах.

5000

Returns:

Type Description
bool

True, если элемент присутствует, иначе False.

Source code in elements\base_element.py
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
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')
    try:
        self.locator.wait_for(timeout=timeout)
    except TimeoutError:
        return False
    return True

wait_for_element(timeout=12000)

Ожидает появления элемента на странице.

Parameters:

Name Type Description Default
timeout

Время ожидания в миллисекундах.

12000
Source code in elements\base_element.py
65
66
67
68
69
70
71
72
def wait_for_element(self, timeout=12000) -> None:
    """Ожидает появления элемента на странице.

    Args:
        timeout: Время ожидания в миллисекундах.
    """
    logger.info(f'Wait for {self.type_of} "{self.name}"')
    self.locator.wait_for(timeout=timeout)