Skip to content

BaseComponent

BaseComponent

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

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

Атрибуты

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

Source code in components\base_component.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
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
class BaseComponent:
    """Базовый компонент для работы с элементами страницы.

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

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

    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_presence(self, locator, msg):
        """Проверка видимости элемента на странице.

        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) -> 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) -> bool:
        """Проверка возможности горизонтальной прокрутки элемента.

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

        Returns:
            bool: True если элемент можно прокрутить горизонтально
        """
        loc = self.get_locator(locator)
        return loc.evaluate("el => el.scrollWidth > el.clientWidth")

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

        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):
        """Прокрутка элемента вниз.

        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):
        """Прокрутка элемента влево.

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

        Raises:
            AssertionError: если прокрутка не выполнена до конца
        """
        loc = self.get_locator(locator)

        width = loc.evaluate("el => el.scrollWidth")
        loc.scroll_into_view_if_needed()
        self.page.mouse.wheel(-width, 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):
        """Прокрутка элемента вправо.

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

        Raises:
            AssertionError: если прокрутка не выполнена до конца
        """
        loc = self.get_locator(locator)

        width = loc.evaluate("el => el.scrollWidth")
        loc.scroll_into_view_if_needed()
        self.page.mouse.wheel(width, 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
20
21
22
23
24
25
26
def __init__(self, page: Page):
    """Инициализация базового компонента.

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

check_presence(locator, msg)

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

Parameters:

Name Type Description Default
locator

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

required
msg

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

required

Raises:

Type Description
AssertionError

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

Source code in components\base_component.py
59
60
61
62
63
64
65
66
67
68
69
70
def check_presence(self, locator, msg):
    """Проверка видимости элемента на странице.

    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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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

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

required

Returns:

Name Type Description
bool bool

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

Source code in components\base_component.py
84
85
86
87
88
89
90
91
92
93
94
def is_scrollable_horizontally(self, 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

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

required

Returns:

Name Type Description
bool bool

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

Source code in components\base_component.py
72
73
74
75
76
77
78
79
80
81
82
def is_scrollable_vertically(self, 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

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

required

Raises:

Type Description
AssertionError

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

Source code in components\base_component.py
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
def scroll_down(self, locator):
    """Прокрутка элемента вниз.

    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

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

required

Raises:

Type Description
AssertionError

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

Source code in components\base_component.py
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
def scroll_left(self, locator):
    """Прокрутка элемента влево.

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

    Raises:
        AssertionError: если прокрутка не выполнена до конца
    """
    loc = self.get_locator(locator)

    width = loc.evaluate("el => el.scrollWidth")
    loc.scroll_into_view_if_needed()
    self.page.mouse.wheel(-width, 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

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

required

Raises:

Type Description
AssertionError

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

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

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

    Raises:
        AssertionError: если прокрутка не выполнена до конца
    """
    loc = self.get_locator(locator)

    width = loc.evaluate("el => el.scrollWidth")
    loc.scroll_into_view_if_needed()
    self.page.mouse.wheel(width, 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

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

required

Raises:

Type Description
AssertionError

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

Source code in components\base_component.py
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
def scroll_up(self, locator):
    """Прокрутка элемента вверх.

    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"