-
Notifications
You must be signed in to change notification settings - Fork 72
17. REST API. Часть II. Продолжаем изучать
- Как искать запросы на странице
- Авторизация на сайте через API
- Логирование и аттачи(attachments) в Allure
Запросы на странице можно отслеживать с помощью Chrome DevTools или любого другого браузерного инструмента для разработчиков. Если мы разрабатываем тесты в компании, то скорее всего нам предоставят документацию по используемым API, и из неё можно будет понять какие запросы совершает веб-приложение. Если документации нет, то все отправляемы запросы можно отследить через инструменты разработчика.
Для перехода к инструментам разработчика в Chrome необходимо перейти на тестируемую страницу, нажать клавишу «F12» и в меню выбрать вкладку «Network». Теперь при кликах на кнопки страницы в окне будут появляться запросы.
Важно отметить, что в окне показываются абсолютно все запросы, но если нужны только API, то необходимо отфильтровать выдачу. Для этого необходимо выбрать фильтр «Fetch/XHR». Это позволить отсеять лишние запросы и упростит визуальный поиск. Иногда таким образом не все запросы отображаются. В этом случае можно воспользоваться фильтром «All» и вручную отсеять запросы, которые не относятся к 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 = 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)
Для логирования в 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
✔️ Сайт
✔️ Чат в Telegram
✔️ Канал в Telegarm
Содержание
Командная строка
Кодировка 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