← Java

Після цього уроку ви зможете

Конспект і таймкоди

0:00

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

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

Коли framework генерує сторінку переважно з div, треба орієнтуватися на мову продукту та стабільні атрибути DOM. Мета — щоб назва в automation-коді відповідала тому, як екран уже називають користувачі й розробники.

Термін

Page Object Model

Design pattern, який відділяє test code від page-specific locators і operations; UI change зазвичай локалізується в одному object.

Приклад коду

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

from playwright.sync_api import Page, expect


class LoginPage:
    def __init__(self, page: Page) -> None:
        self.page = page
        self.heading = page.get_by_role("heading", name="Sign in")
        self.email = page.get_by_label("Email")

    def open(self) -> None:
        self.page.goto("/login")
        expect(self.heading).to_be_visible()

    def fill_email(self, value: str) -> None:
        self.email.fill(value)

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

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

Потрібно: playwright

Практика

Провести naming audit одного Page Object

  1. Зіставте class name з route, visible heading і product vocabulary.
  2. Позначте methods, які маскують click як open, або змішують action і assertion.
  3. Перейменуйте лише підтверджені невідповідності та запишіть два project rules у README.

Результат: Один короткий diff і два naming rules, які прибирають повторну суперечку на code review.

2:32

`isLoaded` і реальний критерій готовності сторінки

Для кожного Page Object або повторно використовуваного компонента потрібна операція, яка доводить готовність до подальших дій. Вона локалізує причину падіння: замість випадкової помилки наступного кроку тест одразу повідомляє, що сторінка не завантажилася або потрібний блок не з’явився.

Критерій залежить від rendering strategy. У client-side rendering можуть послідовно з’являтися skeleton, дані й зображення; інша сторінка приховує весь content до завершення кількох requests. Перевіряти треба мінімальний набір елементів, без яких сценарій не може продовжуватися, а не чекати кожної можливої деталі.

Термін

Load readiness check

Виняткова перевірка всередині Page Object, яка підтверджує, що правильна page та її critical elements готові до operations; business assertions залишаються в test code.

9:04

Коли UI-фрагмент стає окремим компонентом

Popup, який використовується на кількох сторінках, є природним кандидатом на окремий object. Назву варто шукати в його heading, data-testid, class або іншому атрибуті найближчого контейнера. Так automation-модель повторює структуру продукту й полегшує пошук коду.

Якщо test environments обфускують усі стабільні назви, це варто обговорити з frontend-командою: production може мати обфускацію, але dev/stage потребують передбачуваного test contract. Водночас не можна прив’язувати неймінг чи selectors до випадкових inline styles або кольорів.

Термін

Page Component Object

Object для дискретної частини page, яку можна вкладати в Page Object і повторно використовувати в кількох pages.

14:29

Узгодження словника і мінімальна готовність компонента

Чим ближчі назви automation-коду до frontend і HTML, тим легше новому інженеру знайти вже реалізований object або зрозуміти, де додати нову дію. LLM можна використати як співрозмовника для добору назви, але джерелом доменної мови залишаються продукт і код команди.

Перевірка готовності компонента не повинна вимагати всіх варіативних полів. Premium badge або характеристика конкретного типу продукту можуть бути відсутні законно; isLoaded має перевіряти лише спільний мінімум.

16:00

Функції є діями, класи й дані — іменниками

Функції Page Object називаються за дією тест-кейсу й починаються з дієслова; класи, файли, variables і constants позначають сутності або дані. Для однакових дій команда має обрати один словник — наприклад, послідовно використовувати fill, click і select, бажано близько до API обраного framework.

Функцію, яка натискає кнопку, не варто називати openPage: окрема navigation-функція може відкривати URL напряму, обходячи довгий UI-шлях. Неминучі суперечки на code review краще завершити коротким naming convention у README, а не щоразу вирішувати те саме заново.

23:19

REST і GraphQL уже дають словник для API automation

У REST структура починається з resources та HTTP methods. Pet, Store або User задають назви controllers/clients, а дії на кшталт create, update, delete чи find by ID — назви методів. Request і response models корисно розділяти, бо server response часто містить поля, яких не було у request.

У GraphQL треба повторювати назви queries, mutations, inputs і types зі schema. Code generation може дати готові типи, але базове правило те саме: не створювати паралельний словник там, де backend contract уже має точні терміни. Read-only доступ до frontend і backend repositories допомагає швидше зрозуміти систему й підтримувати automation разом зі змінами продукту.

33:00

Структура automation-проєкту росте ітеративно

Початкова структура може бути простою: спільний config, web із pages/components, api із clients/controllers та DTO, а за потреби — робота з database. Не треба заздалегідь будувати повну enterprise-ієрархію.

Коли database-код розростається, його можна винести на окремий рівень і розділити на entities та repositories/DAO. Це наступна ітерація після появи кількох tables і повторюваних CRUD operations, а не стартова вимога для першого test suite.

Практика

Спроєктувати V0 structure без speculative folders

  1. Візьміть один реальний web або API automation scope.
  2. Створіть лише folders, які мають хоча б один поточний consumer.
  3. Запишіть measurable condition для винесення database, messaging або другого domain на окремий рівень.

Результат: Мінімальне tree representation і три explicit upgrade conditions.

39:10

Доменні межі, кілька застосунків і один стартовий repository

Великий продукт може мати B2C, B2B, back office, tool-sharing або branch-office застосунки зі спільним core. Структуру automation варто повторювати за реальними domain/app boundaries, а common-код піднімати лише тоді, коли він справді спільний.

Для нового automation effort рекомендовано починати з одного repository: розділити усталену систему пізніше простіше, ніж одразу координувати кілька репозиторіїв без перевіреної потреби. Один repository також полегшує справжні end-to-end flows через кілька доменів.

47:39

Testing trophy, статичний аналіз і мовні layout conventions

Структура каталогів не визначає правильний рівень coverage. Для сучасних frameworks часто корисніше мислити test trophy або testing landscape: поєднувати static analysis, component/integration tests і лише потрібні end-to-end tests відповідно до ризику конкретної частини системи.

У Java типовий layout має src/main і src/test із packages; Python та TypeScript часто відділяють application/support code від tests простіше. Naming і package layout треба брати з conventions мови та поточного repository, а не переносити механічно з іншого stack.

54:14

Розділення за протоколом і naming conventions мов

Якщо suite працює не лише з web та HTTP API, нові верхньорівневі межі можуть з’явитися для CLI, FTP або messaging. Database і message-broker helpers можна спочатку залишити поруч з API support code, а винести вище після реального зростання.

Окремо виправлено Python convention: module filenames пишуться lowercase із underscores, а class names — у PascalCase. Java class files зазвичай повторюють PascalCase класу; у TypeScript конкретна конвенція залежить від прийнятого стилю repository. Constants традиційно позначаються uppercase із underscores.

Термін

Python naming conventions

PEP 8 радить короткі lowercase names для modules, underscores лише коли вони покращують readability, і CapWords для class names.

58:10

Лінтери і межі Playwright agents

Лінтер є дешевим статичним аналізатором, який автоматично підтримує частину style та naming rules. У сесії згадується окреме налаштування Python-аналізатора та його синхронізація з PyCharm.

Playwright agents оцінюються як інструмент для експерименту, а не основа щоденного workflow: у практичній роботі пряме використання API та звичайне перенесення потрібного коду часто передбачуваніші. На момент сесії agents також орієнтовані насамперед на TypeScript, а не на Python чи Java bindings.

Що змінилося після запису

Поточний фактчек Playwright Test Agents

АктуальноПоточна офіційна документація описує planner, generator і healer для Node.js Playwright Test у TypeScript-first workflow. Playwright Test також підтримує JavaScript, а Python docs мають окремий Node-based playwright-cli для coding agents; це не той самий planner/generator/healer workflow.

Що змінилосяЗміну після запису не встановлено: Playwright Test Agents з’явилися у v1.56 до сесії 2026-01-07; current docs checked 2026-07-31.

Чому це важливоОцінка корисності у відео залишається авторською думкою, але твердження про можливості інструмента треба показувати поруч із актуальним official state.

Термін

Playwright Test Agents

Офіційні agent definitions для planner, generator і healer, які створюються через npx playwright init-agents і можуть використовуватися окремо або послідовно.

Джерела та додаткові матеріали

  • Selenium Page object models ↗Selenium · перевірено 2026-07-31

    Уточнює Page Object, Page Component Object і допустиму readiness verification.

  • Playwright Python Page object models ↗Microsoft Playwright · перевірено 2026-07-31

    Показує мінімальну Python implementation із centralized locators і higher-level page API.

  • PEP 8 naming conventions ↗Python Software Foundation · перевірено 2026-07-31

    Є первинним джерелом для module і class naming у Python.

  • Playwright Test Agents ↗Microsoft Playwright · перевірено 2026-07-31

    Фіксує поточний planner, generator і healer workflow для фактчеку авторської оцінки.