QAБудь-який рівень

Playwright

Playwright — відкрита бібліотека автоматизації браузера й раннер тестів від Microsoft, що керує Chromium, Firefox і WebKit ззовні браузера. Сторінка починається з дванадцяти маршрутів зі сторінки «Наскрізне тестування», написаних на Playwright, — механізму, на який спирається кожен, і конфігурації, що проганяє їх приблизно за чотири хвилини, — далі одне зʼєднання, з якого випливає все, браузери, які він насправді запускає, автоочікування, контексти й воркери, чого тест може дістати, крім сторінки, траси й повтори, чотири зміни під робочими наборами і де він не допомагає.

Поточна версія
1.64 · жовтень 2026
Тест виконується
Поза браузером
Одиниця ізоляції
Контекст браузера

Дванадцять маршрутів магазину в Playwright на одному екрані — механізм, на який спирається кожен

Ніхто не відкриває сторінку про Playwright заради його історії. Її відкривають, коли треба написати набір або полагодити його, і корисне питання тут конкретне: що потрібно кожному маршруту від інструмента і яка частина інструмента це дає? Нижче — дванадцять маршрутів зі сторінки «Наскрізне тестування», той самий інтернет-магазин і той самий час, — так, як магазин пише їх на Playwright. Четверта колонка називає механізм, на який спирається кожен маршрут. Розділи після таблиці пояснюють, звідки береться кожен механізм, і посилаються на маршрути за номерами, а на конфігурацію нижче — за рядками.

#МаршрутЩо йому потрібно від інструментаУ PlaywrightЧас
1Знайти «синій светр», відкрити SKU 30417, оплатити тестовою карткою, отримати номер замовленняВвести дані в поля картки, що живуть в iframe платіжного провайдера на іншому доменіframeLocator() дістає у фрейм з іншого домену так само, як у сторінку; номер замовлення — перевірка, що на нього чекає90 с
2Зареєструватися, підтвердити пошту, увійти, перезавантажити — досі в акаунті. У Chromium і у WebKitТой самий тест у двох рушіях браузераДва проєкти в конфігурації (рядки 2.2 і 2.3); один файл із тегом @webkit іде в обох2 × 60 с
3Скинути забутий пароль за посиланням із листаПрочитати тестову скриньку, якої браузер не бачитьФікстура request питає API скриньки, expect.poll повторює, доки лист не прийде, потім page.goto() іде за посиланням45 с
4Застосувати SPRING10, змінити кількість, оплатитиПорівняти екран із тим, що провайдера попросили списатиrequest читає списання з API пісочниці; тест порівнює його із сумою на сторінці70 с
5Оплатити карткою з 3-D Secure: перехід на перевірку банку й назадПіти з домену магазину й повернутися в ту саму сесіюНічого особливого: контекст переходить між доменами, як людина, і його cookie повертаються разом із ним80 с
6Картку відхилено; оплатити ще раз іншою карткоюРівно одне замовлення після цьогоrequest рахує замовлення клієнта через API після другої оплати75 с
7Спитати асистента замовлень «де моє замовлення» про щойно оформлене замовленняМодель асистента, відтворена із запису, — але модель викликає серверНе page.route(), що бачить лише те, що надсилає браузер: відтворення задане в середовищі, а Playwright перевіряє статус на екрані40 с
8Почати повернення на 30-й день; етикетка для повернення приходить листом30-й день вікна повернення — і в браузері, і на серверіpage.clock.setFixedTime() задає дату браузера; тестовий годинник сервера задають через його власний API — Playwright туди не дістає60 с
9Склад підтверджує, що повернення прибуло; гроші повертаютьсяНадіслати вебхук складу, а потім чекати на листrequest.post() надсилає вебхук із тесту; expect.poll чекає на скриньку з тайм-аутом, написаним під неї (розділ 6)90 с
10Змінити адресу доставки після замовлення, до відвантаженняПрочитати, що отримав складЗвичайні дії, потім request читає тестовий ендпоінт складу50 с
11Оформити замовлення як гість, потім створити акаунт зі сторінки підтвердженняПочати справді анонімноКожен тест починається у свіжому контексті браузера: жодних cookie й жодного сховища після маршруту 1070 с
12Агент підтримки повертає гроші за пошкоджений товар у бек-офісіДруга особа, вже залогіненаПідготовчий проєкт один раз логінить агента й зберігає стан сховища (рядок 2.1); тест відкриває з ним контекст60 с

Таблиця каже, що робить кожен маршрут. Конфігурація нижче каже, як ідуть усі дванадцять: де, у яких браузерах, скільки водночас і що відбувається, коли один падає. Кожен рядок — рішення, яке магазин ухвалив свідомо, і для кожного є розділ нижче.

  1. 1.Де він працює

    1. baseURL береться із середовища, зібраного для цього мерджу з артефакту, що йде в реліз, — ніколи не спільна адреса стейджингу.
    2. timezoneId і locale зафіксовані, тож дата й ціна в євро форматуються однаково на кожній машині.
    3. Аналітику, карти й маркетинговий чат заблоковано через context.route() у спільній фікстурі: це запити браузера, від яких не залежить результат жодного маршруту.
  2. 2.Проєкти

    1. setup логінить агента підтримки й зберігає стан у playwright/.auth/agent.json, який є в .gitignore.
    2. chromium проганяє всі дванадцять маршрутів на кожен мердж, після setup.
    3. webkit проганяє маршрут 2 на кожен мердж і всі дванадцять уночі; firefox іде лише вночі.
  3. 3.Скільки водночас

    1. Один маршрут на файл, fullyParallel: true, workers: 4 у — розмір, під який зібране тестове середовище.
    2. forbidOnly: true у CI, тож забутий test.only валить запуск, а не тихо пропускає одинадцять маршрутів.
  4. 4.Коли один падає

    1. retries: 1 у CI з retryStrategy: 'isolated', тож повтор іде сам наприкінці, а не поруч із наступним маршрутом.
    2. trace: 'on-first-retry', і траса вивантажується як артефакт збірки.
    3. Маршрут, позначений як двічі за тиждень, іде в карантин — правило зі сторінки «Регресійне тестування».
    4. @playwright/test закріплено на точній версії й оновлюють окремою зміною, бо оновлення змінює й браузери.

Одне зʼєднання поза процесом — і які браузери ви насправді тестуєте

Ваш тест виконується у власному процесі Node.js. Playwright запускає поруч браузер і тримає з ним одне зʼєднання відкритим увесь запуск. Для браузера, який він запустив сам, це канал (pipe) між двома процесами; щоб дістатися браузера на іншій машині — . Кожна інструкція йде вниз цим зʼєднанням, і кожна подія повертається ним угору. Для Chromium мова на дроті — . Для Firefox і WebKit Playwright постачає власні збірки, пропатчені так, щоб говорити його протоколом.

Ця одна схема пояснює найвідоміші властивості інструмента. Оскільки драйвер бачить стан браузера напряму, а не крізь сторінку, він може оглянути елемент перед дією й почекати, доки дія матиме сенс, — розділ 3. Оскільки все йде одним зʼєднанням, увесь запуск можна записати й відкрити пізніше, — розділ 6. І оскільки одиниця ізоляції — контекст браузера, а не браузер, чиста сесія коштує мілісекунди, а не запуск браузера, і саме це робить справжню паралельність доступною, — розділ 4.

Playwright виконує ваш тест у власному процесі й увесь запуск тримає одне зʼєднання з браузером, який сам запустив, — канал (pipe) між двома процесами, коли браузер локальний, і WebSocket, коли він на іншій машині. Кожна інструкція йде вниз цим зʼєднанням, і кожна подія повертається ним угору. Для Chromium мова на дроті — Chrome DevTools Protocol; для Firefox і WebKit Playwright постачає власні збірки з патчами, що говорять його протоколом, і саме тому він не може керувати брендовим Firefox чи Safari на вашій машині. Найвідоміші властивості інструмента випливають із цієї однієї схеми. Оскільки драйвер бачить стан браузера напряму, він може перевірити, що елемент готовий, перш ніж діяти. Оскільки все йде одним зʼєднанням, увесь запуск можна записати як трасу й відкрити пізніше. А оскільки одиниця ізоляції — контекст браузера, приватний профіль усередині одного запущеного браузера, — чистий користувач коштує мілісекунди, а не запуск браузера, і саме це робить паралельні маршрути доступними.

Патчі пояснюють факт, що дивує людей. Playwright не керує Firefox чи Safari, встановленими на вашій машині: його документація каже, що він не працює з брендовою версією жодного з них, бо покладається на патчі. А «Chromium» означає різні бінарні файли в різних режимах. Таблиця показує, що запускається насправді.

Ви налаштовуєтеЩо запускається насправдіЩо варто знати
chromium, headless — типово в CIHeadless shell від Chromium — окремий, легший бінарний файлGoogle називає новий headless-режим справжнім браузером Chrome, придатнішим для точного наскрізного тестування вебзастосунків; увімкнути — channel: 'chromium'
chromium, з вікном — ваш ноутбукChrome for Testing, з версії 1.57 (листопад 2025)Вікно, яке ви бачите локально, — не той бінарний файл, що працював у CI без вікна
channel: 'chrome' або 'msedge'Брендовий стабільний браузер, встановлений на машиніДля політики «тестуйте те, що запускають клієнти» і для медіакодеків, яких немає в Chromium
firefoxПропатчений Firefox від Playwright, що відповідає поточному Firefox StableБрендовим Firefox керувати не можна
webkitПропатчений WebKit від Playwright, зібраний з основної гілки WebKitЧасто випереджає Safari — і не є Safari. На Linux залежні від платформи можливості, як-от медіакодеки, відрізняються від Mac

Автоочікування: шість перевірок перед кожною дією — і дві речі, яких вони не виправлять

Найчастіша причина ненадійності браузерного тесту — він діяв або перевіряв раніше, ніж застосунок був готовий. У 2021 році Романо з колегами прочитали 235 нестабільних -тестів із 62 веб- і Android-проєктів і простежили причину кожного. 105 із них, 45,1%, виявилися проблемами очікування, а лише у вебпроєктах ця частка становила 52%. Старіші інструменти відповідали на це паузами й ручними очікуваннями, тобто здогадкою в одязі коду. Playwright відповідає перевірками, які запускає перед кожною дією проти елемента таким, яким він є цієї миті, і повторює їх, доки вони не пройдуть або не спливе тайм-аут дії.

Перед кліком елемент…Що це означаєМомент у маршруті 1, який вона перечікує
є рівно одним елементомЛокатор знаходить один елемент. Жодного поки: чекає. Два: одразу падає з помилкою строгого режимуСторінка рендерить кнопку «Оплатити» для телефонів і для десктопа; тест падає, а не клікає ту, що трапилася першою
видимийНепорожня рамка й не visibility:hidden — елемент з opacity:0 вважається видимимПідсумок кошика ще згорнутий
стабільнийТа сама рамка щонайменше два анімаційні кадри поспільПідсумок виїжджає й зсуває кнопку вниз
приймає подіїСаме в нього влучить клік у цій точціСпінер накриває кнопку, поки сума перераховується
увімкненийНемає disabled ні на ньому, ні на його fieldset, немає aria-disabled вищеКнопка вимкнена, доки поля картки не пройдуть валідацію
не інертнийНе всередині піддерева з inert і не за відкритим модальним <dialog>Діалог згоди на cookie ще відкритий
Перед кліком Playwright перевіряє елемент шість разів: що локатор знаходить рівно один елемент, що він видимий, що він стабільний — та сама рамка два анімаційні кадри поспіль, — що саме в нього влучить клік у цій точці, що він увімкнений і що він не інертний, тобто не всередині інертного піддерева й не за відкритим модальним діалогом. Кожна рамка називає момент оформлення замовлення в магазині, який вона перечікує: згорнутий підсумок кошика, підсумок, що виїжджає й зсуває кнопку, спінер над кнопкою, поки сума перераховується, кнопку, вимкнену до валідації полів картки, ще відкритий діалог cookie. Якщо будь-яка перевірка не проходить, Playwright чекає, знову знаходить елемент за локатором і перевіряє ще раз — доки всі перевірки не пройдуть і він не клікне один раз або доки дія не завершиться тайм-аутом із помилкою, що називає невдалу перевірку. Один випадок не чекає взагалі: якщо локатор знаходить два елементи, як-от кнопку «Оплатити» для телефонів і для десктопа, клік одразу падає з помилкою строгого режиму, а не клікає ту, що трапилася першою.

Друга половина моделі — локатор. Локатор не є елементом. Це опис того, як його знайти, і він розвʼязується заново щоразу при використанні, тож на сторінці, що перерендерюється під тестом, він знаходить поточний елемент, а не тримає вузол, якого вже немає. Перевірки на локаторі працюють так само: повторюються, доки умова не виконається, типово пʼять секунд. Для умови, якої взагалі немає на сторінці, — листа в тестовій скриньці, запису на складі — expect.poll повторює функцію, доки її результат не пройде перевірку, і саме так маршрути 3 і 9 чекають без жодної паузи.

Контексти, воркери й чотирихвилинний запуск

Кожен тест типово отримує свіжий контекст браузера: жодних спільних cookie, жодних залишків у сховищі, жодної залежності від порядку між маршрутами. Це тиха причина, чому набори Playwright лишаються стабільними, коли ростуть. Найчастіше джерело «окремо проходить, у наборі падає» прибирає типова поведінка, а не дисципліна.

Паралельність дають воркери. Воркер — процес операційної системи з власним браузером; воркери не можуть спілкуватися між собою, і воркер завершують після будь-якого падіння тесту, тож наступний тест ніколи не успадковує зламаний браузер. Файли тестів ідуть паралельно на різних воркерах, а тести всередині одного файлу — по порядку в одному воркері, якщо не ввімкнено fullyParallel. Магазин тримає один маршрут на файл і все одно вмикає його (рядок 3.1 конфігурації), тож одиниця, яку роздає планувальник, — один маршрут.

  • Увійти раз, використати всюди

    Підготовчий проєкт логіниться й зберігає стан сховища; тести, яким потрібна ця особа, стартують із ним. Документація радить так робити для тестів, що не змінюють стан на сервері, і по акаунту на воркер — для тих, що змінюють.

  • Фікстури замість коду підготовки

    Фікстура — названа річ, яку просить тест: залогінена сторінка, засіяне замовлення, API-клієнт. Її будують на вимогу й прибирають після, тож маршрут оголошує, що йому потрібно, а не облаштовує це.

  • Блокування для того, що не можна ділити

    З версії 1.63 тест може тримати іменоване блокування: тести з тим самим блокуванням ніколи не йдуть водночас — між файлами, воркерами й проєктами, — а все інше лишається паралельним. Це для того одного зовнішнього акаунта, що не витримує двох авторів змін.

  • Шарди й перемішування, щоб знайти залежність

    Той самий набір ділиться між машинами CI через --shard=1/3, а звіти потім зливаються. З версії 1.64 --shuffle запускає тести у випадковому порядку з seed для повтору — так виявляється тест, що тихо залежить від іншого.

Набір магазину на чотирьох воркерах Playwright. Першим іде підготовчий проєкт, що логінить агента підтримки, — близько 15 секунд, бо від нього залежать обидва браузерні проєкти. Потім тринадцять тестів — дванадцять маршрутів у Chromium із часом зі сторінки «Наскрізне тестування» і маршрут 2 ще раз у WebKit — роздаються в порядку файлів тому воркеру, що звільнився першим. Воркер 1 проганяє маршрути 1, 8 і 12 і закінчує на 225-й секунді; воркер 2 — 2, 6 і 11, закінчує на 220-й; воркер 3 — 3, 5, 10 і маршрут 2 у WebKit, закінчує останнім, на 250-й; воркер 4 — 4, 7 і 9, закінчує на 215-й. Це 865 секунд роботи трохи більше ніж за чотири хвилини. Запуск триває стільки, скільки найзавантаженіший воркер, а не сума тестів, тож більше воркерів скорочувало б його, доки кожен маршрут не мав би свого, — тоді межа дорівнює підготовці плюс найдовшому маршруту, 105 секунд. На практиці межа — тестове середовище: у магазину воно розраховане на чотирьох клієнтів водночас.

Чого тест може дістати, крім сторінки, — і де це закінчується

Три можливості, крім кліків, змінюють те, що взагалі належить маршруту. Перша — API-клієнт. Фікстура request надсилає запити з тесту, а page.request ділить cookie контексту браузера в обидва боки, тож маршрут може підготувати стан через API за пʼятдесят мілісекунд і потім перевірити одну річ у браузері. Друга — маршрутизація мережі: запити сторінки можна спостерігати, затримувати, відповідати на них із записаного HAR-файлу або блокувати. Третя — годинник, що замінює Date, таймери й анімаційні кадри сторінки годинником, яким керує тест.

ПотребаУ PlaywrightДістаєНе дістає
Підготувати чи перевірити станrequest, page.requestAPI магазину, платіжну пісочницю, тестову скриньку — маршрути 3, 4, 6, 9, 10Усе, що не має API
Замінити третю сторонуpage.route(), context.route(), routeFromHAR()Запити, які робить браузер, — аналітику, карти (рядок 1.3 конфігурації)Виклики, які один сервер робить до іншого: модель асистента (7), етикетки перевізника (8)
Керувати часомpage.clockDate, таймери й анімаційні кадри всередині сторінкиГодинник сервера — 30-й день треба задати й на бекенді (8)
Другий користувачbrowser.newContext()Скільки завгодно ізольованих користувачів в одному тесті — маршрут 12Нічого: тут інструмент найсильніший

Падіння, яке можна відкрити: траси, повтори й позначка flaky

Дорога частина наскрізного падіння — рідко саме падіння. Це година спроб відтворити його на ноутбуці, де воно не стається. Відповідь — траса, і саме це налаштування варто зробити правильно раніше за будь-яке інше. Траса записує кожну дію зі знімком сторінки до й після неї, мережевий лог, консоль і рядок коду. Магазин пише її на першому повторі (рядок 4.2 конфігурації) і вивантажує разом зі збіркою. Вона відкривається локально або на trace.playwright.dev, який, за документацією, завантажує трасу повністю в браузері й нічого нікуди не передає.

Траса повтору маршруту 9 — того запуску, який звіт позначив як flaky. Тест надсилає вебхук складу за першу третину секунди, і сторінка показує, що гроші повернено, на 1,4 секунди, — тобто магазин свою роботу зробив. Потім тест кожні пів секунди опитує тестову скриньку через expect.poll, чия типова межа — 5 секунд. Вісім запитів повертаються порожніми; лист приходить на 4,6 секунди, і повтор проходить із запасом 0,4 секунди. Перша спроба вперлася в межу на 5,0 секунди й упала. Нічого не довелося відтворювати на ноутбуці: один файл показує повернення грошей на екрані, порожню скриньку до 4,6 і межу на 5,0. Діагноз — хибний тайм-аут, а не продукт, а виправлення — межа, написана під умову, 15 секунд, бо 99-й перцентиль поштового конвеєра — близько девʼяти, а не пауза перед опитуванням.

Траса на схемі — маршрут 9 у вівторок. Перша спроба впала, повтор пройшов, тож звіт каже flaky, — а саме для повтору магазин і пише трасу. Вона показує, що гроші повернено на сторінці на 1,4 секунди, тобто магазин свою роботу зробив. Вона показує, що опитування скриньки вісім разів повернулося порожнім, а лист прийшов на 4,6 секунди — при типовій межі опитування 5,0. Першій спробі просто забракло цих останніх 0,4 секунди. Нікому не довелося нічого відтворювати, і діагноз — тайм-аут, а не продукт. Виправлення — межа, написана під умову, 15 секунд, бо 99-й перцентиль поштового конвеєра — близько девʼяти, і ніколи не пауза перед опитуванням.

Повтори — місце, де набір тихо бреше. Playwright позначає тест, що впав і пройшов на повторі, як «flaky», а не «passed», і типово запуск однаково завершується зеленим; --fail-on-flaky-tests робить його червоним. Магазин тримає один повтор, запускає його сам наприкінці з retryStrategy: 'isolated', щоб повтор не змагався з наступним маршрутом за середовище, і рахує позначки flaky як окремий сигнал (рядки 4.1 і 4.3 конфігурації). З версії 1.57 HTML-звіт має ще й вкладку Speedboard, що сортує тести за повільністю, — перше місце, куди дивитися, коли чотири хвилини стають сімома.

  • Користуйтеся інтерактивним режимом, --ui, під час написання маршруту: запуск стає на паузу, локатор під курсором підсвічується, і можна спробувати інший на живій сторінці.
  • Ставтеся до записаного коду як до чернетки. Запис сценарію швидко дає робочі локатори, і вони майже завжди крихкіші за ті, які ви обрали б свідомо.
  • З версії 1.56 Playwright постачає три визначення агентів для асистентів програмування: планувальник, що досліджує застосунок і пише план тестів, генератор, що перетворює план на тести, і «лікар», що проганяє набір і лагодить тести, які падають.

Чотири зміни під робочими наборами

Жодна з цих змін не скандал. Кожна — датована зміна в Playwright чи в браузерах під ним, опублікована тими, хто її зробив, і кожна відділила набори, що закріплювали й оновлювали версії свідомо, від тих, що ні. Вони тут, бо браузерний тест залежить не лише від власного коду, і ці чотири показують, від чого ще.

ЗмінаЩо вона виявилаЩо захистило набір
Playwright 1.49, листопад 2024: канали chrome і msedge переходять на новий headless-режим ChromeНабори на цих каналах відтепер працювали з іншим headless-браузером. Примітки до релізу: якщо набір падає, найімовірніше, доведеться оновити знімки, а код довкола PDF-переглядача й розширень — адаптувати.Оновлення окремою зміною і базові скриншоти, які вважають належними до збірки браузера, а не до продукту.
CVE-2025-59288, 14 жовтня 2025: скрипти macOS, що встановлюють брендові Chrome і Edge, використовували curl -kСкрипти, що стоять за встановленням chrome і msedge на Mac, пропускали перевірку сертифікатів, і, як каже бюлетень, завантажені файли встановлювалися як привілейовані застосунки. Виправлено в 1.55.1.Ставлення до завантаження браузера як до частини ланцюга постачання: закріплена версія, яку оновлюють свідомо, і образи CI, зібрані раз і використані повторно, а не встановлення браузерів на кожен запуск.
Playwright 1.57, листопад 2025: збірки Chromium замінено на Chrome for TestingНічого функціонального, за задумом: запуски з вікном перейшли на chrome від Chrome for Testing, а headless — на його headless shell, і примітки казали, що найбільша зміна — нова іконка й назва на панелі.Нічого не знадобилося — і в цьому суть рядка. Набір, що закріплює версії й оновлює їх свідомо, переживає зміну збірки браузера як неподію, а знання, який бінарний файл запускає кожен режим (розділ 2), робить розмову «локально проходить, у CI падає» короткою.
Playwright 1.63, вересень 2026: експериментальні пакети компонентного тестування перестають оновлюватисяКоманди з компонентними наборами на @playwright/experimental-ct-react чи -vue мусили перейти на модель історій, що зʼявилася в 1.62.Читання «experimental» у назві пакета як обіцянки, якою воно є, тобто жодної, — і невеликий вихід, наприклад, коли кожен компонентний тест монтується через один хелпер, щоб переїзд тривав день, а не квартал.

Де він не допомагає і як порівнюється

Playwright — розумний вибір за замовчуванням для нового браузерного набору у 2026 році, а значення за замовчуванням заслуговує, щоб його застереження назвали прямо, а не виявили на третій місяць.

  • WebKit не є Safari. Це той самий рушій, пропатчений і зібраний з основної гілки WebKit, без браузера Apple навколо: він ловить різницю рушіїв, але не все, що специфічне для Safari, яким користуються клієнти.
  • Мобільна емуляція — це вʼюпорт, user agent і дотик, а не пристрій. Вона знаходить проблеми верстки й не знайде бага справжнього мобільного браузера.
  • Його досяжність закінчується на боці мережі, де браузер. Виклики між серверами й власний годинник сервера належать середовищу, а не тесту.
  • Він не тестує нативні десктопні чи мобільні застосунки й не є інструментом навантажувального тестування, хай якою спокусливою виглядає сотня паралельних контекстів.
  • Він робить нестабільні тести менш імовірними, але не робить добрим погано обраний набір. Чотириста наскрізних кейсів тут хибні рівно з тих самих причин, що й будь-де.

Обирайте Playwright, коли

  • Ви починаєте набір зараз і жодне обмеження не штовхає вас до іншого.
  • Маршрутові потрібні кілька користувачів, кілька доменів, платіжний чи кілька вкладок.
  • Важить час набору: паралельність на контекстах дешева, а шардинг вбудований.
  • Ви хочете діагностувати падіння в CI з одного файлу, не відтворюючи його.

Дивіться в інший бік, коли

  • Треба ганяти брендові браузери, які мають клієнти, — передусім справжній Safari — на гриді справжніх машин; це територія Selenium.
  • Ваші тести пишуть мовою, для якої Playwright не має бібліотеки, або команда вже живе в стеку Selenium.
  • Є великий робочий набір на Cypress: міграція зазвичай коштує більше, ніж повертає.
  • Тестувати треба нативний застосунок, десктопний клієнт чи поведінку рівня системи.

Антипатерни, які варто назвати

  • Явні очікування «про всяк випадок» поверх автоочікування: вони сповільнюють набір і ховають справжнє питання часу.
  • Локатори за CSS-класом чи позицією в DOM, бо так записав рекордер: кожен редизайн перетворюється на день ремонту тестів.
  • Один контекст на кілька тестів заради часу: так повертається залежність від порядку, яку інструмент і мав прибрати.
  • Повтори, які підвищують, доки пайплайн не позеленіє: справжні плаваючі дефекти так стають успішними запусками.
  • Незакріплений @playwright/test, тож браузери змінюються в день, який ніхто не обирав.
  • Юніт-логіка, перенесена в браузерні тести, бо інструмент приємний, — найдорожчий спосіб бути ретельним.

Коли це застосовувати

Застосовуйте, коли

  • Новий браузерний набір, де важать і надійність, і час виконання, і немає обмежень щодо мови.
  • Маршрути з кількома користувачами, кількома доменами, платіжним iframe чи кількома вкладками.
  • Набори, що мають запускатися на кожен мердж, — із воркерами на одній машині й шардами на кількох.
  • Скрізь, де Chromium, Firefox і WebKit мають запускатися з того самого файлу тестів, закріплені на одній версії.

Уникайте, коли

  • Як доказ, що сторінка працює у випущеному Safari чи справжньому мобільному браузері: WebKit і емуляція цього не покривають.
  • Для поведінки, що живе між серверами чи на годиннику сервера: тест туди не дістає.
  • Для нативних десктопних чи мобільних застосунків або як інструмент навантажувального тестування.
  • Як привід нарощувати наскрізний набір: приємний інструмент не змінює того, що належить цьому рівню.

Джерела й метод

На чому стоїть ця стаття

  • 11 джерел
  • Перевірено 19 жовтня 2026 р.

Дослідження з Claude. Пошук і звірку першоджерел зроблено з Claude (Anthropic). Відбір, текст і перевірку фактів — редакція Anatomy of IT Product.

Було корисно?

Поділіться з тим, хто працює над тією ж задачею.