Для автоматизации тестирования веб‑приложений существует множество инструментов. Они помогают разработчикам и тестировщикам повысить эффективность своей работы и снизить рутину. Сегодня рассмотрим два популярных фреймворка: 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 — подходящий вариант.
Для тех, кто только начинает свой путь в автоматизации тестирования, рекомендуется попробовать оба инструмента и выбрать тот, который лучше всего подходит для ваших нужд. Оба фреймворка имеют обширную документацию и активное сообщество, что делает их отличными инструментами для автоматизации тестирования веб-приложений.
У нас в «Совкомбанк Технологии» есть адепты как одного, так и другого фреймворка. Копья в спорах не ломаем, но каждый имеет свое мнение, которым охотно делится. А чем пользуетесь вы?
Напишите в комментариях… или, если вам хочется выслушать мнения всех наших разработчиков и тестировщиков, приглашаю стать частью команды. У нас на сайте регулярно публикуется список актуальных вакансий – посмотрите, возможно, мы ждем именно вас.
ссылка на оригинал статьи https://habr.com/ru/articles/843726/
Добавить комментарий