Автоматизация тестирования с помощью Python

По данным 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. Мы будем рады видеть вас снова.

Оцените статью
devanswers.ru
Добавить комментарий