Для автоматизации тестирования веб‑приложений существует множество инструментов. Они помогают разработчикам и тестировщикам повысить эффективность своей работы и снизить рутину. Сегодня рассмотрим два популярных фреймворка: 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 — подходящий вариант.

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

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

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

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

Комментарии (13)


  1. RussianTM
    18.09.2024 11:09
    +1

    Не бойтесь принимать решений и брать ответственность на себя, рекомендуйте всем Playwright


  1. voody77
    18.09.2024 11:09
    +1

    Точно Playwright написан на Go?


    1. sovcombank_tech Автор
      18.09.2024 11:09

      Написан на TypeScript. Поправили. Спасибо!


  1. mrBuG
    18.09.2024 11:09
    +2

    Интересно, а насколько быстрее playwright выполняет тест из статьи, в сравнении с selenium?


    1. Ivan_PNZ
      18.09.2024 11:09
      +2

      а этого мы никогда и не узнаем от автора. Просто быстрее и все, пруфов нет)


      1. sovcombank_tech Автор
        18.09.2024 11:09
        +1

        Одобрили ваш комментарий :)

        Мы подумаем над пруфами. В каком формате их показать.


  1. Its_Not_Nickname
    18.09.2024 11:09

    Ну так-то Playwright поддерживает java https://playwright.dev/java/docs/intro. Аргумент про количество языков из-за этого выглядит не очень состоятельным