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

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

Нюанс · 13:00

Не лікуйте нечіткий locator через `first()`

Playwright радить використовувати first() і last() обережно: після зміни сторінки вони можуть вибрати інший елемент. Краще сформувати унікальний locator за роллю, назвою або іншим стабільним контрактом.

1. Рефакторинг та оптимізація, KISS, DRY, DAMP, YAGNI →

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

Відтворити mobile/desktop collision

Створити DOM fixture з двома forms і однаковими field identifiers.
Підтвердити strictness failure для global locator.
Звузити пошук до visible container.
Scoped locator проходить без .first і .nth().

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

Практика · 27:20

Замінити крихкий локатор на user-facing locator

Знайдіть у власному тесті інтерактивний елемент, який зараз шукається за CSS-класом або вкладеною структурою.
Перевірте його role та accessible name у Accessibility Tree.
Замініть локатор на get_by_role(..., name=...) і запустіть цільовий тест.
Локатор однозначно знаходить потрібний елемент, а тест проходить без nth(), first або прив’язки до CSS оформлення.

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

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

Множинні збіги, `filter()` і `first()`

Playwright у strict mode очікує один елемент для дії або перевірки. Загальний локатор `h3` повертає багато заголовків, тому тест падає. `first()` технічно усуває множинність, але не гарантує, що обрано саме потрібний проєкт: перший елемент може виявитися зовсім іншим. Надійніший підхід — звузити локатор за змістом, наприклад через роль і `name` або через `filter(has_text=target_project)`. `first()` доречний лише тоді, коли порядок є частиною контракту, а не способом приховати нечіткий селектор.

1. Рефакторинг та оптимізація, KISS, DRY, DAMP, YAGNI →

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

Community flow і перші boundary cases

[Дивитися з 01:30](https://www.youtube.com/watch?v=viR9Rnmxse4&t=90s). Початковий end-to-end flow: створити user, створити community, перевірити її сторінку та редагування. Уже тут видно реальні edge cases: auto-generated URL під час створення не обов’язково поводиться так само під час edit, mobile-first layout відрізняється на desktop, а payment merchant потребує окремого test configuration і не має використовувати production credentials.

Практика курсу на YOY, домашні завдання та формат ПМП →

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

Перша задача повинна перевірити потрібну сильну сторону

Базовий onboarding для всіх рівнів включає documentation, доступи, checkout репозиторію та перевірку Jira/CI. Наступну невелику задачу варто обрати за конкретним плюсом, заради якого людину наймали: fintech, maps, CAPTCHA, OTP чи інша domain expertise. Від senior очікується ширше дослідження infrastructure, access, environments і rate limits; middle може зосередитися на локальній реалізації.

Методики проведення співбесід →

Python мануфактура · Сесії: AMA та PMP · 20:00–25:45

Timeout, navigation і стабільність елемента

[Дивитися з 20:00](https://www.youtube.com/watch?v=6QdvE9DHOIY&t=1200s). Timeout можна задавати для конкретної operation або централізовано на рівні page/context. Локальні довільні timeout-и у кожному locator виклику ускладнюють поведінку suite, тому корисніше мати послідовну default policy й змінювати її лише для підтверджених винятків. У відео розбираються load states `domcontentloaded`, `load` і `networkidle`, а також події detach, close та navigation timeout. `networkidle` не є універсальним доказом готовності application: сучасна сторінка може мати постійний network traffic. Надійніша перевірка — очікування конкретного observable UI state через locator або web-first assertion. Стабільний element означає, що його bounding box не змінюється протягом послідовних animation frames. Це захищає від кліку в element, який ще рухається або змінює розмір під час layout/animation.

Як Playwright взаємодіє з браузером через протокол →

Python мануфактура · Програма курсу · 24:55–31:35

Fallback для чистого запуску

Fallback будує context, створює page, авторизується, переходить до Free проєкту й записує `storage_state`. Після цього та сама page передається тесту через `yield`, щоб сценарій продовжився без повторного відкриття вкладки. Під час демонстрації код кілька разів дублюється для швидкої перевірки, а потім уточнюється. Ключовий критерій — окремий Free test має проходити самостійно після видалення всіх локальних state-файлів.

2.1. Storage state: практична реалізація, фікстури для ролей →

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

Списки цін, `max()` і читабельна перевірка

Кілька цін збираються в типізований список, наприклад `list[float]`. `max(prices)` знаходить найбільше значення, а перший елемент можна порівняти з ним, щоб перевірити сортування «від більшої ціни». Навіть коротку, але предметно важливу логіку пропонується оформити функцією на кшталт `is_first_price_highest(prices)`. Назва пояснює вимогу краще, ніж вкладене порівняння всередині великого тесту.

4. Типізація даних (str, int, float, bool) →

Design Patterns для автоматизаторів · 1:13:33–1:23:41

Backend-first automation і тонкий mobile suite

Якщо mobile client переважно відмальовує backend data, основну логіку варто автоматизувати на API-рівні, а на mobile залишити приблизно десяток ключових revenue flows. Якщо ж client містить значну локальну логіку, UI/component coverage потрібно більше. Validation, яка живе всередині форми, доречно перевіряти component test через native framework. Просте відображення backend-масиву краще глибоко перевірити на backend, а на реальному device пройти під час regression. Flaky E2E може вказувати не лише на поганий тест, а й на нестабільність, яку бачать користувачі.

Мобільне тестування та автоматизація →
Запитати в чаті про «first» →