По данным IEEE Spectrum Python является лучшим языком программирования 2021 года, а с апреля Loadero поддерживает Python в качестве языка тестовых сценариев. Многие инженеры согласны с тем, что автоматизация тестирования с помощью Python — отличный выбор, и в этой статье блога мы покажем ее основы.
Тесты на Python в Loadero используют фреймворк Py-TestUI. Py-TestUI оборачивает и реализует дополнительные функции для привязки Selenium Python. Это означает, что Python-тесты Loadero могут использовать всю мощь Selenium и другие возможности, предоставляемые Py-TestUI.
Структура теста
Каждый Python-тест начинается с
def test_on_loadero(driver: TestUIDriver) -> None:
Эта функция похожа на функцию main
в других языках программирования. Она будет вызвана, как только начнется выполнение теста. Вся логика теста должна исходить из этой функции. Это означает, что могут быть добавлены дополнительные функции за пределами функции test_on_loadero
, но они должны быть вызваны из функции test_on_loadero
, чтобы иметь какой-либо эффект.
Драйвер
Тесты Loadero автоматизируют взаимодействие с браузером так, как если бы это делал человек, что позволяет повторять выполнение, проводить параллельные тесты и увеличивать масштаб для нагрузочного тестирования. Тесты могут выполнять практически любые действия, которые может выполнить человек в браузере, например:
- Переход по URL-адресу
- Нажимать на ссылки и элементы
- вводить текст
- копировать текст
Эти действия выполняются в тесте с помощью объекта driver
. driver
оборачивает рабочую лошадку браузерного тестирования — Selenium WebDriver и имеет тип TestUIDriver. TestUIDriver
реализует часто используемые браузерные взаимодействия для улучшения простоты использования, но в то же время позволяет получить доступ к базовому Selenium WebDriver для более сложных браузерных взаимодействий.
Объект driver
инициализируется и конфигурируется в начале каждого теста и передается в качестве аргумента в функцию test_on_loadero
.
Давайте рассмотрим распространенные взаимодействия браузера и то, как реализовать их в тестовом сценарии.
Навигация
Чтобы начать взаимодействовать с веб-страницей, ее сначала нужно открыть. Для этого вызовите следующий метод
TestUIDriver.navigate_to(url: str) -> None
Аргумент url
— это URL веб-страницы, которую нужно открыть.
Вот простой тест, демонстрирующий использование navigate_to
.
def test_on_loadero(driver: TestUIDriver) -> None:
driver.navigate_to("https://duckduckgo.com/")
driver.save_screenshot("duckduckgo.png")
Кроме того, в тесте вызывается
TestUIDriver.save_screenshot(image_name: str) -> str
Этот метод, как следует из названия, будет фиксировать состояние браузера в момент вызова метода save_screenshot
и сохранять его с именем, заданным аргументом image_name
. После завершения выполнения теста все скриншоты, сделанные во время теста, будут доступны на вкладке артефактов на странице результатов Loadero одного участника теста.
Совет: Создание скриншотов во время тестирования — распространенная практика, которая помогает отлаживать тест или вручную просматривать, что было на экране участника теста на важных этапах тестирования.
Клики
Очень фундаментальным взаимодействием в браузере является щелчок. Чтобы взаимодействовать с элементом, его сначала нужно найти с помощью метода e
.
TestUIDriver.e(locator_type: str, locator: str) -> Elements:
Аргумент locator_type
описывает метод расположения элемента и может иметь значения:
locator
— описывает, как определить местоположение элемента с помощью метода расположения, заданного аргументом locator_type
. Чтобы узнать больше об использовании селекторов CSS и локаторов XPath в сценариях автоматизации тестирования Selenium, обязательно прочитайте эту статью в блоге.
Внимательный читатель мог заметить, что метод e
имеет возвращаемый тип Elements
— множественное число, но до сих пор я использовал элементы в единственном числе. Это связано с тем, что объект Elements
имеет более продвинутые возможности (например — нахождение нескольких элементов одновременно, сопоставление изображений), которые в этой статье не рассматриваются. Поэтому, чтобы не запутать читателя, эти темы будут пропущены.
После нахождения нужного элемента его можно щелкнуть с помощью метода click
.
Elements.click() -> Elements:
Ничего не мешает вызвать click
сразу после нахождения элемента, но хорошей практикой является проверка видимости элемента с помощью runtime assertion перед щелчком на нем. Если элемент виден, значит, он успел загрузиться и с ним можно взаимодействовать. Это позволяет избежать сбоев в тестировании, вызванных попыткой щелкнуть на элементе, который еще не загрузился. Мы часто используем это в тестах, которые создаем для наших клиентов, и советуем вам делать то же самое.
Метод wait_until_visible
делает то, что следует из названия — ждет, пока элемент загрузится и станет видимым, прежде чем пытаться продолжить взаимодействие.
Elements.wait_until_visible(seconds=10.0, log=True) -> Elements:
Аргумент seconds
со значением по умолчанию 10.0 задает время, в течение которого тест будет ждать, пока элемент станет видимым. Если по истечении указанного времени элемент не станет видимым, будет выдана ошибка и тест завершится неудачно.
Аргумент log
со значением по умолчанию True указывает, следует ли записывать в журнал результат вызова метода wait_until_visible
. Этот аргумент обычно не следует изменять и его можно игнорировать. Многие методы Elements
имеют аргумент log
, и во всех них его можно игнорировать.
Вот простой тестовый сценарий, демонстрирующий все, что было показано до сих пор. Вы можете протестировать все, что узнали до сих пор, с помощью бесплатной пробной версии Loadero. Вы также можете найти пример скрипта в репозитории Loadero на Github.
def test_on_loadero(driver: TestUIDriver) -> None:
# Opens the search engine DuckDuckGo with default search query of
# google.com
driver.navigate_to("https://duckduckgo.com/?q=google.com")
# Locates an element with a CSS selector that is pointing to the first
# search results title, waits for the element to become visible and clicks
# on it.
driver.e("css", "#r1-0 > div > h2").wait_until_visible().click()
# Ensures that the web page has loaded before taking a screenshot.
driver.e("css", "body > div:first-of-type").wait_until_visible()
driver.save_screenshot("google.png")
Ввод текста
Предыдущий пример тестового сценария был немного жульническим. В реальности пользователь сам вводит поисковый запрос «google.com» и не использует специально подготовленный URL. Чтобы имитировать такое поведение, тесты могут вводить текст с помощью метода .send_keys
.
Elements.send_keys(value: str, log=True) -> Elements:
Аргумент value
задает текст, который будет отправлен элементу.
Чтобы очистить значение ввода, которое было задано send_keys
или элемент имеет по умолчанию, используйте метод clear
.
Elements.clear() -> None:
Получение содержимого элемента
Взаимодействие с браузером можно обобщить как цикл обратной связи, в котором следующее взаимодействие определяется результирующим содержимым веб-страницы. Тесты нуждаются в способе получения содержимого веб-страницы или, более конкретно, содержимого отдельного элемента для реализации логики, которая решает, каким должно быть следующее взаимодействие. В этом разделе мы рассмотрим вторую половину цикла обратной связи взаимодействия с браузером — получение содержимого.
Большинство элементов HTML имеют содержимое, за редким исключением, например, элемент <br>
, который отображается на веб-странице и с которым можно взаимодействовать.
Чтобы получить текстовое значение элемента, используйте следующие команды
Elements.get_text() -> str:
Применение всего изученного на практике
Пришло время объединить все описанные команды в один сценарий автоматизации тестирования. Этот пример сценария выполняет поиск по определенному запросу в поисковой системе DuckDuckGo и выводит лучшие результаты.
def test_on_loadero(driver: TestUIDriver) -> None:
# The main logic of the test is in top_search_results function
print(top_search_results(driver, "loadero", 10))
# top_search_results returns the top n search results for search_query.
def top_search_results(driver: TestUIDriver, search_query: str, n: int) -> str:
# Limits the search result count to 10, because a single search query in
# DuckDuckGo search engine returns only 10 results.
n = min(n, 10)
# Selectors.
home_page_search_bar = "#search_form_input_homepage"
home_page_search_button = "#search_button_homepage"
# Opens the search engine DuckDuckGo.
driver.navigate_to("https://duckduckgo.com/")
# Locates search bar, waits for the element to load and sends a search query
# to it
driver.e("css", home_page_search_bar).wait_until_visible().send_keys(
search_query
)
# Locates search button, verifies that it is visible and clicks it.
driver.e("css", home_page_search_button).wait_until_visible().click()
result = f"Top {n} DuckDuckGo search results for {search_query} ->n"
# Iterates over top n search results
for i in range(n):
# Creates a CSS selector that indicates to the search result title.
selector = f"#r1-{i} > div > h2 > a.result__a"
# Locates the search element and verifies that it is visible.
search_result_element = driver.e("css", selector).wait_until_visible()
# Retrives the title of search result and adds it to result string.
title = search_result_element.get_text()
result += f"t {title} n"
return result
Вывод этого тестового сценария можно найти на вкладке журналов страниц результатов отдельных участников Loadero в разделе Selenium log. Вывод будет выглядеть примерно так:
Top 10 DuckDuckGo search results for loadero ->
Loadero - Performance and Load Testing Tool
Loadero | LinkedIn
Loadero Pricing, Alternatives & More 2022 - Capterra
Loadero - Home | Facebook
GitHub - loadero/examples: Test script examples that are ...
Loadero - YouTube
Loadero - your performance & load testing partner from the ...
Application Load Testing Tools for API Endpoints with ...
Tractors - Tractor Loader Backhoe - B26 | Kubota
EZ Loader TMS | EZ Loader TMS
Мы рассмотрели основы работы над автоматизацией тестирования с помощью Python. Вы можете создать тест, подобный описанному нами, и запустить его несколько раз бесплатно с помощью бесплатной пробной версии Loadero. Чтобы продолжить обучение использованию Python для работы с тестами в Loadero, обязательно посетите нашу Wiki, где вы найдете информацию о пользовательских командах, расширяющих функциональность WebDriver и PyTestUI, переменных, хранящих необходимую информацию об участнике теста, и другие примеры сценариев автоматизации тестирования с помощью Python. Мы будем рады видеть вас снова.