Transcription
Всем привет! Вы на моём первом уроке по автоматизации на Playwright, и в этом уроке я вам расскажу, что такое Playwright, как его установить, как запустить первый код. Покажу вам два режима работы: синхронный и асинхронный. И постепенно расскажу, что мы будем проходить на этом курсе. Поехали!
Прежде чем начать, я попрошу вас скачать и установить себе Python на компьютер. Playwright поддерживает разные языки программирования, но мы с вами будем писать тесты на Python, поэтому заходим на официальный сайт python.org, заходим в раздел downloads и скачиваем актуальную версию. В моём случае это 3.13.1. И так как мы выбрали Python, я рекомендую сразу установить себе, на мой взгляд, самую удобную среду разработки для Python — это PyCharm. Заходим на сайт jetbrains.com, переходим в раздел PyCharm, нажимаем download, и сначала нам JetBrains предлагает профессиональную версию. Мы её пропускаем, потому что она стоит денег, и скачиваем PyCharm Community Edition. Тоже можно её установить на Macbook, можно установить на компьютер под Windows. В общем, она бесплатная, ничего не требует. И поверьте мне, даже во многих коммерческих компаниях используют бесплатную версию, потому что она по своей производительности и функционалу очень мощная. И в ближайшее время, если вы только начинаете с автоматизацией, я думаю, вы даже не узнаете никакие фичи, которые вам потребуются в профессиональной версии.
Как только вы это сделали, запускаем PyCharm. У вас откроется вот такое вот окошко. Нажимаем "Новый проект" и сейчас я его назову Playwright Demo. Проверяем, что у нас стоит актуальная версия Python, и создаём пустой проект. Всё, вот у нас PyCharm быстро его создал. А мы с вами все установки Playwright будем уже выполнять непосредственно в PyCharm. Не нужно ставить дополнительно какой-нибудь терминал и что-то запускать. Всё здесь встроено. Переходим в раздел "Терминал". Можно сразу здесь проверить, какая у нас версия Python стоит: `pip --version`. И видим, да, что вот у нас Pip 23.2.1, Python 3.11. Немножко старше, чем была на официальном сайте. Я давно не обновлялся, но ничего страшного.
Теперь устанавливаем сам Playwright. Я должен сказать, что на сайте Playwright документация и всё описано, как тут можно установить playwright, pytest. Вот прямо приведены команды, которые можно скопировать и вставить. Давайте начнём постепенно это делать. Первая команда: `pip install pytest playwright`. Копируем, возвращаемся в PyCharm, вводим эту команду, запускаем. Вот, соответственно, у меня всё установилось. Тоже мне подсказывает терминал, что можно бы обновить сам pip. Сделаю это попозже.
Вторая команда, которая нам необходима, — это `playwright install`. Команда установит различные браузеры, с которыми мы сможем впоследствии работать. `playwright install`. Нажимаем, и сейчас какое-то время займёт, пока он скачает мне самые популярные браузеры.
Пару слов, пока скачивает, почему Playwright. На сегодняшний день я обратил внимание, что материалов меньше, чем по тому же Selenium. И лично для меня просто интереснее записывать материал про Playwright, нежели чем про Selenium. Во-вторых, я обратил внимание, что всё больше и больше Playwright становится актуален на рынке. Во-первых, на работе у меня всё больше проектов мигрирует с Selenium на Playwright или новые проекты стартуют только на Playwright. Во-вторых, походил я тут по собеседованиям, и несмотря на то, что в моём резюме стоит и Selenium, и Playwright, вопросы мне в основном задавали именно по Playwright. Инструмент набирает обороты, всё больше будет требоваться специалистов. Поэтому рекомендую вам, если вы раньше не сталкивались с автоматизацией вообще, то можете попробовать начать именно с автоматизации на Playwright. Тем более, что перед Selenium у него есть тоже определённые преимущества, о которых мы постепенно будем разговаривать.
Итак, у меня всё установилось. Теперь начинаем делать первый файл. `New Python`. И как я обещал, мы с вами посмотрим два режима работы в Playwright: синхронный и асинхронный. Я начну с синхронного: `sync_example.py`. Всё, создаём такой файл. И давайте пару слов про эти режимы. В общем, в Playwright есть так называемый синхронный режим, при котором у нас все команды выполняются последовательно, одна за другой. А есть второй режим — асинхронный. Мы тоже посмотрим, как выглядит код в этом режиме. Суть в том, что в асинхронном режиме у нас команды могут выполняться параллельно. А это работает иногда хорошо, тогда, когда у нас есть какой-то сложный запрос, ту же базу данных, или сложная функция, которая будет долго выполняться, или даже неизвестно, сколько она будет выполняться. И если мы работаем в синхронном режиме, то мы будем просто ждать, пока этот запрос выполнится. В асинхронном мы можем делать что-то параллельно.
Мне нравится абстрактный пример — это заказ еды в ресторане. Представьте, что вы приходите в какую-то столовку, и у вас режим шведского стола. Когда вы берёте поднос, накладываете себе сколько хотите салаты там, суп, горячее, потом идёте на кассу и оплачиваете. В общем, пока вы вот все вот эти действия параллельно не сделаете и сами в очередь не станете, не оплатите на кассе ваш обед, то вряд ли вы начнёте кушать или сможете сделать что-то ещё.
И другой режим — асинхронный. Когда вы подзываете официанта, он принимает у вас, например, заказ на напитки. Вы думаете параллельно, что вы хотите скушать из горячего. Официант вам может уже принести напиток, может ещё думать. Вы можете его второй раз позвать, сказать, что вы готовы заказать еду. Можете пойти параллельно руки помыть, кому-то позвонить, что-то делать, занимать столик. В общем, чувствуете разницу, да? Два разных подхода. У того и у другого есть плюсы. Синхронный режим, как правило, быстрее. Но если у нас скапливается много народу или много методов, или же у нас возникает какой-то тяжёлый случай, который блокирует все остальные, то в данном случае будет работать асинхронный режим лучше, чем синхронный.
И давайте посмотрим, как это работает в Playwright. Сейчас я попробую немножко увеличить свой экран, чтобы вам было видно, что я тут печатаю. Да, прежде чем я начну, ещё хочу вернуться к документации. Мы постепенно с вами будем тут идти по ней. И хочется сказать, что чтобы начать автоматизировать на Playwright, по крайней мере со мной, да, вам потребуется какой-то минимум знаний Python. Потому что если вы первый раз видите язык программирования Python и, например, вот этот код вам ни о чём не говорит и прямо страшно хочется прятаться, то скорее всего, вам сейчас нужно остановить это видео и найти какое-нибудь видео, которое вам расскажет основы синтаксиса Python. Не нужно углубляться и становиться каким-то супер-программистом, но какие-то базы, да, что такое `import`, что такое функции, как передавать параметры в эти функции — ну, вы должны знать. Я, естественно, буду вам рассказывать, что какая строчка делает, что она означает. Но если вы прямо вот первый раз видите код Python, то я рекомендую всё-таки пройти какую-то базу. Тем более, что материалов в интернете бесплатных очень много.
Итак, синхронный режим. А чтобы использовать методы и библиотеку синхронного режима, давайте мы, как и в большинстве файлов Python, сделаем первый импорт: `from playwright.sync_api import sync_playwright`. Всё, мы импортировали синхронный режим. Дальше стандартная конструкция в Python: `with sync_playwright() as p:`. Обратите внимание, мне PyCharm прям сразу подсказывает, да, я буквально два символа ввёл, и он уже знает, что я хочу. Стандартная функция `with sync_playwright()`, да, я говорю, что я буду использовать функцию `sync_playwright` и вызывать её через переменную `p`. Дальше я определюсь тоже, в каком браузере я буду это делать. Соответственно, `browser = p.chromium`. То есть буду работать с браузером Chrome. И вот этой строчкой я буду запускать браузер для работы с каким-то сайтом. Вот. Дальше, что мы можем с этим браузером сделать? Мы можем открыть какую-то новую страницу, да, с которой мы будем работать, на которую мы потом впоследствии будем тестировать. Сделаем это следующим образом: `page = browser.new_page()`. Ещё раз, я почти даже ничего не делаю, да, я ввожу первые буквы, и у меня сам подсказывает, какой код мне нужно делать дальше. Всё, `new_page()`. Теперь моя задача — передать браузеру, собственно, адрес страницы, которую я хочу открыть. Для этого мы сделаем следующее: `page.goto()`. И вот здесь нужно просто передать URL нашей страницы. Давайте я для примера возьму просто свой сайт `test.ru`. В данном случае мы просто её откроем и посмотрим на неё, ничего там проверять не будем. Опять же, на этом уроке мы просто проверим, что у нас Playwright действительно каким-то образом заработал. Единственное, что мы сделаем, давайте это скриншотим, что же там откроется. И для этого мы тоже через `page` вызовем функцию `screenshot()`. И здесь нам надо передать путь, через который, в котором она сохранится. Давайте я просто сделаю название скриншота какой-нибудь `home_page.png`. Давайте по красивее исправлю опечатку, да, `home_page.png`. Соответственно, у меня должно вот это вот сохраниться. И всё, последнее, что мне нужно сделать, это закрыть браузер: `browser.close()`. Всё, вот у нас первый код. И давайте его запустим, посмотрим, что у нас будет. Так, запускаю, запускаю, запускаю, запускаю. И обратите внимание, у меня ничего не отобразилось, ничего не произошло. Но вот появился `home_page` новый скриншот создался. И вот, если мы его откроем, то видно, вот что пыталось загрузиться вот эта вот первая моя страница. Да, если вы помните, был такой режим работы, когда мы нажимали на кнопку "Run", и у нас запускался браузер, мы прямо видели, что происходило. В Playwright это тоже возможно. Вот здесь вот, когда мы запускаем наш браузер, можно в функцию `launch()` передать параметр `headless=False`. И давайте мы повторим, собственно. Я запускаю, и сейчас вот у меня запустился браузер, грузится страница, и страница закрывается. Всё, достаточно быстро произошло. `home_page` у меня пересоздался. Это синхронный режим.
Теперь попробуем такой же код написать на асинхронном режиме. Только давайте сейчас я немножко всё-таки проект обновлю. Я сделаю, а, создам новую директорию и положу туда скриншот, который будет создаваться дальше. Так, вот я сделал папку `screenshots` и вот сюда я положу вот этот вот файл. Да, давайте я его на всякий случай удалю. Угу. И запущу ещё раз. Посмотрим, что у меня файл теперь сохранится именно в эту папку. Вот, загружается. И как вы видите, да, скриншот появился `home_page`. Отлично.
Теперь создаём новый файл Python и назовём его `async_example.py`. Нижнее подчеркивание. Кстати, на собеседованиях, которые я последнее время проходил, очень популярный был вопрос на Playwright, прям с него всегда начинали: либо чем отличался синхронный режим от асинхронного, либо сейчас вы видите ещё такую команду `async`, просто сказали, что это такое, зачем это, как работает, и потом просили написать какой-нибудь код, который продемонстрирует преимущество работы асинхронного режима. Может быть, в последствии, в следующих уроках мы это тоже с вами рассмотрим. В общем, давайте тот же код, простую функцию мы напишем в асинхронном режиме. Для этого делаем немножко другой импорт и делаем `from playwright.async_api import async_playwright`. То есть здесь мы уже будем работать с функциями асинхронного режима. Да, и что мне ещё понадобится, это `import asyncio`. Всё. И поехали.
Теперь, чтобы начать работать в асинхронном режиме, нам нужно уже сразу написать функцию. А мы её назовём `async def main():`. Асинхронный режим подразумевает того, что мы пишем какие-то функции, они выполняться могут, как мы сказали, параллельно. Поэтому здесь уже функция `main` — наличие её у нас обязательно. И разные строки, которые мы пишем в асинхронном коде, они помечаются либо командой `await`, либо командами `async`. Даже впоследствии, когда мы будем работать с этим режимом, я вам объясню, что какая из них означает, как их запускать и как писать, чтобы у нас была вот эта самая параллельность. Но сейчас вам достаточно видеть просто, что чтобы начать работать в асинхронном режиме, по аналогии используем `with async_playwright() as p:`. И дальше, в общем-то, повторяем наш код. `browser = await p.chromium.launch(headless=False)`. Да, и давайте сразу здесь пропишем `headless=False`. Дальше `page = await browser.new_page()`. Одно удовольствие вот так вот программировать. Вроде кажется много кода, но требуется буквально несколько кликов клавиатуры, чтобы набирались эти `await page.goto()`. И давайте для разнообразия сделаем какую-нибудь другую страницу. Например, например, например, вот у меня есть, наверно, самый популярный мой курс — симулятор собеседования. Соответственно, мы его попробуем домашнюю страничку и открыть. Двойные кавычки я забыл, сейчас поставлю. Всё. У нас должна теперь открыться вот эта вот страница. Также мы сделаем сохранение скриншота и сделаем мы это теперь в папке `screenshots`, назовём его `interview.png`. И последнее, что нам осталось сделать, это закрыть браузер: `await browser.close()`. Так. И последнее, что нам надо сделать, это вызвать вот эту вот функцию `main`. Для этого нам нужно нажать как раз `asyncio.run(main())`. Да, немножко другой способ запуска именно вот этой функции. И всё. Если дальше я нигде не напортачил, то код должен отработать. Запускаем. У нас стартует браузер, открывается страница. И что-то всё-таки у нас упала. Да, он мне говорит, что ошибка в этой девятой линии. Всё-таки он здесь. Ну, конечно, да, я здесь не передал путь. Да. А так. Вот. Всё, теперь должно работать. Да. Всё, теперь у нас можем посмотреть вот этот вот файлик, который открылся. Видим, что он отличается от того, что мы сделали в первый раз. И всё. Вот, да, два простых кода у нас отработали. Надеюсь, вам урок этот был полезный. Если хотите узнать, как писать тесты на Playwright, подписывайтесь на канал и увидимся в следующих уроках.