Selenium Wire — гайд

За 20 лет существования Selenium превратился в ключевой фреймворк автоматизации веб-приложений, благодаря гибкости и открытому коду. 

С помощью Python-библиотеки Selenium Wire возможности Selenium можно расширить. В этой статье рассмотрим, что представляет собой библиотека Selenium Wire, каковы ее особенности, сравним Selenium Wire с традиционным Selenium. Также пройдёмся по шагам внедрения Selenium Wire в тестовый фреймворк, с примерами. Рассмотрим области применения Wire, и ограничения.

Кратко

Итак, Selenium Wire — библиотека на Python, которая расширяет возможности Selenium в плане изучения и модификации трафика для тестирования. Также есть удобные API. Wire позволяет тестировщику перехватывать HTTP-запросы и ответы и более гибко чем в обычном Selenium манипулировать ими благодаря бесшовной интеграции с Selenium, обеспечивая более качественное тестирование.

Функции

  • Selenium Wire умеет перехватывать и записывать HTTP-запросы, выполняемые браузером, которым управляет Selenium. Также фиксировать дополнительную информацию: заголовки, cookies и т.д.
  • Selenium Wire также перехватывает WebSocket-сообщения.
  • Что повышает гибкость и надежность в задачах веб-автоматизации.
  • Wire поддерживает безопасную связь между автоматизированным браузером и тестируемыми веб-сайтами.
  • Поддерживает прокси-сервер, чем отличается от стандартного Selenium.
  • Есть комьюнити тестировщиков и разработчиков, которые поддерживают непрерывное совершенствование библиотеки. Кроме того, за разработкой и сопровождением Selenium Wire следит выделенная команда.

Дополнительные

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

Также Selenium Wire обладает такими функциями, как модификация запросов, манипулирование ответами и фильтрация запросов, что расширяет возможности тестирования. Тестировщики могут изменять заголовки, cookies и содержимое для имитации различных сценариев и тестирования крайних случаев. Такой уровень контроля над сетевым трафиком обеспечивает более точное и целенаправленное тестирование, позволяя обнаружить скрытые ошибки и гарантировать оптимальное поведение.

Чем отличается Selenium от Selenium Wire

SeleniumSelenium Wire
Обычный Selenium — стандартный фреймворк автоматизации веб-браузеров. Предназначен для симуляции взаимодействия с пользователем и проверки ожидаемого поведения веб-приложений.Selenium Wire — библиотека, расширяющая возможности Selenium. Она позволяет перехватывать и анализировать сетевой трафик. Перехватывая и изучая HTTP-запросы и ответы, Selenium Wire позволяет получить более точные сведения о взаимодействии веб-приложения с сервером.
Обычный Selenium сосредоточен на проверке взаимодействия с пользователем и функциональных аспектах веб-приложения.Selenium Wire выходит за эти рамки, поскольку включает в себя анализ сетевого трафика, позволяющий получить более точное представление о производительности, безопасности и надежности веб-приложения.
Обычный Selenium поддерживает множество ЯП: Python, JavaScript, PHP, Java и т.д.Selenium Wire — Python-based библиотека.
Обычный Selenium в основном фокусируется на взаимодействии с веб-элементами и браузерами.Библиотека Selenium Wire ориентирована на тщательный анализ HTTP-запросов и ответов.
Обычный Selenium используется в основном для автоматизации и тестирования веб-приложений.Selenium Wire в основном используется для тестирования API, безопасности, и веб-скрейпинга.

Имплементация в проекте

Для инсталляции Selenium Wire нужны реквизиты:

  • Последняя версия Python на платформе (Windows, macOS, Linux)
  • Соответствующий WebDriver для браузера (ChromeDriver для Chrome и т.п.)

1.Инсталляция

Ниже описаны шаги по установке Selenium Wire.

  • Откройте командную строку или окно терминала.
  • С помощью команды pip установите библиотеку Selenium Wire:
pip install selenium-wire

2.Настройка Selenium-проекта

Убедитесь, что проект Selenium запущен и что установлены все нужные зависимости.

3.Импорт Wire

Импортируйте нужный модуль или библиотеку, которые будут использованы в проекте, например:

from seleniumwire import webdriver
from selenium.webdriver.common.keys import Keys

4.Конфигурация WebDriver

Создайте экземпляр класса webdriver из Selenium Wire:

options = webdriver.ChromeOptions()
# Configure any desired options for the Chrome browser

# Create a WebDriver instance with Selenium Wire
driver = webdriver.Chrome(options=options)

Тест-кейсы

Можно использовать обычные методы и функции Selenium. Во время выполнения теста Selenium Wire будет автоматически перехватывать и собирать сетевой трафик.

Ниже приведен код выполнения операции поиска в веб-приложении:

driver.get("https://lambdatest.com")
search_box = driver.find_element_by_name("q")
search_box.send_keys("selenium")
search_box.send_keys(Keys.RETURN)

Анализ трафика

Доступно API Selenium Wire для доступа к данным сетевого трафика, которые были записаны после выполнения тест-кейсов.

Например, можно получить все запросы, сделанные во время тестирования, и вывести их URL-адреса и статусы ответов:

for request in driver.requests:
    print(request.url, request.response.status_code)

Кастомизация тест-кейсов

Анализ сетевого трафика в Selenium Wire используется для модификации тест-кейсов.

Например, для добавления пользовательских заголовков ко всем запросам:

driver.header_overrides = {
    'User-Agent': 'Custom User Agent'
}

Объекты Request и Response

В Selenium Wire объекты Request и Response играют важнейшую роль в перехвате HTTP(S)-трафика, производимого браузером, и последующей работе с ним. Рассмотрим эти объекты более подробно.

Request

Объект Request представляет HTTP-запрос, отправляемый браузером во время выполнения теста. Он содержит информацию о запросе: URL, метод, заголовки, содержимое тела и параметры запроса. Можно обращаться к различным свойствам объекта Request для изучения и модификации полученного запроса.

Response

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

Работа с объектами Request и Response в Selenium Wire позволяет получить четкое представление о сетевом поведении веб-приложения. Можно изучать заголовки, получать содержимое тела, анализировать статус-коды и выполнять симуляции различных сетевых условий или модификации запросов/ответов.

Теперь рассмотрим атрибуты объектов запроса и ответа.

Атрибуты объектов request и response

Атрибуты объекта Request

АтрибутОписание 
bodyПредставляет тело запроса в виде байтов. Если тело запроса отсутствует, он будет пустым (b’ ‘).
certСодержит информацию о SSL-сертификате сервера в формате словаря. Пустой в случае запросов, не относящихся к протоколу HTTPS.
dateПредставляет дату, когда был сделан запрос.
headersСловарно-подобный объект, хранящий заголовки запроса.
hostПредставляет запрашивающий хост, Например: «www.example.com»
methodПредставляет метод HTTP, используемый в запросе, например GET, POST и т.д.
paramsСловарь из параметров запроса. Если параметр с одним и тем же именем встречается несколько раз, то его значение в словаре будет представлять собой список.
pathПредставляет путь запроса. Например: «/some/path/index.html».
responseПредставляет объект ответа, связанный с запросом. Он будет равен None, если запрос не имеет ответа.
querystringПредставляет строку запроса в запросе. Например: «foo=bar&spam=eggs».
urlПредставляет полный URL-адрес запроса. Например: «https://www.example.com/some/path/index.html?foo=bar&spam=eggs».

Атрибуты объекта response

Атрибут Описание 
bodyПредставляет тело ответа в виде байтов. Если тело ответа отсутствует, он будет пустым (b’ ‘).
dateПредставляет дату, когда был сделан запрос.
headersСловарно-подобный объект, хранящий заголовки ответа.
reasonПредставляет фразу причины ответа. Например: «OK» или «Not Found».
status_codeПредставляет статус-код HTTP-ответа. Например 200 или 404.

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

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

Selenium Wire позволяет перехватывать и модифицировать объекты Request и Response путем добавления атрибутов driver.request_interceptor и driver.response_interceptor перед началом работы драйвера.

  • Перехватчик запроса должен принимать один аргумент, представляющий перехваченный запрос.
  • Перехватчик ответа должен принимать два аргумента: один для исходного запроса, другой для перехваченного ответа.

Рассмотрим пример. В этом примере мы выводим URL перехваченного запроса и код состояния перехваченного ответа.

from seleniumwire import webdriver
 
# Create a new instance of the Selenium Wire WebDriver
driver = webdriver.Chrome()
 
# Define a request interceptor function
def my_request_interceptor(request):
    # Do something with the intercepted request
    print(f"Intercepted request: {request.url}")
 
# Define a response interceptor function
def my_response_interceptor(request, response):
    # Do something with the intercepted response
    print(f"Intercepted response: {response.status_code}")
 
# Set the request interceptor
driver.request_interceptor = my_request_interceptor
 
# Set the response interceptor
driver.response_interceptor = my_response_interceptor
 
# Make requests
#driver.get('https://www.example.com')
driver.get('https://www.google.com')
 
# Close the driver
driver.quit()

В приведенном выше коде мы импортируем класс webdriver из модуля seleniumwire и создаем новый экземпляр Selenium Wire WebDriver с помощью webdriver.Chrome(). Мы определяем две функции-перехватчика, my_request_interceptor и my_response_interceptor, которые будут вызываться для каждого перехваченного запроса и ответа.

Мы устанавливаем перехватчик запроса, назначая функцию my_request_interceptor свойству request_interceptor драйвера. Аналогичным образом устанавливаем перехватчик ответа, присваивая функцию my_response_interceptor свойству response_interceptor драйвера.

Оптимизация Selenium-запросов: блокирование рисунков

Для оптимизации Selenium Wire можно использовать перехватчик запросов для блокировки определенных запросов, например, рисунков, чтобы увеличить скорость обработки контента и снизить потребление трафика. Что повышает производительность и эффективность.

from seleniumwire import webdriver
from selenium.webdriver.common.by import By
from seleniumwire import request
 
# Set up Chrome driver options
options = webdriver.ChromeOptions()
 
# Create an instance of the Chrome driver
driver = webdriver.Chrome(options=options)
 
# Define a request interceptor function
def request_interceptor(request):
    # Block image assets
    if request.path.endswith(('.png', '.jpg', '.gif')):
        request.abort()
 
# Set the request interceptor
driver.request_interceptor = request_interceptor
 
# Hit the target site
driver.get('https://lambdatest.com')
 
# Find and print the body content
body = driver.find_element(By.TAG_NAME, 'body')
print(body.text)
 
# Quit the driver
driver.quit()

Наша задача — извлечь и собрать текстовую информацию, не тратя время на другие типы контента. На иллюстрации ниже видим пример.

GET-запросы

Для выполнения GET-запросов к веб-странице с помощью Selenium Wire выполняем следующие действия:

  1. Импортируйте модуль ‘webdriver‘ из ‘seleniumwire‘ и создайте новый экземпляр веб-драйвера Chrome.
  2. Получите доступ к запросам, выполняемым браузером, используя свойство ‘requests‘ драйвера.
  3. Пройдитесь по запросам и выполните необходимые действия, например выведите URL и статус-код каждого запроса.
  4. Закройте веб-драйвер, используя метод ‘quit‘.

Ниже приведен код.

from seleniumwire import webdriver
 
# Create a new instance of the Chrome web driver
driver = webdriver.Chrome()
 
# Perform a GET request to a webpage
driver.get('https://www.google.com/search?q=lambda+test&tbm=isch&ved=2ahUKEwj5yoy0raL_AhWNF7cAHSfBCoYQ2-cCegQIABAA&oq=lambda+test&gs_lcp=CgNpbWcQAzIFCAAQgAQyBQgAEIAEMgUIABCABDIFCAAQgAQyBggAEAUQHjIGCAAQCBAeMgYIABAIEB4yBggAEAgQHjIGCAAQCBAeMgYIABAIEB46BAgjECc6BwgAEIoFEEM6BwgjEOoCECc6CAgAEIAEELEDUABYgihgpyxoAXAAeASAAbcBiAGnEpIBBDAuMTaYAQCgAQGqAQtnd3Mtd2l6LWltZ7ABA8ABAQ&sclient=img&ei=6bR4ZLmyK42v3LUPp4KrsAg&bih=746&biw=1536&rlz=1C1CHBF_enIN893IN893#imgrc=5gZQH7pNd8B6lM')
 
# Access the requests made by the browser
for request in driver.requests:
    if request.response:
        print(request.url, request.response.status_code)
 
# Close the web driver
driver.quit()

Как видно из приведенного ниже рисунка, мы получаем все ссылки на изображения, по данной ссылке (на тестируемой веб-странице).

API Selenium Wire

Selenium Wire предоставляет набор API, позволяющих взаимодействовать с сетевым трафиком во время выполнения тестов. Эти API позволяют перехватывать, исследовать и модифицировать различные параметры HTTP-запросов и ответов.

APIОписание
request.headers:Доступ к заголовкам перехваченного HTTP-запроса.
response.headers:Доступ к заголовкам перехваченного HTTP-ответа.
request.body:Доступ к контенту тела перехваченного HTTP-запроса.
response.body:Доступ к контенту тела перехваченного HTTP-ответа.
request.method:Позволяет получить метод HTTP, использованный в перехваченном запросе.
response.status_code:Статус-код перехваченного ответа.
response.reason_phrase:Используя этот API, можно получить фразу причины, связанную с перехваченным ответом.
request.url:Доступ к URL-адресу перехваченного запроса.
request.querystring:С помощью этого API можно получить параметры перехваченного запроса.
response.content_type:Тип контента перехваченного ответа.

Интеграция с Selenium Grid

Интеграция Selenium Wire с Selenium Grid расширяет возможности масштабирования мониторинга сетевого трафика при тестировании в Selenium. Обеспечивая параллельное выполнение тестов на нескольких машинах, Selenium Grid повышает продуктивность и сокращает время тестирования.

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

При объединении возможностей Selenium Wire и Selenium Grid можно выполнять такие операции, как сбор и фиксация HTTP-запросов и ответов, инспекция заголовков, изменение содержимого запросов и симулирование условий работы сети. Это позволяет симулировать реальные пользовательские ситуации и выявлять проблемы с подключением к сети, задержкой или передачей данных.

Таким образом, интеграция Selenium Grid с Selenium Wire позволяет проводить масштабируемый анализ сетевого трафика, который дает полное представление о производительности веб-приложений в различных сетевых условиях.

Сферы применения Wire (не только тестирование)

  • Контролировать и отслеживать цены на сайтах магазинов. Собирать информацию о ценах, отслеживать изменения и получать данные о конкурентах, автоматизируя процесс и перехватывая сетевой трафик.
  • Извлекать интересующий контент страниц, определенного типа, например только текст, только фотографии или другие медиаданные. Перехватывая запросы и анализируя ответы, можно удобно скрейпить нужную информацию из веб-сайтов.
  • Wire может помочь в аудите безопасности, записывая сетевой трафик и анализируя запросы и ответы. Специалисты по безопасности могут использовать для поиска возможных уязвимостей, тестирования протоколов безопасности и проверки протоколов на соответствие лучшим практикам.
  • Основное применение Wire — для тестирования веб-приложений, и особенно тестирования API, поскольку позволяет записывать и исследовать сетевые запросы. Проверять поведение приложения в различных сценариях, моделировать различные сетевые условия и тестировать API, что повышает общее качество и надежность программы.
  • Для измерения/исследования производительности веб-приложений. Проверяет функциональность онлайн-приложений — мониторинг сетевых данных, а также позволяет собрать много информации о затратах времени на выполнение запросов и ответов.

Ограничения

  • JavaScript: Поскольку Selenium Wire является Python-библиотекой, выполнение JavaScript-кода в Selenium Wire не поддерживается. Это означает, что Selenium Wire может надежно собирать только часть сетевого трафика, если веб-сайт в основном использует JavaScript для рендеринга или взаимодействия с элементами.
  • Совместимость с браузерами: Поскольку Selenium Wire полностью основан на Selenium WebDriver, он наследует ограничения Selenium и могут быть те же проблемы совместимости с браузерами. Некоторые функции и возможности могут работать не совсем корректно в различных браузерах.
  • Зависимость от Selenium: Selenium Wire — библиотека на основе Selenium. Поэтому для обеспечения совместимости и доступа к новейшим возможностям необходимо постоянно обновлять как Selenium, так и Selenium Wire.

Источник

Какой была ваша первая зарплата в QA и как вы искали первую работу?

Мега обсуждение в нашем телеграм-канале о поиске первой работы. Обмен опытом и мнения.

Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

Мы в Telegram

Наш официальный канал
Полезные материалы и тесты
Готовимся к собеседованию
Project- и Product-менеджмент

? Популярное

? Telegram-обсуждения

Наши подписчики обсуждают, как искали первую работу в QA. Некоторые ищут ее прямо сейчас.
Наши подписчики рассказывают о том, как не бояться задавать тупые вопросы и чувствовать себя уверенно в новой команде.
Обсуждаем, куда лучше податься - в менеджмент или по технической ветке?
Говорим о конфликтных ситуациях в команде и о том, как их избежать
$1100*
медианная зарплата в QA в июне 2023

*по результатам опроса QA-инженеров в нашем телеграм-канале

Собеседование

19%*
IT-специалистов переехало или приняло решение о переезде из России по состоянию на конец марта 2022

*по результатам опроса в нашем телеграм-канале

live

Обсуждают сейчас