Для автоматизации тестирования веб‑приложений существует множество инструментов. Они помогают разработчикам и тестировщикам повысить эффективность своей работы и снизить рутину. Сегодня рассмотрим два популярных фреймворка: 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` и другие. Хотя эти методы достаточно мощные, они могут быть медленными и ненадежными при работе с динамическими элементами.
Молодость и скорость на стороне Playwright
Playwright – более молодой фреймворк. Славится высокой скоростью и производительностью, потребляет заметно меньше ресурсов даже при работе с современными браузерами. Благодаря легковесным эмуляторам браузеров, он проходит тесты значительно быстрее, чем Selenium. Это особенно полезно при работе с большими и сложными веб-приложениями, где скорость выполнения тестов имеет критическое значение.
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 и проверка данных на сайте. Вот как выглядит этот алгоритм:
Создание заявки
Нужно прокликать кнопки «Далее» и чекбоксы «Подтверждаю».
Ввести данные в поля, выбрать дату.
Решить каптчу:
получить картинку с каптчей;
отправить картинку на сервис по решению каптчи;
дождаться результата.
Кликнуть на нужный вариант созданной заявки.
Прокликать «Далее» до завершения.
Спустя какое‑то время нужно прочитать письмо (в моём случае gmail) и перейти по ссылке для подтверждения регистрации.
Проверка актуальности заявки:
ввести данные для входа;
кликнуть «Далее»;
проверить текст на странице.
Как я писал выше, 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 — подходящий вариант.
Для тех, кто только начинает свой путь в автоматизации тестирования, рекомендуется попробовать оба инструмента и выбрать тот, который лучше всего подходит для ваших нужд. Оба фреймворка имеют обширную документацию и активное сообщество, что делает их отличными инструментами для автоматизации тестирования веб-приложений.
У нас в «Совкомбанк Технологии» есть адепты как одного, так и другого фреймворка. Копья в спорах не ломаем, но каждый имеет свое мнение, которым охотно делится. А чем пользуетесь вы?
Напишите в комментариях… или, если вам хочется выслушать мнения всех наших разработчиков и тестировщиков, приглашаю стать частью команды. У нас на сайте регулярно публикуется список актуальных вакансий – посмотрите, возможно, мы ждем именно вас.