Selenium или Playwright – что выбрать разработчику и тестировщику

от автора

Для автоматизации тестирования веб‑приложений существует множество инструментов. Они помогают разработчикам и тестировщикам повысить эффективность своей работы и снизить рутину. Сегодня рассмотрим два популярных фреймворка: Selenium и Playwright. Взвесим все плюсы и минусы, а вывод вы сделаете сами.

Всем привет. Меня зовут Никита. Я работаю разработчиком в «Совкомбанк Технологии». Решил поделиться своим мнением о фреймворках Selenium и Playwright. Оговорюсь сразу. Данная статья носит исключительно образовательный характер, не ставит своей целью рекламу и не являются частью коммерческих продуктов компании. Ну, как вы понимаете, нет мне никакого смысла рекламировать тот или иной фреймворк. Поехали!

Старый добрый Selenium

Selenium — это один из старейших и наиболее известных инструментов для автоматизации веб-приложений. Он был разработан в 2004 году Джейсоном Хаггинсом и с тех пор стал стандартом для автотестов. Фреймворк написан на Java и поддерживает множество языков программирования, включая Python, C#, Ruby и JavaScript.

Многие утверждают, что он – тот самый старый конь, который борозды не портит

Многие утверждают, что он – тот самый старый конь, который борозды не портит

Selenium работает с ChromeDriver для Google Chrome и GeckoDriver для Mozilla Firefox. Эти драйверы взаимодействуют с браузером через WebDriver API, что позволяет автоматизировать такие действия пользователя, как клики, ввод текста и навигацию по страницам.

Одним из основных недостатков Selenium является его невысокая скорость. Причин такой неторопливой работы несколько.

Во-первых, он взаимодействует с браузером через драйверы, что приводит к значительным задержкам, особенно при работе с тяжелыми веб-приложениями. Например, если сайт содержит множество динамических элементов или загружается большое количество данных, скорость работы Selenium падает.

Во-вторых, перехват запросов. Он осуществляется с помощью Selenium Wire. Этот инструмент работает синхронно, может блокировать выполнение других задач, что негативно сказывается на скорости и надежности.

В третьих, взаимодействие с элементами на странице. Для этого Selenium использует WebDriver API. Это включает в себя такие методы, как `findElement`, `click`, `sendKeys` и другие. Хотя эти методы достаточно мощные, они могут быть медленными и ненадежными при работе с динамическими элементами.

Документация Selenium

Молодость и скорость на стороне Playwright

Playwright – более молодой фреймворк. Славится высокой скоростью и производительностью, потребляет заметно меньше ресурсов даже при работе с современными браузерами. Благодаря легковесным эмуляторам браузеров, он проходит тесты значительно быстрее, чем Selenium. Это особенно полезно при работе с большими и сложными веб-приложениями, где скорость выполнения тестов имеет критическое значение. 

Новый конь – крутой конь? Не все так однозначно

Новый конь – крутой конь? Не все так однозначно

Playwright предлагает современные и удобные методы для взаимодействия с элементами на странице. Playwright поддерживает автоматическое ожидание элементов, что позволяет избежать проблем с синхронизацией и делает взаимодействие с элементами более надежным и эффективным.

В целом, синтаксис Playwright более современный и удобный. Он предоставляет более мощные функции для управления браузером и выполнения различных задач автоматизации.

Документация Playwright

Смотрите детальное сравнение фреймворков по множеству параметров.

Критерий

Selenium

Playwright

Год выпуска

2004

2020

Язык разработки

Java

TypeScript

Поддерживаемые языки

Java, Python, C#, Ruby, JavaScript

JavaScript, TypeScript, Python, C#

Скорость

Медленная, особенно на тяжелых сайтах

Высокая, благодаря легковесным эмуляторам

Взаимодействие с элементами

WebDriver API, возможны проблемы с динамическими элементами

Современные методы, автоматическое ожидание элементов

Поддержка мобильных устройств

Ограниченная, через Appium

Встроенная поддержка эмуляции мобильных устройств

Перехват запросов

Через Selenium Wire, медленно и ненадежно

Встроенные возможности, быстро и эффективно

Поддерживаемые браузеры

Chrome, Firefox, Safari, Edge, Opera

Chromium, Firefox, WebKit

Сообщество и документация

Широкое сообщество, обширная документация

Быстро растущее сообщество, отличная документация

Поддержка синхронного/асинхронного кода

Синхронный код, возможны блокировки выполнения задач

Поддержка асинхронного кода, улучшенная производительность

Переезд с Selenium на Playwright

Я писал проект на Selenium, задачами которого были: регистрация на сайте, подтверждение аккаунта с помощью e-mail и проверка данных на сайте. Вот как выглядит этот алгоритм:

  1. Создание заявки

    1. Нужно прокликать кнопки «Далее» и чекбоксы «Подтверждаю».

    2. Ввести данные в поля, выбрать дату.

    3. Решить каптчу:

      1. получить картинку с каптчей;

      2. отправить картинку на сервис по решению каптчи;

      3. дождаться результата.

    4. Кликнуть на нужный вариант созданной заявки.

    5. Прокликать «Далее» до завершения.

    6. Спустя какое‑то время нужно прочитать письмо (в моём случае gmail) и перейти по ссылке для подтверждения регистрации.

  2. Проверка актуальности заявки:

    1. ввести данные для входа;

    2. кликнуть «Далее»;

    3. проверить текст на странице.

Как я писал выше, Selenium не мог похвастать высокой скоростью работы. Не знаю, кому нравится мучительно наблюдать за длительной загрузкой страницы и медленным поиском элементов. Небо узнало о моих мучениях и послало мне информацию о Playwright. Когда я узнал, что появилась достойная замена Selenium, то захотел передать свой проект в руки другого фреймворка – молодого и быстрого соперника.

Далее я описал методы, которые использовал для этого. Ниже делюсь ими.

Базовый гайд

Для начала нужно запустить браузер.

●        Selenium:

from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com")

●        Playwright:

from playwright.sync_api import sync_playwright, Playwright   def run(playwright: Playwright):     chromium = playwright.chromium     browser = chromium.launch()     page = browser.new_page()     page.goto("http://example.com")            with sync_playwright() as playwright:     run(playwright) 

Затем нужно получить элементы checkbox и button и кликнуть по ним:

●        Selenium:

driver.find_element(value=“Checkbox”).click() driver.find_element(value=“ButtonNext”).click()

●        Playwright:

page.get_by_label("Checkbox").click() page.get_by_label("ButtonNext").click()

После нажатия на кнопку происходит переход на следующую страницу, на которой нужно ввести данные для регистрации:

●        Selenium:

driver.find_element(value=“ctl00_MainContent_txtFam”).send_keys("Simple Name")

●        Playwright:

page.get_by_label("ctl00_MainContent_txtFam").fill("Simple Name") 
 *Повторить действия для остальных полей*

*Повторить действия для остальных полей*

Не забываем выбрать дату из выпадающего списка. Для этого можно использовать:

●        Selenium:

element = self._driver.find_element(value=”ctl00_MainContent_DDL_Day”) select = Select(element) select.select_by_value(value_of_item)

●        Playwright:

page.get_by_label("ctl00_MainContent_DDL_Day").select_option(value_of_item) 

Теперь прокликиваем кнопки до завершения регистрации с помощью вышеописанных методов. После регистрации на почту придёт письмо. Я пользуюсь gmail api, мой класс для чтения писем выглядит так:

import os import pickle from typing import List, Optional  from google.auth.transport.requests import Request from google_auth_oauthlib.flow import InstalledAppFlow from googleapiclient.discovery import build  from base64 import urlsafe_b64decode   class GoogleMaster:     # Request all access (permission to read/send/receive emails, manage the inbox, and more)     SCOPES = ['https://mail.google.com/']     TOKEN_FILENAME = os.path.expanduser('~/token.pickle')      def __init__(self) -> None:         self._service = self._auth()      def _auth(self):         creds = None         # the file self.TOKEN_FILENAME stores the user's access and refresh tokens, and is         # created automatically when the authorization flow completes for the first time         if os.path.exists(self.TOKEN_FILENAME):             with open(self.TOKEN_FILENAME, 'rb') as token:                 creds = pickle.load(token)         # if there are no (valid) credentials availablle, let the user log in.         if not creds or not creds.valid:             if creds and creds.expired and creds.refresh_token:                 creds.refresh(Request())             else:                 flow = InstalledAppFlow.from_client_secrets_file('credentials.json', self.SCOPES)                 creds = flow.run_local_server(port=0)             # save the credentials for the next run             with open(self.TOKEN_FILENAME, 'wb') as token:                 pickle.dump(creds, token)          return build('gmail', 'v1', credentials=creds)      def search_messages(self, query):         result = self._service.users().messages().list(userId='me', q=query).execute()         messages = []          if 'messages' in result:             messages.extend(result['messages'])          while 'nextPageToken' in result:             page_token = result['nextPageToken']             result = self._service.users().messages().list(userId='me', q=query, pageToken=page_token).execute()             if 'messages' in result:                 messages.extend(result['messages'])          return messages 

Из писем я извлекаю ссылку для подтверждения регистрации, открываю ее в браузере, решаю каптчу и нажимаю кнопку:

@retry_on_login def accept_by_url(self, url: str) -> None:     self.start_browser(url)      self._resolve_captcha()     self._click_by_id(id=’ButtonA')      self.quit_browser()      if not self._if_login_success:         raise LoginAuthError('Login failed')

Вуаля!

После завершения регистрации можно пользоваться всеми преимуществами зарегистрированного пользователя. Вышеописанных действий достаточно, чтобы начать самостоятельное плавание с Playwright или Selenium.

Моё решение

Вот еще метод, которым я пользовался. Ожидание загрузки страницы:

●     Selenium:

WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID, "some_id")))

●     Playwright:

element = page.get_by_label("some_id") element.wait_for()

Получение атрибута элемента: element.get_attribute(name)

Выполнение JavaScript:

●     Selenium:

driver.execute_script("window.scrollTo(0,document.body.scrollHeight);") 

●     Playwright:

page.evaluate("() => window.scrollTo(0, document.body.scrollHeight);") 

Очевидные и неочевидные выводы

Как вы понимаете, Selenium и Playwright имеют свои преимущества и недостатки. Оба этих фреймворка заслуживают, чтобы быть в арсенале разработчика и тестировщика.

Selenium — проверенный временем инструмент с широкой поддержкой и большим сообществом пользователей. Однако его скорость и производительность могут быть недостаточными для современных веб-приложений.

Playwright предлагает высокую скорость, простоту установки и настройки, а также современные методы взаимодействия с элементами. Он имеет встроенную поддержку мобильных устройств и перехвата запросов, что делает его отличным выбором для автоматизации тестирования современных веб-приложений.

В конечном итоге, выбор между Selenium и Playwright зависит от конкретных требований вашего проекта. Если вам нужны высокая скорость, производительность и простота использования, Playwright может быть лучшим выбором. Если же вам требуется поддержка множества языков программирования и драйверов браузеров, Selenium — подходящий вариант.

Красная или синяя таблетка машинка — решать вам

Красная или синяя таблетка машинка — решать вам

Для тех, кто только начинает свой путь в автоматизации тестирования, рекомендуется попробовать оба инструмента и выбрать тот, который лучше всего подходит для ваших нужд. Оба фреймворка имеют обширную документацию и активное сообщество, что делает их отличными инструментами для автоматизации тестирования веб-приложений.

У нас в «Совкомбанк Технологии» есть адепты как одного, так и другого фреймворка. Копья в спорах не ломаем, но каждый имеет свое мнение, которым охотно делится. А чем пользуетесь вы? 

Напишите в комментариях… или, если вам хочется выслушать мнения всех наших разработчиков и тестировщиков, приглашаю стать частью команды. У нас на сайте регулярно публикуется список актуальных вакансий – посмотрите, возможно, мы ждем именно вас  


ссылка на оригинал статьи https://habr.com/ru/articles/843726/