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

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

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

Доказ незалежності Free fixture

Видаліть локальні state-файли.
Запустіть лише один Free test і перевірте створення state через fallback.
Запустіть той самий тест вдруге й перевірте повторне використання state без другої page.
Обидва запуски проходять окремо; перший створює state, другий його використовує, одночасно відкрита одна page.

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

Що змінилося після запису · 5:30

Playwright setup залежить від версії

У відео рекомендовано API preconditions, reused authenticated state та незалежні test data.

Поточна документація Playwright рекомендує не комітити auth state і використовувати окремий account на parallel worker, якщо tests змінюють shared server-side state. Конкретні fixtures, directories та worker APIs слід звіряти з версією Playwright у проєкті.

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

Приклад коду · 2:55

Окремий context для Free-користувача

Fixture створює isolated BrowserContext із наперед підготовленим Free-state; Enterprise-state має бути окремою fixture або parameterized input із чіткою очікуваною роллю.

Тест стартує у визначеному Free-контексті без умовного розгалуження за випадковим UI-станом.

На сторінці може бути різний контент — що робити? →

Приклад коду · 0:00

Auth state і feature cookie в одному context

Створює context із готовою авторизацією та додає тестовий cookie до переходу на сторінку.

Запити page до example.test містять feature cookie; auth залежить від локального state-файлу.

2. Storage state, cookie manipulation, дебаг зникаючих елементів →

Python мануфактура · Програма курсу · 16:40–20:05

Де й у якому форматі зберігати state

Playwright записує state як JSON із cookies та origins/local storage. Cookie містить `name`, `value`, `domain`, `path`, expiration, `httpOnly`, `secure` та інші параметри; новий context отримує цей файл через `storage_state`. Файл не можна комітити: він може містити чинну сесію та дані внутрішньої інфраструктури. У прикладі state лежить у вже заігнореній `test-results`; окрема директорія також прийнятна, якщо вона гарантовано додана до `.gitignore`.

2. Storage state, cookie manipulation, дебаг зникаючих елементів →

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

`get_or_create_context` без дублювання

Звичайний і Free flows дублювали перевірку state path, options для `new_context`, login та повернення page. Спільна функція `get_or_create_context` будує context і повідомляє, чи потрібна авторизація. Верхні fixtures залишають предметні кроки: звичайна зберігає авторизований state; Free додатково перемикає проєкт і зберігає Free state. Спільний helper не повинен поглинати ці відмінності лише заради меншої кількості рядків.

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

Python мануфактура · Програма курсу · 9:40–12:45

Запуск suites і межі повторного state

Після переходу на `uv` набори запускаються через `uv run pytest` і pytest markers на кшталт `smoke` або `regression`. Перший context виконує login та записує state, наступні contexts завантажують цей файл. Перевірка показує, що оптимізація не виправляє помилки очікувань автоматично: тест може падати через неправильний `is_loaded` або інший homepage state. Треба відрізняти проблему повторної авторизації від помилки самої fixture чи assertion.

2. Storage state, cookie manipulation, дебаг зникаючих елементів →

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

Завантаження `storage_state` у новий context

Самого запису state недостатньо: шлях треба передати в `browser.new_context(storage_state=...)`. Browser options збираються у dictionary, який доповнюється лише тоді, коли шлях передано і файл існує. Урок порівнює два JSON states після перемикання проєкту. Окрім `Company ID`, можуть змінюватися timestamps, analytics cookies і backend session, тому ручне припущення про «єдину різницю» треба перевіряти, а не приймати наперед.

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

Python мануфактура · Програма курсу · 15:40–20:05

Створення state для Free plan

Перший варіант дублює Enterprise state й через стандартний модуль `json` очищає cookie `Company ID`. Пошук проходить масив cookies, змінює лише елемент із потрібним `name` і записує окремий файл. Цей підхід є оптимізацією для конкретного застосунку, а не універсальним правилом Playwright. Якщо backend session або інший state також прив’язаний до tenant, безпечніше реально перемкнути проєкт у браузері й зберегти отриманий context.

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

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

Окрема fixture і виявлення прихованої залежності

`free_project_context` відкриває context із Free state, а тест одразу перевіряє Free UI без login та ручного switch. Перший запуск виявляє проблему: fixture залежить від того, що інший тест уже створив файл авторизації. Тести не повинні залежати від порядку. Якщо state існує — він завантажується; якщо ні — fixture виконує login, перемикає проєкт, перевіряє Free plan і зберігає state сама.

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

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

Банківські процеси, BPMS і state machines

У banking та інших регульованих доменах onboarding може проходити довгий Business Process Management flow з compliance-перевірками. Одна сутність не завжди може одночасно рухатися двома переходами стану, тому паралельні тести на спільному профілі конфліктують або блокують processing. Для стабільної автоматизації потрібно знати state machine, зовнішні залежності та правила блокування. Якщо динамічне створення неможливе, керований pool тестових сутностей має враховувати їх поточний стан, reservation, recovery після падіння тесту та регулярне відновлення після refresh середовища.

Юзер менеджмент та костилі з якими ви стикнетесь в житті →

Python мануфактура · Програма курсу · 0:00–5:35

Навіщо перевикористовувати авторизацію

Повторний login у кожному тесті витрачає час і збільшує кількість нестабільних UI-кроків. Playwright може зберегти cookies та local storage після однієї авторизації, а нові browser contexts стартуватимуть уже в потрібному стані. Таке спільне використання допустиме лише тоді, коли застосунок дозволяє паралельні сесії одного акаунта, а тести не змінюють взаємно залежний server-side стан. `storage state` прибирає login, але не робить інші дані тестів незалежними.

2. Storage state, cookie manipulation, дебаг зникаючих елементів →

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

`yield` і життєвий цикл context

Fixture створює context, завантажує готовий state або виконує login і записує його, після чого віддає page через `yield`. Код після `yield` є teardown і закриває page/context. Важливо повертати вже створену page, а не викликати `new_page()` ще раз. Так test actions, trace і cleanup належать одному browser context.

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

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

Читабельні кроки без зайвого fluent chaining

Page Object збирає технічні дії у предметні кроки авторизації. Перед введенням він чекає готовність полів, після Sign in — очікуваний success state. Це робить тест коротшим, але не приховує важливі переходи стану. Для параметризованих негативних login cases кожен приклад має стартувати з контрольованого стану. Інакше message, що з’явився після першої спроби, може залишитися для наступної та дати false positive. Залежно від продукту потрібні нова сторінка, refresh або явне очищення стану. Повернення `self` з кожного `click()` чи `type_text()` дозволяє chaining, але урок ставиться до цього обережно: ланцюжок не повинен створювати операції, які предметно не мають сенсу. Читабельна окрема дія часто краща за універсальний fluent interface.

2. Selenium організація PageObject's та Очікувань →
Запитати в чаті про «state» →