vyvchy
    Теми розділу

    07 · Інструменти автоматизації

    Ландшафт інструментів: Selenium, Playwright, Cypress, CodeceptJS

    Зміст

    У вакансії написано «Selenium або Playwright», у статті — «Cypress швидший», у чужому репозиторії лежить CodeceptJS. Виглядає так, ніби це чотири синтаксиси для однієї дії «клікни по кнопці», і вибір між ними — питання смаку. Насправді ці інструменти різняться не набором команд, а тим, як тестовий код дістається до браузера. Саме ця відповідь визначає, якою мовою ви пишете тести, чи можете завести двох користувачів в одному сценарії, чи побачите справжній Safari й чи поїде той самий тест на віддалену машину без жодної правки.

    Тому питання «що обереш і чому» — про архітектуру, а не про фічі. «Playwright, бо він швидший і має trace viewer» — це перелік ярликів. «Залежить від того, чи потрібна мовна незалежність і чи є в сценаріях два браузери одночасно» — це вже (browser control model), і саме вона визначає, що інструмент дозволить, а що ні. Ця глава — про три такі моделі та їхню ціну.

    Три моделі керування браузером

    Чотири назви з заголовка розкладаються на три моделі, і кожна дає власні межі.

    Модель 1 — wire-протокол поза процесом браузера. Її нормативний опис живе у специфікації W3C: WebDriver — це інтерфейс дистанційного керування з платформо- і мовно-нейтральним wire-протоколом для програм, що працюють поза процесом браузера. Призначення названо прямо: дати авторам писати тести, які автоматизують браузер з окремого керувального процесу. Ланцюг вузлів у специфікації теж названий поіменно — local end (мовна бібліотека поверх протоколу), intermediary node (, що реалізує обидва боки) і endpoint node, реалізований самим браузером. Найважливіша вимога: будь-який віддалений вузол мусить бути невідрізнимим як чорна скринька з погляду клієнта. Разом ці дві речі — нейтральний протокол і невідрізнимість вузлів — дають головні властивості моделі: будь-яку мову клієнта й той самий тест на локальному драйвері та на віддаленій машині.

    Модель 2 — власний протокол інструмента. Тут інструмент розділений надвоє: бібліотека дає єдину API для запуску браузерів і взаємодії з ними, а (test runner) додає до неї повністю керований наскрізний прогін. Окремих драйверів під кожен браузер немає взагалі: браузери й системні залежності ставить власна CLI-команда інструмента. Ціна цієї зручності — браузери свої: за замовчуванням це відкрита збірка Chromium, а не Google Chrome, і вона на версію попереду брендового браузера.

    Модель 3 — виконання всередині браузера. Команди виконуються в браузері, і сам інструмент називає це постійним компромісом (permanent trade-off), а не тимчасовим обмеженням. Наслідок: немає серіалізації обʼєктів і wire-протоколів, є прямий доступ до всього в застосунку. Зворотний бік того самого — тестовий код теж виконується в браузері, а не в Node, і мовою назавжди лишається JavaScript.

    Модель 1
    тест будь-якою мовою

    wire-протокол,
    драйвер чи проксі
    поза процесом браузера

    Будь-який
    наявний браузер

    Модель 2
    тест у Node

    Власний протокол
    інструмента

    Свої збірки
    браузерів

    Модель 3
    тест у браузері,
    лише JavaScript

    Без протоколу,
    прямий доступ

    Той самий
    браузер

    Модель 1
    тест будь-якою мовою

    wire-протокол,
    драйвер чи проксі
    поза процесом браузера

    Будь-який
    наявний браузер

    Модель 2
    тест у Node

    Власний протокол
    інструмента

    Свої збірки
    браузерів

    Модель 3
    тест у браузері,
    лише JavaScript

    Без протоколу,
    прямий доступ

    Той самий
    браузер

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

    Що модель означає на практиці

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

    Осьwire-протоколВласний протоколВиконання в браузері
    Мова тестубудь-яка: протокол мовно-нейтральниймови, під які є офіційна бібліотека (TypeScript, Python, .NET, Java)лише JavaScript (і те, що в нього компілюється)
    Де живе тестовий коду власному процесі поза браузерому власному процесі (Node)всередині браузера
    Хто постачає браузерокремий драйвер до вже наявного браузерасам інструмент, власними збіркамитой браузер, у якому все й виконується
    Доступ до серверного коду з тестунапряму зі свого процесунапряму зі свого процесулише через команди-містки

    Головне, що варто винести з таблиці: мовна незалежність і віддалене виконання ростуть із wire-протоколу, і «той самий тест поїхав у ферму» — не фіча конкретного інструмента, а вимога специфікації. Проміжний вузол-проксі там оголошений законною частиною моделі й зобовʼязаний бути невідрізнимим від звичайного віддаленого кінця, тож тест про підключення до (browser farm) не знає нічого — деталі виносить глава «Паралельний запуск: workers, шардінг, браузерні ферми».

    Дзеркально працює й третя модель. «Двома браузерами водночас не керуємо» — не недоробка: інструмент сам перелічує це серед постійних компромісів разом із «тест привʼязаний до одного супердомену» (перехід на інше вмикається окремою командою cy.origin). І окремо, свідомо, дока веде другий список — тимчасових обмежень, куди йдуть нативні події й неповна робота з iframe. Перший список читається як опис архітектури, другий — як .

    Із тієї самої моделі випливає й прикладна незручність: серверні бібліотеки в браузер не імпортуються, тож підготовка даних іде через окремі команди-містки (cy.exec, cy.task, cy.request), а бази доводиться спеціально виставляти назовні. У першій і другій моделях тест живе у власному процесі й відкриває зʼєднання до бази прямо з коду. Це не «краще-гірше» — це різні ціни за різні вигоди.

    Selenium: парасольковий проєкт, а не бібліотека

    Питання «що таке Selenium» має точну відповідь у самій документації проєкту, і вона не збігається з розхожим переказом. Selenium — це (umbrella project) із набору інструментів і бібліотек, а не один інструмент. Дає він три речі: розширення для емуляції взаємодії користувача, сервер розподілу для масштабування виділення браузерів і інфраструктуру реалізацій специфікації W3C WebDriver, завдяки якій код лишається взаємозамінним між усіма основними браузерами. У ядрі — WebDriver, і дока називає його саме interface для написання наборів інструкцій, а не «драйвером» і не «бібліотекою».

    Звідси головний висновок, який і варто називати першим: кросбраузерність Selenium тримається на стандарті W3C, а не на власному протоколі проєкту. Продовження того самого — природа проєкту: він тримається на волонтерах, код вільно доступний. Тобто за сумісність відповідає спільнота плюс стандарт, а не вендор.

    Екосистема в офіційній доці розділена поіменно: WebDriver, Grid, IDE, Selenium Manager і окремий розділ практик. Наявність Selenium Manager у цьому переліку — та деталь, якої часто бракує: керування драйверами тепер частина самого проєкту. Розділ практик має явний поділ на заохочені (Encouraged) і не заохочені (Discouraged); серед заохочених — models, незалежність тестів і свіжий браузер на тест. Модальність порад варто читати дослівно: fluent API там стоїть як Consider using, тобто рекомендація до розгляду, а не припис.

    А чому Selenium досі варто розуміти навіть тим, хто пише на JS? Ринкової статистики ця глава свідомо не наводить: перевірених цифр про вакансії тут немає, а вигадувати їх на співбесіді гірше, ніж чесно сказати «не знаю». Але архітектурна причина цілком джерельна, і для відповіді її досить: протокол мовно нейтральний (тож накопичені на Java, C# і Python ніхто не переписуватиме заради нового інструмента), сумісність описана стандартом, а не вендором, а віддалене виконання вбудоване в саму модель — перенести прогін на іншу машину означає змінити точку підключення, а не тести.

    Playwright і Cypress: де саме проходить компроміс

    Друга модель платить за зручність тим, що браузери в неї власні — і платить чесно, у документації. Інструмент водить три рушії (Chromium, WebKit, Firefox) плюс брендові канали Chrome і Edge, а емуляція планшетів і мобільних — окремий режим, не окремий рушій. Але Firefox і WebKit тут — патчені збірки: з брендовими Firefox і Safari інструмент не працює, бо покладається на патчі. Тобто «перевіримо в Safari» через цей інструмент означає «перевіримо в найсвіжішій збірці WebKit», і це різні твердження. Мало того, той самий рушій на різних ОС поводиться по-різному — медіакодеки названі поіменно, тож «WebKit у Linux-CI» і «WebKit на mac» не взаємозамінні. Наслідок для матриці браузерів розібраний у главі «Кросбраузерність і адаптивна верстка».

    Друга половина компромісу — те, що ранер додає до бібліотеки. У бібліотеці рівні browsercontextpage створюються вручну й по черзі, і закривати їх — обовʼязок вашого коду. Ранер віддає тесту вже ізольовані page і context як вбудовані , створює їх ліниво (лише якщо тест назвав їх у своїх аргументах) і закриває сам. Кожен тест дістає свіжий (browser context), еквівалентний новому профілю, — ізоляція майже без накладних витрат. Ранер також приносить web-first assertions, що самі очікують і перезапускають умову, і матрицю конфігурацій в одному місці замість правок скрипта під кожен браузер. Деталі — у главах «Playwright: архітектура, браузери і контексти» і «Playwright: перевірки (assertions) і автоочікування (auto-waiting)».

    import { test, expect } from '@playwright/test';
    
    test('гість бачить кнопку входу', async ({ page }) => {
      await page.goto('/');
      // page і context дала фікстура ранера; асерт сам чекає й повторює умову
      await expect(page.getByRole('button', { name: 'Увійти' })).toBeVisible();
    });

    Окрема пастка тієї самої моделі — безголовий режим. Для нього постачається окремий бінарник chromium headless shell, а не та сама збірка з прапорцем; нове headless-ядро брендових браузерів поводиться інакше, і дока прямо просить очікувати різницю. Практичний наслідок: «локально headed зелене, у CI headless червоне» цілком може бути різницею збірок, а не логіки застосунку.

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

    CodeceptJS і надбудови: один сценарій, різні бекенди

    Четвертий інструмент із назви глави — не четверта модель, а шар над моделями. Тести тут пишуться як лінійний сценарій дій користувача, а обʼєкт I — це (actor): абстракція користувача-тестувальника й водночас проксі до ввімкнених хелперів (helper). Актор нічого не виконує сам: усі команди делегуються хелперу-бекенду. Бекенди названі поіменно — Playwright (власний протокол), WebDriver (wire-протокол), Puppeteer (протокол DevTools): надбудова накриває перші дві моделі, а виконання всередині браузера серед її бекендів немає.

    // той самий сценарій піде на будь-якому з бекендів
    Scenario('гість бачить кнопку входу', ({ I }) => {
      I.amOnPage('/');
      I.see('Увійти', 'button');
    });

    Тест виглядає синхронним, бо всі дії загорнуті в глобальний ланцюг; await потрібен не завжди, а за жорстким правилом — для команд, що починаються з grab, і для викликів імпортованих функцій та методів page object. Очікування вбудоване в дії, а невдалий крок повторюється автоматично — тобто тут живе на рівень нижче за ретрай тесту.

    І головний компроміс надбудови стоїть рівно тут. Хелпери мають спільну API, тож перемкнути бекенд легко — але джерело саме ставить межу: через відмінності бекендів сумісність не гарантована, і контрприклад дока наводить власний: заголовки запиту ставляться в Playwright і Puppeteer, а у WebDriver ні. Порада сформульована як вибір: узяти один хелпер, а міграцію робити, якщо зміняться вимоги. Два найважливіші налаштування конфігурації — саме який хелпер (тобто який рушій виконує) і базовий URL застосунку; перемикання між рушіями окремий пакет (@codeceptjs/configure) робить «per-helper translation … automatically». Сценарний стиль і хелпери детально розібрані в главі «CodeceptJS: актор, хелпери і сценарний стиль».

    Поруч із цими чотирма назвами ви зустрінете й WebdriverIO. Тут ми його свідомо не описуємо: перевіреного матеріалу про його архітектуру ця глава не має, а вгадувати внутрішню будову незнайомого інструмента — це вигадувати факти.

    Критерії вибору: з чого починати відповідь

    Порядок міркування в силабусі ISTQB CTAL-TAE названий прямо: спершу аналіз системи під тестом, потім склад і досвід команди. Це рівно навпаки до того, як вибір нерідко роблять на практиці («візьмемо те, що модне»). Із того самого джерела — ще два аргументи, які добре звучать на інтервʼю: тестувальникам, які програмують, силабус радить брати інструмент, чия мова збігається з мовою системи під тестом, і причина названа — спільний дебаг із розробниками й перехресне навчання; а для команди без досвіду програмування low-code / no-code рішення силабус називає життєздатним вибором, а не поразкою.

    Другу половину критеріїв дає не інструмент, а продукт. Покрити геть усі браузери й пристрої практично неможливо, тому діапазон підтримки — домовленість із власником продукту, а матриця будується з даних про аудиторію, а не з уподобань команди. Практичний наслідок: браузери на спільному (Chrome, Edge, Opera) не потребують окремих рядків матриці для більшості перевірок верстки — а от Safari потребує, і саме на ньому друга модель показує свою межу: патчена збірка WebKit брендовим Safari не є. Мінімальний кістяк для проєкту без особливих вимог дає базовий набір Baseline: Chrome (десктоп і Android), Edge, Firefox (десктоп і Android), Safari (macOS та iOS).

    І останнє, бо це поширена управлінська помилка: силабус CTFL говорить про категорії інструментів, а не про конкретні бібліотеки, і прямо застерігає — «просте придбання інструмента успіху не гарантує».

    так

    ні

    Що саме тестуємо
    (система під тестом)

    Які браузери реально потрібні
    матриця з даних про аудиторію

    Хто пише тести
    мова застосунку, досвід команди

    Де прогін живе
    локально, CI, віддалені браузери

    Чи забороняє модель
    щось із потрібного?

    Інша модель або окремий інструмент
    під цей сценарій

    Вибір обґрунтований

    так

    ні

    Що саме тестуємо
    (система під тестом)

    Які браузери реально потрібні
    матриця з даних про аудиторію

    Хто пише тести
    мова застосунку, досвід команди

    Де прогін живе
    локально, CI, віддалені браузери

    Чи забороняє модель
    щось із потрібного?

    Інша модель або окремий інструмент
    під цей сценарій

    Вибір обґрунтований

    Типові помилки

    • Виглядає як «перевірили в Safari», а насправді перевірили свою збірку WebKit. Інструмент із власним протоколом покладається на патчі й із брендовим Safari не працює взагалі. Обіцяти замовнику «Safari покритий» на цій підставі — обіцяти те, чого немає.
    • Виглядає як «WebKit у CI дорівнює WebKit на маку», а насправді той самий рушій на різних ОС поводиться по-різному. Медіакодеки названі в доці поіменно; Linux-CI дока називає зазвичай найдешевшим варіантом, але найближчий до Safari досвід дає лише mac.
    • Виглядає як «headless — та сама збірка з прапорцем», а насправді це окремий бінарник. chromium headless shell і нове headless-ядро брендових браузерів поводяться по-різному, і дока прямо просить очікувати різницю. Тому «локально зелене, у CI червоне» — спершу підозра на різницю збірок, а вже потім на застосунок.
    • Виглядає як «спільний API у хелперів дає взаємозамінність», а насправді сумісність не гарантована. Контрприклад наводить сама дока: заголовки запиту є в Playwright і Puppeteer, а у WebDriver їх нема. Обіцянка звучить як «легко мігрувати», а не «працює однаково».
    • Виглядає як «Selenium — бібліотека для автотестів», а насправді це парасольковий проєкт, у ядрі якого WebDriver як інтерфейс, а кросбраузерність тримає стандарт W3C. Це не придирка до слів: із хибної моделі в голові беруться хибні очікування щодо сумісності.
    • Виглядає як недоробка інструмента, а насправді опис моделі. «Двома браузерами водночас не керує» й «тест привʼязаний до одного супердомену» стоять у переліку постійних компромісів; нативні події й обмежена робота з iframe — у переліку тимчасових. Плутати ці списки означає планувати сценарії, які не буде на чому запустити.
    • Виглядає як «взяли інструмент — автоматизація є», а насправді ні. Силабус формулює це без ілюзій: просте придбання інструмента успіху не гарантує.

    Підсумок

    1. Інструменти різняться моделлю, а не синтаксисом. Моделей три: wire-протокол поза процесом браузера, власний протокол інструмента, виконання всередині браузера. Усе інше — наслідки.
    2. Мовна незалежність і віддалене виконання ростуть із wire-протоколу. Специфікація вимагає, щоб будь-який віддалений вузол був невідрізнимим від звичайного віддаленого кінця з погляду клієнта, тому той самий тест іде і на драйвер, і на ферму.
    3. Керованість браузерів купується власними збірками. Драйверів немає, зате Chromium — не Chrome, а WebKit — не Safari; і headless тут окремий бінарник, а не .
    4. Виконання в браузері дає прямий доступ і забирає все, що поза браузером: мову, другий браузер у сценарії, серверні бібліотеки. Інструмент називає це постійними компромісами сам.
    5. Надбудова уніфікує API, а не поведінку. Спільний сценарний шар над різними бекендами реальний, гарантована взаємозамінність бекендів — ні.

    Можливі питання

    «Що обереш і чому?» — питання перевіряє не назву інструмента, а наявність критеріїв. Сильна відповідь має форму: спершу що за система під тестом і які браузери реально потрібні, потім якою мовою пише команда й який у неї досвід, потім де живе прогін — і лише тоді назва інструмента як висновок. Інтервʼюер дивиться, чи є в кандидата порядок міркування; той самий порядок радить і силабус CTAL-TAE.

    «Що таке Selenium?» — питання-фільтр. Відповідь «бібліотека для автотестів» одразу видає переказ із чужих статей. Точна відповідь: парасольковий проєкт із трьох складників, у ядрі якого WebDriver як інтерфейс, а взаємозамінність коду між браузерами забезпечує специфікація W3C.

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

    «Чому Cypress не може X?» — перевірка, чи розумієте ви причину, а не факт. Правильна рамка: команди виконуються всередині браузера, тому мова лишається JavaScript, двома браузерами водночас керувати не виходить, тест привʼязаний до одного супердомену, а серверні бібліотеки не імпортуються — сідінг іде через команди-містки.

    «Коли доречний CodeceptJS?» — відповідь через хелпери: коли потрібен один читабельний сценарний шар над різними бекендами. І одразу назвіть межу самі: спільна API не означає гарантованої сумісності бекендів.

    Якщо інструмент вам незнайомий, найкраща відповідь — назвати межу свого знання й перевести розмову на модель, яку ви розумієте. Це читається як зрілість, а вигадана деталь архітектури — як .

    Джерела

    Три моделі керування браузером

    • W3C — WebDriver Level 2 — означення WebDriver як інтерфейсу дистанційного керування з платформо- і мовно-нейтральним wire-протоколом для програм поза процесом браузера; ланцюг local endintermediary nodeendpoint node і вимога must бути невідрізнимим як чорна скринька.
    • Playwright — Library — поділ на бібліотеку (єдина API для запуску браузерів) і ранер (керований наскрізний прогін) як опис другої моделі.
    • Playwright — Browsers — браузери й системні залежності ставить сам інструмент, окремих драйверів немає; за замовчуванням це відкрита збірка Chromium, а не брендовий Chrome, і вона на версію попереду.
    • Cypress — Trade-offs — третя модель словами самого інструмента: команди виконуються в браузері, немає серіалізації обʼєктів і wire-протоколів, є прямий доступ до застосунку — але тестовий код виконується не в Node, і мовою лишається JavaScript.

    Що модель означає на практиці

    • W3C — WebDriver Level 2 — вимога невідрізнимості віддаленого вузла й статус проміжного вузла-проксі як законної частини моделі: звідси «той самий тест локально і на віддаленій машині».
    • Cypress — Trade-offs — постійні межі третьої моделі (не універсальний автоматизатор, двома браузерами водночас не керує, тест привʼязаний до одного супердомену, cy.origin для -переходів) і поділ обмежень на постійні й тимчасові; підготовка даних через cy.exec / cy.task / cy.request.
    • Playwright — Browsers — браузер постачає сам інструмент своїми збірками, окремого драйвера під кожен браузер немає.
    • Playwright — головна сторінка — перелік мов, під які проєкт другої моделі дає офіційну бібліотеку: TypeScript, Python, .NET, Java.

    Selenium: парасольковий проєкт, а не бібліотека

    • Selenium — Documentation (оглядова сторінка) — Selenium як umbrella project; три складники (розширення для емуляції взаємодії, сервер розподілу, інфраструктура реалізацій W3C WebDriver із взаємозамінним кодом); WebDriver у ядрі саме як interface; волонтерська природа проєкту; склад екосистеми (WebDriver, Grid, IDE, Selenium Manager, практики) і поділ практик на Encouraged / Discouraged з модальністю Consider using для fluent API.
    • W3C — WebDriver Level 2 — мовна нейтральність протоколу й невідрізнимість віддаленого вузла як архітектурні причини довговічності цієї моделі.

    Playwright і Cypress: де саме проходить компроміс

    • Playwright — Browsers — три рушії плюс брендові канали; патчені Firefox і WebKit, з брендовими Firefox і Safari інструмент не працює; різниця платформ усередині того самого рушія (медіакодеки); chromium headless shell як окремий бінарник і застереження про інакшу поведінку нового headless-ядра.
    • Playwright — Library — ручне створення browsercontextpage у бібліотеці проти лінивих вбудованих фікстур ранера; web-first assertions і матриця конфігурацій як властивості саме ранера.
    • Playwright — головна сторінка — свіжий контекст на кожен тест, еквівалентний новому профілю браузера, як механізм ізоляції.
    • Cypress — Trade-offs — прямий доступ до застосунку без серіалізації як вигода третьої моделі і власна позиція інструмента: обмеження подаються як захист від поганих, повільних і -тестів.

    CodeceptJS і надбудови: один сценарій, різні бекенди

    • CodeceptJS — BasicsI як актор і проксі до ввімкнених хелперів; делегування всіх команд бекендам і перелік бекендів (Playwright, WebDriver через WebDriver-протокол, Puppeteer через протокол DevTools); спільний API без гарантії сумісності з контрприкладом про заголовки запиту; порада взяти один хелпер; глобальний промісний ланцюг і правило await для grab; вбудоване очікування й автоматичний ретрай невдалого кроку; два найважливіші налаштування конфігурації.
    • CodeceptJS — Configuration — хелпер у конфігурації задає рушій виконання, і той самий набір сценаріїв перемикається між рушіями через конфіг («the right per-helper translation … automatically»).

    Критерії вибору: з чого починати відповідь

    • ISTQB® Certified Tester Advanced Level Test Automation Engineering (CTAL-TAE) v2.0 — §1.2.2: порядок вибору інструмента (спершу аналіз системи під тестом, потім склад і досвід команди), збіг мови інструмента з мовою системи під тестом як порада для тестувальників із навичками програмування — з названою причиною, low-code / no-code як життєздатний вибір для команди без досвіду програмування.
    • ISTQB® Certified Tester Foundation Level Syllabus v4.0.1 — §6.1: силабус перелічує категорії інструментів, а не конкретні бібліотеки; §6.2: застереження, що просте придбання інструмента успіху не гарантує.
    • MDN — Introduction to cross-browser testing — покрити всі браузери й пристрої неможливо, тож діапазон підтримки — домовленість із власником продукту; матриця будується з даних про аудиторію; браузери на спільному рушії рендерингу не потребують окремих рядків.
    • web.dev — Baseline (Web Platform Baseline) — базовий набір браузерів як мінімальний кістяк матриці: Chrome (десктоп і Android), Edge, Firefox (десктоп і Android), Safari (macOS та iOS).

    Типові помилки

    • Playwright — Browsers — джерело трьох перших пасток: патчені збірки замість брендових Firefox і Safari, різниця платформ усередині рушія, chromium headless shell проти нового headless-ядра.
    • CodeceptJS — Basics — спільний API хелперів без гарантованої сумісності та власний контрприклад доки про заголовки запиту.
    • Selenium — Documentation (оглядова сторінка) — Selenium як парасольковий проєкт із WebDriver-інтерфейсом у ядрі та кросбраузерністю на стандарті W3C.
    • Cypress — Trade-offs — поділ обмежень на постійні (наслідок архітектури) і тимчасові (беклог) із поіменним переліком обох.
    • ISTQB® Certified Tester Foundation Level Syllabus v4.0.1 — §6.2: просте придбання інструмента успіху не гарантує.

    Підсумок

    • W3C — WebDriver Level 2 — перша модель: мовно-нейтральний wire-протокол поза процесом і невідрізнимість віддаленого вузла.
    • Selenium — Documentation (оглядова сторінка) — Selenium як парасольковий проєкт із трьох складників і кросбраузерність на стандарті W3C.
    • Playwright — Library — поділ бібліотека / ранер як опис другої моделі.
    • Playwright — Browsers — ціна другої моделі: свої збірки браузерів, окремий headless-бінарник, різниця платформ.
    • Cypress — Trade-offs — третя модель і її постійні компроміси словами самого інструмента.
    • CodeceptJS — Basics — надбудова над моделями: делегування бекендам і спільна API без гарантії сумісності.

    Можливі питання

    • ISTQB® Certified Tester Advanced Level Test Automation Engineering (CTAL-TAE) v2.0 — §1.2.2: порядок міркування, який і задає структуру сильної відповіді, — спершу система під тестом, потім команда.
    • Selenium — Documentation (оглядова сторінка) — джерельне формулювання відповіді «що таке Selenium»: парасольковий проєкт, три складники, WebDriver як інтерфейс, кросбраузерність на стандарті W3C.
    • Playwright — Browsers — матеріал для відповіді про різницю архітектур: власні збірки браузерів, брендові канали, межі кросбраузерності.
    • Playwright — головна сторінка — другий бік перевіреної негативної знахідки: Selenium на цій сторінці не згадується — як і Playwright на оглядовій сторінці Selenium, тож прямого порівняння там немає.
    • Cypress — Trade-offs — причини, а не факти, для питання «чому не може»: виконання в браузері, одна мова, один супердомен, команди-містки до бекенда.
    • CodeceptJS — Basics — відповідь про доречність надбудови й межу, яку варто назвати самому: спільна API без гарантованої сумісності бекендів.

    Пояснення

    «Поясни» працює з власним API-ключем Anthropic: запит іде з вашого браузера прямо до Anthropic.

    Свій API-ключ (BYOK)

    Вставте власний ключ Anthropic — пояснення працюватиме на реальній моделі. Ключ зберігається лише у вашому браузері (localStorage), нікуди не надсилається, крім api.anthropic.com, і не логується.