Playwright у світі .NET
У 2020 році, окрім пандемії COVID-19, світ автоматизованого тестування сколихнула нова подія — у гру ввійшов новий гравець та ім’я йому Playwright.
Переважно, розробки від Microsoft зустрічають скептично, але Playwright підняв дуже багато обговорень навколо себе. І не дарма, цей проект дуже активно розвивається.
Хоча розроблявся він у JavaScript екосистемі, Microsoft дуже швидко випустили порт на python, java та C#. Ця стаття буде про мій досвід з Playwright-ом та C#.
Чому Playwright ?
Playwright для роботи з браузером використовує DevTools protocol. І окрім того, що він швидкий є наступні переваги:
- можливість перехоплювати HTTP трафік
- можливо змінювати HTTP трафік
- робота з WebSocket
- підтримка геолокацій
- можливість емулювати мобільні пристрої
- Робота з функціями JS на сторінці
- Зручна робота з різними вкладками браузера
- Вбудовані очікування
- Вбудований Logger
Якщо одна з подібних фіч вам потрібна — розгляньте Playwright.
Для мене легка робота з HTTP трафіком дуже стає у нагоді — можна кожен запит\відповідь логувати і відповідно мати багато інформації, коли тест падає.
Основні концепти
Є декілька рівнів абстракції у Playwright
- IPlaywright — дає можливість нам створити браузер який нам потрібно. На даний момент є: Firefox, Chrome та WebKit
- IBrowser — власне сам браузер. Він може створити нову сторінку IPage або новий браузер контекст IBrowserContext. Відмінність у тому, що IBrowserContext є ізольований. Тобто, кеш та куки будуть спільні для сторінок одного контексту.
- IPage — сутність, яка містить дану сторінку. Власне, з нею будуть проводитись всі взаємодії. Сюди попадає не лише HTML сторінка, а також і DevTool.
Важливо зрозуміти, що кожна з цих сутностей отримає дані під час створення. Тобто, наприклад, коли ми працюємо з WebDriver-ом, то при виконанні команди findElement() він буде звертатись до сторінки браузера і повертати знайдені елементи. Натомість, Playwright збереже всю сторінку у змінну IPage, і вже вам доведеться з нею працювати.
Особливості C# реалізації Playwright
Найперше, що мені кинулось у очі це те, як Playwright заточений під JS.
Перше — це через асинхронне програмування. Більшість методів є асинхронними. Вам потрібно бути ознайомленим з концепцією async\await у C#. Нічого складного, але свої нюанси добавляє.
Друге, це велика к-сть подій (events). На них можна підписатись і виконувати якісь дії коли ця подія виникне. Наприклад, таким чином можна записувати у логи різні HTTP запити та відповіді.
Третє, відсутність перевантажених методів у Playwright. Кожен метод має велику к-сть стандартних аргументів. Наприклад, метод GetPdfAsync() має 13 (!!!) аргументів.
Такі особливості не є недоліками. На моїй практиці всі вони мало де або взагалі не використовувались у автоматизації за допомогою WebDriver-а та C#. Тому до цього потрібно бути готовим. Особливо до асинхронних тестів.
Моя реалізація
Я ще не мав можливості попрацювати з Playwright на якомусь проекті, але вирішив пограти з ним вдома.
Посилання на моє репо з прикладом використання Playwright та C# тут
Це дуже маленький та простий проект, мета якого продемонструвати якісь основи цієї бібліотеки. Там ви знайдете один тест та декілька сторінок.
Я спробував використати PageObject патерн, десь так само як він використовується з WebDriver-ом.
Недоліки Playwright
Також є декілька ложок дьогтю у Playwright:
- Немає підтримки IE та Edge браузерів
- Поки мала к-сть навчальних матеріалів
- Відсутня інфраструктура для паралелізації (Moon підтримує, але є комерційним рішенням)
Summary
Драматург вчинив багато галасу у світі Test Automation. Це дійсно новий та цікавий інструмент який заслуговує уваги. По темпах його розвитку можна сказати, що він можливо і складе конкуренцію WebDriver-у. А можливо його можна буде використовувати у тандемі. Тим не менше, побачимо, що для нас приготує Selenium 4, адже у ньому також повинна з ‘явитись підтримка DevTool протоколу. Але про реліз Selenium 4 говорять з 2019, а його і досі (березень 2021) немає.
P.S. я прихильник того, щоб технологію чи інструмент обирали не по принципу “ооо, щось новеньке. Треба все перенести на неї”, а з чітким розуміння, для чому саме ця технологія. То ж обирайте правильно.