Перехват веб-запросов с помощью Python и Playwright
Jonathan Thompson
Мокирование - это соглашение о тестировании, обычно используемое в модульном тестировании. Его цель - изолировать поведение тестируемого элемента путем замены других элементов симуляциями. В автоматизации тестирования моки полезны для создания стерильной тестовой среды.
В этой статье основное внимание будет уделено тому, как перехватывать веб-запросы с помощью Python и Playwright с целью автоматизации тестирования. Мы будем использовать приложение DemoQA Bookstore в качестве основы для создания пользовательского пути, в котором пользователь может выбрать книгу.
Вам нужно будет установить следующие пакеты с помощью Pip или менеджера пакетов по вашему выбору:
- Playwright
- Pytest
- Pytest-Playwright
Библиотека pytest-playwright поддерживается создателями Playwright и поставляется с множеством полезных фикстур и методов для удобства разработки.
Прослушивание сети
Playwright упрощает перехват сетевого трафика с помощью метода page.on. Он позволяет отслеживать все запросы или ответы для конкретной страницы браузера.
page.on("request", lambda request: print(request.method, request.url))
Открытие приложения DemoQA Bookstore с помощью Playwright и приведенного выше кода выведет в терминал следующее:

В рамках этого руководства мы будем работать только с запросами /Books и /images.
Мокирование сетевого трафика
Эндпоинт /Books возвращает объект JSON, содержащий массив книг. Этот массив дополнительно заполняется объектами, содержащими информацию о книге. Фронтенд выполняет итерацию по массиву книг и показывает каждую запись в приложении книжного магазина. Зная это, мы можем поддержать наш путь пользователя, сократив список до единой сущности.
// books.json
{
"books": [
{
"isbn": "9781449337711",
"title": "Designing Evolvable Web APIs with ASP.NET",
"subTitle": "Harnessing the Power of the Web",
"author": "Glenn Block et al.",
"publish_date": "2020-06-04T09:12:43.000Z",
"publisher": "O'Reilly Media",
"pages": 238,
"description": "Design and build Web APIs for a...",
"website": "https://chimera.labs.oreilly.com/books/..."
}
]
}
Используя метод page.route, мы можем создать лямбда-функцию, которая использует метод route.fulfill для перехвата запросов, отправленных на указанный URL, а затем имитирует ответ.
def test_select_single_book(page):
"""Using a mock, select a single book in the application."""
book_title = "Designing Evolvable Web APIs with ASP.NET"
page.route(
"**/BookStore/v1/Books",
lambda route: route.fulfill(path="./data/books.json")
)
Метод fullfill может использоваться для имитации пути ответа, тела, статуса, заголовков или типа контента. В этом случае мы имитируем путь ответа, используя наш файл books.json.
Наш тест выглядит следующим образом:
#test_books.py
def test_select_single_book(page):
"""Using a mock, select a single book in the application."""
book_title = "Designing Evolvable Web APIs with ASP.NET"
page.route(
"**/BookStore/v1/Books",
lambda route: route.fulfill(path="./data/books.json")
)
page.goto("https://www.demoqa.com/books")
book = page.wait_for_selector(
f"a >> text={book_title}"
)
book.click()
visible = page.wait_for_selector(
f"label >> text={book_title}"
).is_visible()
assert visible
При запуске наш «пользователь» увидит одну запись в приложении книжного магазина, нажмет на нее, а затем увидит, что название книги отображается на странице.
Ожидание...
Что, если нам нужно дождаться завершения ответа, прежде, чем выполнять следующие шаги?
Ожидание запросов и ответов стало более распространенным явлением в автоматизации тестирования, особенно для приложений с длительным временем загрузки. Playwright упрощает это с помощью методов expect_response и expect_request.
with page.expect_response("**/BookStore/v1/Books") as response:
page.goto("https://www.demoqa.com/books")
assert response.value.ok
Метод expect_response возвращает EventContextManager, который вызывается с помощью оператора with. Вызов response.value возвращает класс Response, который имеет свойство ok. Свойство ok возвращает логическое значение, определяющее, был ли получен ответ на уровне 200 или нет.
Приведенный выше код будет ждать, пока не будет получен ответ. В противном случае возникнет ошибка таймаута. Та же реализация может использоваться с expect_request.
Прервать!
Playwright дает инженерам возможность отменять запросы. Это особенно полезно для страниц или приложений с большим количеством изображений, что увеличивает время загрузки. Подобно макету, запросы прерывания перехватывают предоставленный URL, а затем передают метод прерывания с использованием лямбда-функции.
page.route("**/*.jpg", lambda route: route.abort())
В этом примере все запросы, заканчивающиеся на «.jpg», будут прерваны.

Проверка
Чтобы запустить этот тест, введите в терминал одну из следующих команд:
pytest или pytest --headful
Структура проекта
По завершении этого руководства ваша структура должна выглядеть следующим образом:
data
|__ books.json
tests
|__ test_books.py
.gitignore
README.md
requirements.txt
Итог
Playwright - мощный инструмент для перехвата веб-запросов. Используя моки, инженеры могут создавать стерильные тестовые среды, в то время как ожидания и прерывания отлично подходят для работы с медленно загружающимися приложениями.
Переведено командой QApedia. Еще больше переведенных статей вы найдете на нашем телеграм-канале.