Конспект і таймкоди
0:00
Чому raw Selenium погано масштабується
Raw Selenium створює повтори findElement, waits і JavaScript executor workarounds, тому починати радять хоча б з існуючого wrapper на кшталт Selenide. Змішування implicit та explicit waits додатково робить runtime і причину затримки непередбачуваними.
На CI test code, Selenium Server і browser можуть працювати на різних machines. Кожна remote команда додає network latency та навантаження Grid/Selenoid, тому велика кількість дрібних звернень до browser різко збільшує загальний час.
6:00
Порівняння runtime Selenium і Playwright
Один login/business flow запускається спочатку через Selenium, а потім через Playwright. У демонстрації Selenium-виконання займає близько хвилини, тоді як Playwright проходить той самий flow приблизно за десять секунд.
Playwright Java описується як client для взаємодії з browser через DevTools protocol. Швидкість не скасовує testability проблем, але зменшує protocol overhead і дає швидший feedback.
Playwright перед дією автоматично перевіряє набір actionability conditions, а не обмежується document ready state. Це краще відповідає React/Angular interfaces, де сторінка формально завантажена раніше за dynamic content.
Нульовий slowMo може виявитися занадто агресивним для application з race conditions, помилками promises або некоректними callbacks. Невелика затримка стабілізує flow, але такі падіння також корисно розглядати як можливі defects application, а не автоматично приховувати великим timeout.
20:00
Locator strategy і accessibility roles
Playwright підтримує CSS, XPath, text і role-based locators. getByRole спирається на ARIA/accessibility semantics та accessible name, що особливо корисно для frameworks, які рендерять custom elements або div замість native controls.
Role locator надійний лише тоді, коли frontend справді підтримує коректну accessibility structure. Якщо labels/roles генеруються випадково або команда їх не контролює, краще домовитися про стабільні attributes, ніж механічно слідувати документації.
31:00
Assertions і незручність сирого fluent API
Playwright Java розділяє locator actions і assertions: для перевірки потрібно окремо передавати locator в assertion API. Після action не завжди можна продовжити читабельний chain на тому самому object, тому Page Object наповнюється повторними locator calls.
Автор прагне до Selenide-подібного стилю: знайти element, викликати shouldBe/shouldHave, виконати click, setValue або press, читаючи chain зліва направо. Замість великого framework потрібен вузький wrapper над уже наявними Playwright capabilities.
40:00
Мінімальний wrapper: actions і conditions
Wrapper розділяє locator actions і conditions. Condition має метод verify, який отримує locator та викликає native Playwright expectation; concrete conditions реалізують visible, hidden, text та інші стани.
Locator wrapper повертає себе після action або verification, тому Page Object читається як короткий fluent scenario. Custom waiting library пропонується лише для рідкісних conditions, яких немає в Playwright; основні очікування не переписуються.
47:00
Trace Viewer замість відео
Playwright trace зберігає actions, before/after snapshots, console, network requests, request/response bodies і metadata. Це дозволяє відкрити локальний Trace Viewer та побачити, що відбулося перед failure, без повторного запуску.
Trace artifact може бути десятки megabytes, але часто дає більше діагностичної інформації за video. На CI варто зберігати trace для кожного test або при failure й публікувати його як downloadable artifact чи у власному hosted viewer.
**Актуальність станом на 2026-08-08.** Низькорівневий BrowserContext.tracing() у Playwright Java записує browser operations і network activity, але не test assertions. Це обмеження треба врахувати, якщо wrapper обіцяє повний assertion-aware trace ([Playwright Java documentation](https://playwright.dev/java/docs/api/class-tracing)).
52:38
JUnit/TestNG lifecycle для tracing
Browser можна ініціалізувати один раз, але BrowserContext, Page і tracing потрібно створювати перед кожним test та закривати після нього. Один trace на весь suite буде надто великим і незручним для rendering.
Для JUnit 5 wrapper реалізує BeforeEachCallback/AfterEachCallback; для TestNG потрібен listener з обробкою success, failure і skip. Автор віддає перевагу JUnit 4/5 через cleaner extension ordering, lifecycle і parameterization, вважаючи TestNG listeners та shared initialization складнішими.
1:00:00
Inspector, pause і recorder
Playwright Inspector дозволяє поставити test на pause, виконувати кроки, перевіряти locators і дивитися стан page. Для debugging це може бути швидше за звичайний IDE debugger.
Recorder генерує послідовність raw locator/actions, але не будує Page Objects і test-runner architecture. Він може допомогти початківцю побачити working command, проте generated main-method script не є готовим maintainable test suite.
Пошук елемента має слідувати DOM tree: спочатку стабільний parent/container, потім потрібний descendant або text filter. Playwright і Selenide вміють фільтрувати locator за текстом, тому довгий XPath часто не потрібний.
Playwright locator сам визначає XPath за //, але автор радить використовувати CSS, attributes і можливості бібліотеки. Recorder/debugger можуть запропонувати selector, однак його стабільність усе одно оцінює команда.
1:13:33
Parameterized tests і Live Templates
JUnit 5 @ParameterizedTest і @MethodSource використовуються замість складних TestNG data providers. Для повторюваного test skeleton автор створює IntelliJ Live Template з параметрами для display name, method name, return type і default failing assertion.
Окремі templates генерують Page Object methods і Allure-style step annotation. Це прискорює механічний boilerplate без створення нового runtime abstraction.
1:20:00
Поступова міграція з Selenium/Selenide
Wrapper навмисно використовує Selenide-подібні method names, щоб existing Page Objects мігрували через import replacement і мінімальні structural changes. Selenium та Playwright tests можуть тимчасово жити в одному repository й запускатися різними commands.
IntelliJ Structural Search and Replace або regex replacement допомагають перетворити @FindBy, Page Factory і повторювані driver.findElement patterns. Якщо old suite непослідовний, безпечніше переписувати test лише коли його торкається зміна, а не робити ризиковий big-bang rewrite.
1:30:00
Collections і BrowserContext
Перебирання UI element collection створює багато browser round trips для visibility і text. Коли можливо, краще працювати з конкретним target element або один раз отримати потрібний text/content і перевірити його локально; selectors за nth/index названі нестабільними.
BrowserContext ізолює cookies, local/session/shared storage, base URL та device emulation settings. Окремий context на test дає дешевшу ізоляцію, а Playwright через Page/Frame API працює з tabs, iframes і dialogs без Selenium-style global driver state.
1:37:00
Custom waits, soft assertions і remote browsers
Native Playwright assertions є dynamic waits і покривають більшість visible/hidden/text conditions. Якщо потрібні custom polling або AssertJ soft assertions, їх можна викликати всередині власної condition через Awaitility-подібний wait, але це окреме розширення, а не default шлях.
У headless CI Playwright працює без спеціальних змін, окрім встановлення browser binaries; BrowserStack і Sauce Labs також мають власні integration instructions. Перший запуск довший через download Chromium, WebKit і Firefox artifacts.
Cypress описується як більш закритий framework зі своїм execution model, dashboard і довгою історією обмежень навколо iframes, parallelization та artifact storage. Community plugins закривали частину цих прогалин.
Playwright уже надає browser automation, tracing і multi-browser support як library, тому менше прив'язує suite до одного hosted dashboard. Відео подає це як операційну перевагу, не як гарантію, що будь-який Cypress project потрібно переписувати.
1:49:21
Мова, масштаб UI-suite і підсумок wrapper
Приклад лишається на Java, але той самий маленький wrapper можна реалізувати на Python, C# або TypeScript. Для JavaScript/TypeScript автор радить TypeScript через типізацію.
На проєктах, де architecture дозволяє тестувати основну логіку на API-рівні, UI-suite може складатися приблизно з десяти ключових flows. Тоді мінімальна обгортка, Page Objects і Trace Viewer дають достатню підтримуваність без створення ще одного великого framework.