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

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

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

Fail-fast завантаження локальної конфігурації

Приклад завантажує сусідній .env, перевіряє всі обов’язкові keys і завершується з явною помилкою, якщо конфігурація неповна.

Для підготовленого .env друкується https://example.test; при відсутньому key виникає RuntimeError.

2.1. відео, енв файл →

Термін · 11:51

non-public API

Python convention: name з одним leading underscore вважається implementation detail. Подвійний leading underscore запускає name mangling для уникнення конфліктів, але не гарантує privacy.

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

Приклад коду · 3:30

User-facing locator у незалежному Playwright test

Playwright Test надає isolated page, а locators виражають user-facing contract через label, role і accessible name.

Test проходить лише проти application, що має наведений login contract.

Що має вміти та знати мідл автоматизатор →

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

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

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

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

Приклад коду · 27:20

Role locator і видимість діалогу

Мінімальний приклад Codex на основі актуального Playwright contract: інтерактивна кнопка знаходиться за role та accessible name, а неінтерактивний текст перевіряється через get_by_text().

Після кліку на Create suite текст Select suite for test стає видимим.

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

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

Мінімальний Playwright Page Object із readiness check

Class name позначає page, methods описують actions, locators зберігаються в одному місці, а open завершується мінімальною readiness check.

Після open() test продовжується лише коли heading Sign in видимий; fill_email() приховує locator details від test code.

Неймінг та структура automation-проєкту →

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

`get_by_role` і проблемна семантика форми

У Python role-локатор може виглядати так: ```python page.get_by_role("button", name="Sign in") page.get_by_role("textbox", name="Email") ``` Допустимі ролі й додаткові параметри можна подивитися через перехід до визначення методу в PyCharm. На розглянутій login-формі доступні імена полів сформовані невдало, а `type="text"` використано там, де доречніший `type="email"`. Через це семантичний локатор стає незручним. Це приклад того, що рекомендацію Playwright не можна застосовувати механічно: спочатку слід перевірити реальну accessibility-структуру, а якщо вона неякісна — або виправити frontend, або обрати зрозумілий контрольований локатор.

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

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

Classes і комбінування ознак

Елемент за class шукається через `.class-name` або attribute selector на кшталт `[class*='class-name']`. Два classes одного елемента записуються без пробілу: `.first.second`. Tag та `id` або attribute також можна комбінувати, наприклад `turbo-frame#global_search_results`. Якщо attribute value містить пробіл або спеціальні символи, його треба брати в лапки. У Java-рядку single quotes всередині CSS зменшують кількість escaping.

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

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

Оголошення і виклик функції

Саме оголошення `def print_hello():` нічого не виконує. Функцію треба окремо викликати. Це розділяє опис поведінки та момент її запуску. Далі функція параметризується ім’ям. Замість фіксованого `Hello World` вона приймає `name` і формує `f"Hello {name}"`, тому один алгоритм працює з різними вхідними даними.

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

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

Пошук проєкту й структура Python-тесту

Картку проєкту шукають як заголовок через `get_by_role("heading", name=target_project)`. Відео порівнює це з CSS-пошуком на кшталт `ul h3`: семантичний варіант зазвичай чіткіше пояснює, що саме очікує тест. Окремо показано, що блоки Python визначає відступ. Положення курсора й відступи впливають на те, чи IDE запускає одну тестову функцію, чи весь файл. Після двокрапки тіло функції має бути послідовно відформатоване.

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

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

Non-public API у Python

Один underscore, наприклад `_locator`, — домовленість «внутрішня деталь, не використовуй без потреби». Інтерпретатор не забороняє доступ. Подвійний початковий underscore запускає name mangling, щоб зменшити випадкові конфлікти в нащадках, але теж не створює security boundary. На відміну від `private` або `protected` у статично типізованих мовах, Python більше покладається на дисципліну автора й користувача класу. IDE може попередити про звернення до non-public member, але виконання зазвичай можливе.

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

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

Локальний і глобальний Git config

Кожен commit містить ім'я та email автора. Якщо на машині є персональний GitHub, корпоративний акаунт і окремий клієнтський профіль, один глобальний config може створити неправильну історію авторства. Тому для робочих репозиторіїв корисно задавати `user.name` і `user.email` локально. Практичні команди: `git config --list --show-origin` показує активні значення та їх джерела; `git config user.name` і `git config user.email` читають поточну ефективну ідентичність; `git config --local user.name "Name"` та `git config --local user.email "email@example.com"` задають її лише для поточного репозиторію. Для груп каталогів Git також підтримує умовні include-правила, наприклад окремий профіль для всіх репозиторіїв певної компанії.

Гітігнор та як працювати з гітом та не помилитись →

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

Чому Playwright радить `getByRole`

`getByRole` спирається на роль і accessible name з accessibility tree. Інші user-facing locators — `getByLabel`, `getByText`, `getByPlaceholder`, `getByAltText` і `getByTitle` — шукають за відповідним видимим або описовим значенням. Усі вони читаються ближче до наміру користувача й роблять failure зрозумілішим для розробників — основної аудиторії результатів автотестів. Незначна різниця в швидкості locator неважлива порівняно з network та application latency.

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

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

`class`, `__init__`, `self` і methods

Class name зазвичай є іменником в однині та пишеться з великої літери. `__init__` приймає початковий state, а `self.email` і `self.role` належать конкретному object instance. Method `is_admin()` розміщує перевірку ролі біля даних і не змушує кожен test повторювати `user.role == "admin"`.

10 ооп →

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

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

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

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

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

Accessibility tree, локалізація і стабільність атрибутів

Chrome DevTools дозволяє подивитися accessibility tree й accessible name, навіть якщо значення неочевидне з HTML. Текстові locators зручні, доки labels, placeholders і переклади стабільні. Для багатомовного продукту або content, який окремо змінює контент-команда, стабільний `data-testid` часто кращий. Атрибути можуть рендеритися по-різному залежно від frontend framework, а generated classes та IDs змінюватися між builds, тому вибір залежить від реального контракту команди.

Пріоритети селекторів та їхня надійність →
Запитати в чаті про «name» →