Python мануфактураJavaDesign Patterns для автоматизаторів

Терміни, нюанси та джерела

Термін · 27:20

Role locator

Playwright locator, який знаходить елемент за доступною роллю та зазвичай accessible name. Офіційна документація радить пріоритезувати user-facing attributes і explicit contracts на кшталт get_by_role().

Майструємо IDE під себе →

Що змінилося після запису · 25:45

Актуальний pytest pattern використовує `item.stash`

У відео phase reports записуються як динамічні attributes на test node, наприклад rep_call.

Поточний official pytest example використовує typed StashKey та item.stash. Manual Playwright tracing також не записує pytest assertion як traced action; він показує browser context навколо failure.

4. Повертаємо traces, pytest hooks, рефакторинг дублювань у fixtures →

Практика · 5:30

Вибір mobile automation strategy

Оберіть один власний mobile flow і визначте, що має перевірятися на backend, native component та system E2E levels.
Складіть мінімальну device matrix із поясненням кожного device та OS version.
Назвіть accessibility attributes, яких бракує для стабільних selectors.
Односторінкова strategy з test levels, device matrix і переліком testability changes.

Типи мобільних застосунків та мобільна автоматизація →

Практика · 0:00

Відокремити local state від instance state

Створи два PageObject instances із різними page values і доведи assertions, що зміна local variable не змінює self.page іншого instance.
Обидва instances мають незалежні page attributes.
У method немає global state.
Автор може пояснити, чому obj.method() передає obj як перший argument.

__init__, self, page та принципи ООП →

Що змінилося після запису · 16:15

Чинний locator guidance Playwright

Поточна документація радить пріоритезувати user-facing attributes, особливо role locators, або explicit testing contracts через test ids. CSS/XPath залишаються fallback, коли ці варіанти непридатні.

3. Селектори та пошук елементів →

Java: архівні доповнення · 2:20–4:45

`id`, attributes і частковий збіг

`#search` знаходить елемент з `id="search"`. Довільний attribute записується у квадратних дужках: `[name='viewport']`. Коли значення має стабільну частину та змінний hash, оператор `*=` дає пошук за підрядком. Це корисно для generated attributes у frontend frameworks, але стабільна частина має бути досить специфічною, щоб не отримати кілька збігів.

CSS і XPath: пошук елементів →

Java: архівні доповнення · 7:55–9:40

Descendants, direct children і кілька attributes

Пробіл між двома CSS-селекторами знаходить descendant на будь-якій глибині. `>` обмежує пошук direct child на наступному рівні DOM. Кілька attributes одного елемента можна послідовно додати без пробілів, щоб звузити результат до елемента, який одночасно відповідає всім умовам.

CSS і XPath: пошук елементів →

Python мануфактура · Програма курсу · 5:45–10:03

Динамічні значення та пошук за частиною атрибута

За стандартом `id` має бути унікальним, але деякі frontend-фреймворки генерують до стабільної частини випадковий суфікс. Повне значення такого `id` може змінитися після нового deployment або навіть між сесіями. CSS дозволяє шукати за точним значенням або за стабільним фрагментом: ```css [id="sort-block-123"] [id*="sort-block"] [class*="text-area"] ``` Оператор `*=` означає «атрибут містить цей текст». Частковий збіг має бути достатньо специфічним, інакше локатор знайде кілька елементів.

3. Селектори та пошук елементів →

Python мануфактура · Сесії: AMA та PMP · 12:00–16:30

Власні test IDs і внесок у frontend

Глибокі XPath не дають переваги в Playwright: потрібні parent/child operations уже є в locator API, а важливішу бізнес-логіку часто краще перевіряти нижче за UI. Команда автоматизації має домовитися з frontend developers про підтримку test attributes і, за можливості, додавати їх через звичайний pull request. Для публічного production DOM слід окремо оцінити, чи не спрощують описові IDs scraping або розкриття внутрішньої структури.

Пріоритети селекторів та їхня надійність →

Python мануфактура · Програма курсу · 16:15–23:35

Побудова читабельних CSS-селекторів

Один елемент можна знайти різними еквівалентними способами: ```css #search [id="search"] input#search ``` Якщо простого атрибута недостатньо, умови комбінуються: ```css a.common-btn.primary[href*="new"] ``` `href` часто стабільний, бо відповідає маршруту застосунку. Водночас найкоротший селектор не завжди найкращий: трохи довший вираз може краще пояснювати на code review, яку саме кнопку він описує. Пріоритет — однозначність і читабельність, а не мінімальна кількість символів.

3. Селектори та пошук елементів →

Python мануфактура · Програма курсу · 17:25–23:40

Типізована відповідь замість raw dictionary

Raw `dict` змушує пам’ятати рядкові ключі й не дає надійного autocomplete. Response перетворюється на невелику `Project` dataclass із фактично потрібними полями, насамперед `id` та attributes. Десеріалізація має відповідати реальній response schema. Не потрібно моделювати всі поля API «про запас»: для поточного vertical slice достатньо тих, які читає тест, з явною помилкою при відсутньому обов’язковому значенні.

3. API preconditions →

Python мануфактура · Програма курсу · 20:25–24:45

`model_validate()`, aliases і форма response

`PydanticModel.model_validate(response_data["data"])` перетворює dictionary на типізований object і водночас перевіряє schema. Модель suite зводиться до реальних полів на кшталт `id`, `type`, `attributes` і `relationships`, а зайві generated wrappers видаляються. Якщо JSON-ключ не є коректним Python-ідентифікатором, наприклад містить дефіс, для поля задається alias. У коді зберігається `snake_case`, а `Pydantic` зіставляє його з оригінальною назвою в JSON.

2. API автоматизація одразу правильно, MVC, pydantic →

Python мануфактура · Сесії: AMA та PMP · 21:30–26:36

AI як помічник для конкретного selector

HTML конкретного елемента можна передати моделі й попросити locator для Playwright або Selenium, уточнивши правила про allowed attributes і partial match. Це швидше за вивчення синтаксису складного XPath, але результат треба перевірити на сторінці. Ще надійніше — мати read access до frontend source, знайти компонент і додати стабільний атрибут у тому самому delivery process.

Пріоритети селекторів та їхня надійність →

Python мануфактура · Програма курсу · 30:59–33:34

Комбінування CSS-умов

Коли одного класу недостатньо, селектор можна зробити однозначнішим, поєднавши клас з атрибутом посилання: ```css a.login-item[href="/users/sign_in"] ``` Це означає: знайти один елемент `<a>`, який одночасно має клас `login-item` і заданий `href`. Наприкінці уроку пропонується самостійно потренувати пошук інших елементів, але не копіювати довгі згенеровані CSS/XPath-ланцюжки без перевірки їхньої стабільності.

2. Перший автотест на Python з Playwright →

Python мануфактура · Програма курсу · 33:00–37:00

Атрибути класу й `self`

У класі значення екземпляра зберігаються як `self.name`. `self` вказує, що атрибут належить конкретному створеному об’єкту, а не є випадковою локальною змінною функції. Методи того самого екземпляра звертаються до цього значення через `self.name`. Якщо пропустити `self`, Python шукатиме локальне або глобальне ім’я й отримає `NameError` або попередження IDE.

4. Типізація даних (str, int, float, bool) →
Запитати в чаті про «attributes» →