Skip to content

BaseComponent

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

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

BaseComponent

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

Предоставляет общие методы для взаимодействия с элементами: - получение локаторов - проверка видимости элементов - работа с прокруткой

Source code in components\base_component.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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
class BaseComponent:
    """Базовый компонент для работы с элементами страницы.

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

    def __init__(self, page: Page):
        """Инициализация базового компонента.

        Args:
            page: экземпляр страницы Playwright.
        """

        self.page = page

    # Действия:
    def get_locator(self, locator: str | Locator) -> Locator:
        """Получение объекта Locator из строки или существующего Locator.

        Args:
            locator: строка с CSS/XPath селектором или объект Locator.

        Returns:
            Locator: объект для работы с элементом.

        Raises:
            TypeError: если передан некорректный тип локатора.
        """

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

    # Закомментированный код сохранен без изменений
    # def wait_for_all_elements(self, locator: Locator, timeout=5000):
    #     loc = self.get_locator(locator)
    #     elements = self.page.locator(loc).all()
    #
    #     for element in elements:
    #         self.page.locator(loc).wait_for(timeout=timeout)
    #
    #     return elements

    # Проверки:
    def check_absence(self, locator: str | Locator, msg: str) -> None:
        """Проверка отсутствия элемента на странице.

        Args:
            locator: локатор элемента (строка или объект Locator).
            msg: сообщение об ошибке при неудачной проверке.

        Raises:
            AssertionError: если элемент виден на странице.
        """

        loc = self.get_locator(locator)
        expect(loc).to_be_hidden(timeout=12000), msg

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

        Args:
            locator: локатор элемента (строка или объект Locator).
            msg: сообщение об ошибке при неудачной проверке.

        Raises:
            AssertionError: если элемент не виден на странице.
        """

        loc = self.get_locator(locator)
        expect(loc).to_be_visible(visible=True, timeout=12000), msg

    def is_scrollable_vertically(self, locator: str | Locator) -> bool:
        """Проверка возможности вертикальной прокрутки элемента.

        Args:
            locator: локатор элемента.

        Returns:
            bool: True если элемент можно прокрутить вертикально.
        """

        loc = self.get_locator(locator)
        return loc.evaluate("el => el.scrollHeight > el.clientHeight")

    def is_scrollable_horizontally(self, locator: str | Locator) -> bool:
        """Проверка возможности горизонтальной прокрутки элемента.

        Args:
            locator: локатор элемента.

        Returns:
            bool: True если элемент можно прокрутить горизонтально.
        """

        loc = self.get_locator(locator)
        return loc.evaluate("el => el.scrollWidth > el.clientWidth")

    # Методы прокрутки:
    def scroll_up(self, locator: str | Locator) -> None:
        """Прокрутка элемента вверх.

        Args:
            locator: локатор элемента.

        Raises:
            AssertionError: если прокрутка не выполнена до конца.
        """

        loc = self.get_locator(locator)
        loc.evaluate("el => el.scrollTo(0, 0)")
        loc.wait_for(timeout=2000)

        # Проверка позиции прокрутки
        scroll_position = loc.evaluate("el => el.scrollTop")
        assert scroll_position == 0, "Invalid postion after scroll up"

    def scroll_down(self, locator: str | Locator) -> None:
        """Прокрутка элемента вниз.

        Args:
            locator: локатор элемента.

        Raises:
            AssertionError: если прокрутка не выполнена до конца.
        """

        loc = self.get_locator(locator)
        loc.evaluate("el => el.scrollTo(0, el.scrollHeight)")
        loc.wait_for(timeout=2000)

        # Проверка позиции прокрутки
        scroll_position = loc.evaluate("el => el.scrollTop")
        assert scroll_position > 0, "Invalid postion after scroll down"

    def scroll_left(self, locator: str | Locator) -> None:
        """Прокрутка элемента влево.

        Args:
            locator: локатор элемента.

        Raises:
            AssertionError: если прокрутка не выполнена до конца.
        """

        loc = self.get_locator(locator)

        loc.evaluate("el => el.scrollBy(-el.scrollWidth, 0)")

        loc.wait_for(timeout=2000)

        # Проверка позиции прокрутки
        scroll_position = loc.evaluate("el => el.scrollLeft")
        assert scroll_position == 0, "Invalid postion after scroll left"

    def scroll_right(self, locator: str | Locator) -> None:
        """Прокрутка элемента вправо.

        Args:
            locator: локатор элемента.

        Raises:
            AssertionError: если прокрутка не выполнена до конца.
        """

        loc = self.get_locator(locator)

        loc.evaluate("el => el.scrollBy(el.scrollWidth, 0)")

        loc.wait_for(timeout=2000)

        # Проверка позиции прокрутки
        scroll_position = loc.evaluate("el => el.scrollLeft")
        max_scroll_x = loc.evaluate("el => el.scrollWidth - el.clientWidth")
        assert scroll_position >= max_scroll_x, "Invalid postion after scroll right"

__init__(page)

Инициализация базового компонента.

Parameters:

Name Type Description Default
page Page

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

required
Source code in components\base_component.py
21
22
23
24
25
26
27
28
def __init__(self, page: Page):
    """Инициализация базового компонента.

    Args:
        page: экземпляр страницы Playwright.
    """

    self.page = page

check_absence(locator, msg)

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

Parameters:

Name Type Description Default
locator str | Locator

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

required
msg str

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

required

Raises:

Type Description
AssertionError

если элемент виден на странице.

Source code in components\base_component.py
62
63
64
65
66
67
68
69
70
71
72
73
74
def check_absence(self, locator: str | Locator, msg: str) -> None:
    """Проверка отсутствия элемента на странице.

    Args:
        locator: локатор элемента (строка или объект Locator).
        msg: сообщение об ошибке при неудачной проверке.

    Raises:
        AssertionError: если элемент виден на странице.
    """

    loc = self.get_locator(locator)
    expect(loc).to_be_hidden(timeout=12000), msg

check_visibility(locator, msg)

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

Parameters:

Name Type Description Default
locator str | Locator

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

required
msg str

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

required

Raises:

Type Description
AssertionError

если элемент не виден на странице.

Source code in components\base_component.py
76
77
78
79
80
81
82
83
84
85
86
87
88
def check_visibility(self, locator: str | Locator, msg: str) -> None:
    """Проверка видимости элемента на странице.

    Args:
        locator: локатор элемента (строка или объект Locator).
        msg: сообщение об ошибке при неудачной проверке.

    Raises:
        AssertionError: если элемент не виден на странице.
    """

    loc = self.get_locator(locator)
    expect(loc).to_be_visible(visible=True, timeout=12000), msg

get_locator(locator)

Получение объекта Locator из строки или существующего Locator.

Parameters:

Name Type Description Default
locator str | Locator

строка с CSS/XPath селектором или объект Locator.

required

Returns:

Name Type Description
Locator Locator

объект для работы с элементом.

Raises:

Type Description
TypeError

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

Source code in components\base_component.py
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
def get_locator(self, locator: str | Locator) -> Locator:
    """Получение объекта Locator из строки или существующего Locator.

    Args:
        locator: строка с CSS/XPath селектором или объект Locator.

    Returns:
        Locator: объект для работы с элементом.

    Raises:
        TypeError: если передан некорректный тип локатора.
    """

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

is_scrollable_horizontally(locator)

Проверка возможности горизонтальной прокрутки элемента.

Parameters:

Name Type Description Default
locator str | Locator

локатор элемента.

required

Returns:

Name Type Description
bool bool

True если элемент можно прокрутить горизонтально.

Source code in components\base_component.py
103
104
105
106
107
108
109
110
111
112
113
114
def is_scrollable_horizontally(self, locator: str | Locator) -> bool:
    """Проверка возможности горизонтальной прокрутки элемента.

    Args:
        locator: локатор элемента.

    Returns:
        bool: True если элемент можно прокрутить горизонтально.
    """

    loc = self.get_locator(locator)
    return loc.evaluate("el => el.scrollWidth > el.clientWidth")

is_scrollable_vertically(locator)

Проверка возможности вертикальной прокрутки элемента.

Parameters:

Name Type Description Default
locator str | Locator

локатор элемента.

required

Returns:

Name Type Description
bool bool

True если элемент можно прокрутить вертикально.

Source code in components\base_component.py
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
def is_scrollable_vertically(self, locator: str | Locator) -> bool:
    """Проверка возможности вертикальной прокрутки элемента.

    Args:
        locator: локатор элемента.

    Returns:
        bool: True если элемент можно прокрутить вертикально.
    """

    loc = self.get_locator(locator)
    return loc.evaluate("el => el.scrollHeight > el.clientHeight")

scroll_down(locator)

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

Parameters:

Name Type Description Default
locator str | Locator

локатор элемента.

required

Raises:

Type Description
AssertionError

если прокрутка не выполнена до конца.

Source code in components\base_component.py
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
def scroll_down(self, locator: str | Locator) -> None:
    """Прокрутка элемента вниз.

    Args:
        locator: локатор элемента.

    Raises:
        AssertionError: если прокрутка не выполнена до конца.
    """

    loc = self.get_locator(locator)
    loc.evaluate("el => el.scrollTo(0, el.scrollHeight)")
    loc.wait_for(timeout=2000)

    # Проверка позиции прокрутки
    scroll_position = loc.evaluate("el => el.scrollTop")
    assert scroll_position > 0, "Invalid postion after scroll down"

scroll_left(locator)

Прокрутка элемента влево.

Parameters:

Name Type Description Default
locator str | Locator

локатор элемента.

required

Raises:

Type Description
AssertionError

если прокрутка не выполнена до конца.

Source code in components\base_component.py
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
def scroll_left(self, locator: str | Locator) -> None:
    """Прокрутка элемента влево.

    Args:
        locator: локатор элемента.

    Raises:
        AssertionError: если прокрутка не выполнена до конца.
    """

    loc = self.get_locator(locator)

    loc.evaluate("el => el.scrollBy(-el.scrollWidth, 0)")

    loc.wait_for(timeout=2000)

    # Проверка позиции прокрутки
    scroll_position = loc.evaluate("el => el.scrollLeft")
    assert scroll_position == 0, "Invalid postion after scroll left"

scroll_right(locator)

Прокрутка элемента вправо.

Parameters:

Name Type Description Default
locator str | Locator

локатор элемента.

required

Raises:

Type Description
AssertionError

если прокрутка не выполнена до конца.

Source code in components\base_component.py
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
def scroll_right(self, locator: str | Locator) -> None:
    """Прокрутка элемента вправо.

    Args:
        locator: локатор элемента.

    Raises:
        AssertionError: если прокрутка не выполнена до конца.
    """

    loc = self.get_locator(locator)

    loc.evaluate("el => el.scrollBy(el.scrollWidth, 0)")

    loc.wait_for(timeout=2000)

    # Проверка позиции прокрутки
    scroll_position = loc.evaluate("el => el.scrollLeft")
    max_scroll_x = loc.evaluate("el => el.scrollWidth - el.clientWidth")
    assert scroll_position >= max_scroll_x, "Invalid postion after scroll right"

scroll_up(locator)

Прокрутка элемента вверх.

Parameters:

Name Type Description Default
locator str | Locator

локатор элемента.

required

Raises:

Type Description
AssertionError

если прокрутка не выполнена до конца.

Source code in components\base_component.py
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
def scroll_up(self, locator: str | Locator) -> None:
    """Прокрутка элемента вверх.

    Args:
        locator: локатор элемента.

    Raises:
        AssertionError: если прокрутка не выполнена до конца.
    """

    loc = self.get_locator(locator)
    loc.evaluate("el => el.scrollTo(0, 0)")
    loc.wait_for(timeout=2000)

    # Проверка позиции прокрутки
    scroll_position = loc.evaluate("el => el.scrollTop")
    assert scroll_position == 0, "Invalid postion after scroll up"