Skip to content

17. REST API. Часть II. Продолжаем изучать

BohdanObruch edited this page May 15, 2024 · 3 revisions

Как искать запросы на странице

Запросы на странице можно отслеживать с помощью Chrome DevTools или любого другого браузерного инструмента для разработчиков. Если мы разрабатываем тесты в компании, то скорее всего нам предоставят документацию по используемым API, и из неё можно будет понять какие запросы совершает веб-приложение. Если документации нет, то все отправляемы запросы можно отследить через инструменты разработчика.

Для перехода к инструментам разработчика в Chrome необходимо перейти на тестируемую страницу, нажать клавишу «F12» и в меню выбрать вкладку «Network». Теперь при кликах на кнопки страницы в окне будут появляться запросы.

Важно отметить, что в окне показываются абсолютно все запросы, но если нужны только API, то необходимо отфильтровать выдачу. Для этого необходимо выбрать фильтр «Fetch/XHR». Это позволить отсеять лишние запросы и упростит визуальный поиск. Иногда таким образом не все запросы отображаются. В этом случае можно воспользоваться фильтром «All» и вручную отсеять запросы, которые не относятся к API.

Авторизация на сайте через API

Для авторизации на сайте через API необходимо найти запрос на авторизацию. В большинстве случаев это POST-запрос на адрес /login. В теле запроса передаются данные пользователя: логин и пароль. В ответе на запрос приходит токен и куки, который необходимо передавать в каждом последующем запросе.

Пример запроса на авторизацию на сайте через API с использованием библиотеки requests:

import requests

URL = "https://demowebshop.tricentis.com"
LOGIN = "***"
PASSWORD = "****"


result = requests.post(
            url=URL + "/login",
            data={"Email": LOGIN, "Password": PASSWORD, "RememberMe": False},
            allow_redirects=False
        )

В данном примере мы отправляем POST-запрос на адрес /login с данными пользователя. В запросе указано allow_redirects=False, это необходимо для того, чтобы не было редиректа на другую страницу. Не всегда нужно указывать этот параметр, только когда есть вы получаете 300-й статус код ответа.

Получение куки(cookies)

Чтобы получить куки из запроса, необходимо воспользоваться методом cookies:

cookies = result.cookies

Таким образом мы получим все куки из запроса и можем их использовать в последующих запросах.

Если необходимо получить конкретное значение куки, то можно воспользоваться методом get:

cookie = result.cookies.get("NOPCOMMERCE.AUTH")

Передача куки в последующих запросах

Для передачи куки в последующих запросах необходимо передать их в add_cookies:

browser.driver.add_cookie({"name": "NOPCOMMERCE.AUTH", "value": cookie})

Чтобы авторизоваться на сайте через API, необходимо войти на сайт, далее передать куки авторизации и обновить страницу. Таким образом мы авторизуемся на сайте через API.

Пример авторизации на сайте через API:

browser.open(URL)
browser.driver.add_cookie({"name": "NOPCOMMERCE.AUTH", "value": cookie})
browser.driver.refresh()  # или же browser.open(URL)

Логирование и аттачи(attachments) в Allure

Для логирования в Allure необходимо воспользоваться методом allure.attach. Этот метод позволяет добавить в отчет Allure любую информацию, которая нам необходима. Например, это может быть логирование запросов, ответов, скриншотов и т.д.

Пример логирования запроса в Allure:

import allure
import json

allure.attach(body=json.dumps(result.json(), indent=4, ensure_ascii=True), name="Response", attachment_type=AttachmentType.JSON, extension="json")

В данном примере мы логируем ответ на запрос в формате JSON. В методе attach указываем тело ответа, имя, тип вложения и расширение файла. Где: json.dumps - преобразует объект Python в строку JSON. indent=4 - отступы в 4 пробела. ensure_ascii=True - кодирует все символы в ASCII.

Пример логирования куков в Allure:

allure.attach(body=result.cookies, name="Cookies", attachment_type=AttachmentType.TEXT,extension="text")

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

def reqres_api_get(url, **kwargs):
    with step("API Request"):
        result = requests.get(url="https://reqres.in" + url, **kwargs)
        allure.attach(body=json.dumps(result.json(), indent=4, ensure_ascii=True), name="Response", attachment_type=AttachmentType.JSON, extension="json")
    return result


def test_get_single_user_successfully():
    url = "/api/users/2"

    result: Response = reqres_api_get(url)

    assert result.status_code == 200

В данном примере мы создали метод reqres_api_get, который отправляет GET-запрос на сайт https://reqres.in и логирует запрос и ответ. В тесте test_get_single_user_successfully мы отправляем запрос на получение пользователя и проверяем статус код ответа.

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

def api_request(base_api_url, endpoint, method, data=None, params=None):
    url = f"{base_api_url}{endpoint}"
    response = requests.request(method, url, data=data, params=params)
    response_logging(response) # логирование запроса и ответа (пример реализации ниже)
    response_attaching(response) # добавление аттачей( пример реализации ниже )
    return response

# Пример использования

def test_get_single_user_successfully():
    url = "https://reqres.in"
    response = api_request(url, endpoint="/api/users/2", method="GET")
    assert response.status_code == 200

Для логирования в консоль можно использовать библиотеку logging. Пример логирования в консоль:

import logging

logging.info(result.request.url)
logging.info(result.status_code)
logging.info(result.text)

В данном примере мы логируем URL запроса, статус код ответа и тело ответа. Данное логирование также можно добавить в метод reqres_api_get.

Пример реализации общего хелпера для логирования и добавление аттачей :

import logging
import json
import allure
from requests import Response
from allure_commons.types import AttachmentType


def response_logging(response: Response):
    logging.info("Request: " + response.request.url)
    if response.request.body:
        logging.info("INFO Request body: " + response.request.body)  # логирование тела запроса если оно есть
    logging.info("Request headers: " + str(response.request.headers))
    logging.info("Response code " + str(response.status_code))
    logging.info("Response: " + response.text)


def response_attaching(response: Response):

    allure.attach(
        body=response.request.url,
        name="Request url",
        attachment_type=AttachmentType.TEXT,
    )

    if response.request.body:  # логирование тела запроса если оно есть
        allure.attach(
            body=json.dumps(response.request.body, indent=4, ensure_ascii=True),
            name="Request body",
            attachment_type=AttachmentType.JSON,
            extension="json",
        )
        allure.attach(
            body=json.dumps(response.json(), indent=4, ensure_ascii=True),
            name="Response",
            attachment_type=AttachmentType.JSON,
            extension="json",
        )

А также для отображения логирования необходимо добавить данные в файл pytest.ini:

[pytest]
addopts = 
    --log-date-format="%Y-%m-%d %H:%M:%S"
    --log-format="%(asctime)s %(levelname)s %(message)s"
    --log-cli-level=INFO

Содержание
Командная строка
Кодировка UTF-8 в Java
Список полезных книг для автоматизаторов тестирования на языке Java
Список полезных книг для автоматизаторов тестирования на языке Python Структура проекта Github README.md

Java:
1. Вводное занятие. Сразу к практике.
2. Git. GitHub. Погружаемся.
3. Погружаемся в инструментарий и библиотеки
4. Основы Java
5. Продолжаем разрабатывать автотесты. PageObjects
6. JUnit 5
7. Allure Reports
8. Работа с файлами
9. Selenide #1
10. Jenkins. Создаем первую задачу
11. Управляем параметрами в коде и в Jenkins
12. Отправляем уведомления о результатах прохождения автотестов
13. Учимся быстро разрабатывать проекты для тестовых заданий
14. Selenoid
15. Библиотека Owner
16. REST API. Пишем автотесты с Rest assured
17. REST API. Декомпозируем UI тесты. Подключаем отчетность
18. REST API. Продолжаем изучать
19. Мобильная автоматизация #1. Разрабатываем автотесты с Browserstack
20. Allure TestOps
21. Переезд на собственную инфраструктуру Java

Python:
1. Вводное занятие. Сразу к практике!
2. Погружаемся в инструментарий и библиотеки
3. Git. GitHub. Погружаемся.
4. Основы Python
5. Selene #1
6. Основы Python. Часть II
7. Основы Python. Часть III
8. Page Object
9. Allure Reports
10. Работаем с файлами Python
11. Jenkins. Создаем первую задачу и управляем параметрами Python
12. Телеграм бот. Отправляем уведомления о результатах прохождения тестов
13. Pytest
14. Selenoid
15. Pytest. Часть II
16. Venv, Poetry и управление зависимостями проекта
17. REST API. Часть I. Пишем автотесты с Requests
18. REST API. Часть II. Продолжаем изучать
19. Мобильная автоматизация #1. Разрабатываем автотесты с Browserstack
20. Мобильная автоматизация #2. Разрабатываем автотесты с эмулятором Android устройства
21. Allure TestOps
22. Переезд на собственную инфраструктуру Python

Clone this wiki locally