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

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

Нюанс · 26:30

Дубльований responsive DOM — окрема причина неоднозначності

Прихований mobile block може залишатися в DOM разом із desktop block. Visibility не робить global locator унікальним; scope до правильного container має бути явним.

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

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

CSS attribute matching

Порівнює id shorthand, substring match і комбінування tag, classes та attribute.

Кожен selector знаходить лише intended element у відповідному DOM fixture.

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

Термін · 2:20

Locator

Повторно обчислюваний опис пошуку елемента; Playwright знаходить актуальний DOM element перед кожною дією й поєднує Locator з auto-waiting.

Що має описувати isLoaded →

Термін · 0:00

Playwright trace

Архів записаних browser actions і diagnostic data, який Trace Viewer показує як timeline, DOM snapshots, logs, network, source і metadata test run.

3. Фікс трейсів на СІ →

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

Навіщо розуміти селектори та DOM

Надійні локатори спрощують не лише написання нового тесту, а й пошук дублювань та рефакторинг наявного набору. Без розуміння HTML одна й та сама кнопка швидко отримує кілька різних локаторів у різних тестах. DOM розглядається як дерево. Кореневий `<html>` містить `<head>` і `<body>`, а вкладені елементи утворюють гілки на різних рівнях. DevTools дає змогу розгортати й згортати ці гілки та бачити, до якого блоку належить потрібний елемент.

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

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

Sibling combinator

Комбінатор `+` вибирає adjacent sibling: елемент, який розташований одразу після іншого елемента на тому самому DOM-рівні. Це дозволяє знайти input або container відносно стабільного label. Такий локатор залежить від порядку в DOM, тому перед використанням треба перевірити структуру, а не лише візуальне розташування.

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

Python мануфактура · Програма курсу · 25:55–29:02

DOM breakpoints і практична перевірка cookies

Альтернативний спосіб — DevTools breakpoint `Break on subtree modifications` на контейнері. Після Save браузер зупиниться на зміні DOM; покрокове продовження дозволяє знайти проміжні стани `Saving` і `Saved` та побудувати locator. Для перевірки cookie тест ставиться на паузу, у DevTools відкривається Application → Cookies, виконується наступний крок і reload. Так видно, що feature flag дійсно додано до правильного домену до того, як на нього покладатиметься assertion.

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

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

Новий сценарій: логін і пошук проєкту

Створюється тест, який авторизується в застосунку й шукає проєкт «Python Manufacture». Спочатку кроки пишуться прямо в тесті: відкрити сторінку входу, заповнити email і пароль, натиснути Sign in, знайти поле пошуку. Паралельно досліджується DOM: візуальна фільтрація не обов’язково видаляє непотрібні картки — застосунок може лише приховувати їх через CSS. Через це перевірка має враховувати не тільки наявність вузла в DOM, а й його видимість.

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

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

AI sidebar і робота з HTML-контекстом

Ще один експеримент — sidebar, який об’єднує кілька LLM interfaces і передає їм виділений на сторінці текст або HTML fragment. Для automation engineer це скорочує шлях від inspect element до prompt: можна вибрати DOM block і попросити запропонувати locator або page object. Це не замінює перевірку selector-а. Згенерований варіант треба оцінити за semantics, uniqueness і stability у реальному DOM, але інструмент прибирає кілька механічних copy/paste дій.

Корисні застосунки та їхнє призначення →

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

Чому implicit wait недостатньо

Перед аналізом очікувань виправляється ще одна причина падіння: регістр символів і точне значення атрибута мають збігатися з DOM. Це нагадування не списувати кожен `NoSuchElementException` на повільну сторінку — спочатку слід перевірити сам локатор. `driver.implicitly_wait(10)` задає загальний час очікування для пошуку елементів. Такий механізм може дочекатися присутності вузла в DOM, але не виражає конкретний стан: елемент може існувати, залишаючись невидимим або недоступним для кліку. Для сучасних динамічних сторінок урок рекомендує не покладатися на implicit wait. Тесту потрібна конкретна умова — visibility, clickability, selected state або зникнення — у конкретному місці сценарію.

1. Selenium початок, основи, фікстури →

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

Звідки брати назву Page Object

Першим джерелом назви сторінки є route: кореневий шлях підказує home page, а змістовний path — конкретний екран. Якщо це SPA або URL не змінюється, наступним джерелом стає видима назва сторінки: `h1`, `h2`, title чи інший семантичний заголовок. Коли framework генерує сторінку переважно з `div`, треба орієнтуватися на мову продукту та стабільні атрибути DOM. Мета — щоб назва в automation-коді відповідала тому, як екран уже називають користувачі й розробники.

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

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

Locator, `WebElement` або рядок

На Python-проєктах можна зустріти три підходи: зберігати locator tuple, лише CSS/XPath-рядок або вже знайдений `WebElement`. Рядок коротший, але не містить тип пошуку; `WebElement` зручний лише поки DOM-вузол не перерендерився; locator дає змогу безпечно виконувати повторний пошук. Якщо helper має приймати і locator, і `WebElement`, це можна відобразити union type та всередині визначити потрібну expected condition. Така гнучкість виправдана лише коли обидва представлення реально використовуються; для нового коду один locator-based контракт простіший. Wait helper отримує default timeout, але дозволяє локально передати довший для справді повільної операції. Page Object може застосовувати Loadable Component approach: сторінка вважається готовою лише після появи її ключових елементів, наприклад email і password inputs.

2. Selenium організація PageObject's та Очікувань →

Python мануфактура · Програма курсу · 5:15–7:07

Швидкий шлях від DOM до локатора

У браузерних DevTools вмикається режим вибору елемента на сторінці. Після кліку потрібний вузол одразу знаходиться в HTML, де можна перевірити унікальність майбутнього селектора. У прикладі селектор має знаходити рівно один елемент. Ручний процес — скопіювати значення, повернутися в PyCharm і загорнути його в `page.locator(...)` — повторюється багато разів. Це хороший кандидат для локального шаблону: структура виклику стабільна, а змінюється лише селектор.

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

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

Сторонній Recorder і неповний код

Інший recorder записує кроки login-сценарію та дозволяє обрати мову експорту. Згенерований приклад містить `goto`, `fill` і `click`, але не враховує дубльовані `#content-mobile` та `#content-desktop` блоки на сторінці Testomat.io. Через це локатор поля може знайти кілька вузлів і впасти у strict mode. Генератор бачить окрему дію, але не обов’язково розуміє контекст DOM або усталену архітектуру тестів. Код є чернеткою, а не готовим тестом.

4. Playwright плагіни та codegen →
Запитати в чаті про «dom» →