Первый шаг в автоматизации тестирования веб-приложений

Привет, меня зовут Виктория. Я много лет работаю ведущим инженером по автоматизации тестирования качества (QA Automation Engineer).
Начинала свой путь, как инженер по качеству, занималась ручным тестированием, а затем стала инженером по автоматизации. Недавно, я проводила презентацию, как перейти из QA в QAA. И хотя есть немало статей, описывающих этот путь, я хочу поделиться с вами пятью шагами от ручного тестирования к автоматизации, которые, по моему скромному мнению, могут быть полезны другим QA.

5 Шагов:

  1. Basic understanding of Web application — Основное понимание веб-приложений

  2. DOM elements and JS — Элементы DOM и JS

  3. Engine for linking Desktop machine and Web application — Механизм для связи рабочего стола и веб-приложения

  4. Autotest Runner — Автотест ранеры

  5. Page Object — Паттерн объектов страницы (Page Object)

Шаг 1. Основное понимание JS и веб-приложений.


Что же такое веб-приложение? Веб-приложение (web app) — это прикладное программное обеспечение, которое выполняется в веб-браузере.

28106a016a13a8216e619e75a4616bc7.png

Для нас не имеет значения, как было создано и запущено это приложение, на каком языке написаны бэкенд или фронтенд.
Самое важное, что нужно понять и на чем строить свою работу: все веб-приложения открываются в веб-браузере- Chrome, Safari, Opera и так далее.
Вы, как пользователь, работаете с веб-браузером, а веб-браузер работает с веб-приложением.

Например, откроем веб-сайт https://www.wikipedia.org/ через браузер Chrome.

Википедия — это веб-приложение, и для работы с этим приложением я использую браузер Chrome.
Сейчас я вижу одну страницу этого приложения.

1bbeabd0a13e4a19b24b0c6e40e1d73c.png

Я, как пользователь, могу выполнить три действия с этой страницей: ввести текст в поле поиска, нажать на кнопку поиска (или на какую то ссылку), проверить какой то текст на странице.

На самом деле, это все. Действий, которые может совершить пользователь, не так уж и много.
Теперь давайте попробуем написать скрипт на JavaScript для этих действий.

Наша задача: Введем текст в поле поиска и нажмем кнопку поиска.

Для этого нам нужно понять, что такое элементы DOM.

Шаг 2. DOM elements and JS

660ed8755201374e45184689dfcfb9f9.png

  • Конечная страница веб-приложения создаётся на основе HTML-кода, полученного браузером;

  • Браузер обрабатывает этот код и формирует объекты DOM (Document Object Model). DOM представляет собой структуру, созданную браузером на основе HTML-разметки;

  • DOM (Document Object Model) — это структура, которую браузер создает на основе HTML-кода;

  • DOM элементы — это отдельные компоненты страницы, с которыми мы взаимодействуем. Это могут быть кнопки, текстовые поля, изображения или другие объекты, составляющие визуальную часть веб-страницы.

Вернемся на страницу https://www.wikipedia.org/ снова. Нажимаем клавишу F12 → справа откроется консоль DevTools.

DevTools (или Developer Tools) — это набор инструментов, встроенных в веб-браузеры, которые помогают разработчикам создавать, отлаживать и анализировать веб-сайты или веб-приложения.

Этот инструмент поможет нам работать с веб-приложением. Нажимаем на вкладку «Elements» → теперь справа мы видим элементы DOM для этой страницы.

f1c6c5ee6a169f8ab29135fee811a082.png

Посмотрите на изображения ниже. С помощью этой кнопки вы можете выбрать любой элемент на странице и с правой стороны отобразиться его расположение в DOM. Наша задача найти поля для ввода текста.

c637a1a8e21b4047213865572730a889.pngd76694692f98496fdd7a41a5c3384d78.png

Если выбрать поля ввода мы видим его элемент с правой стороны. Сейчас нам надо найти локатор этого элемента чтобы иметь возможность с ним взаимодействовать.

Но что такое локатор?

Локатор — это метод идентификации веб-элемента на странице. Он представляет собой способ различения одного элемента от другого в контексте веб-страницы.

  1. CSS селекторы: они позволяют выбирать элементы на основе их стилей, классов, идентификаторов и иерархии.

  2. XPath: это язык запросов для навигации по XML-документам. Он может использоваться для точного и сложного нахождения элементов на странице.

  3. ID и классы: уникальные идентификаторы (ID) и классы элементов могут также служить локаторами для их идентификации.

  4. Ссылки, тексты, атрибуты: текстовые ссылки, а также значения атрибутов (например, атрибут 'name' или 'value') тоже могут быть использованы в качестве локаторов.

Эффективное использование локаторов позволяет точно находить и взаимодействовать с нужными элементами на странице в процессе тестирования веб-приложений.

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

Вернемся к нашему примеру. В правом окне, напротив элемента нажимаем три точки → Copy → copy JS path. Таким образом, мы только что скопировали JS код, по которому мы сможем найти наш элемент.

d446b186d81901ed9d20d337b3b6d5f4.png

Если мы вставим этот текст, мы увидим JS-код. В этом коде мы сможем увидеть локатор для объекта кнопки поиска.

document.querySelector("#searchInput") - js code

"#searchInput" - Id locator

Затем мы переходим на вкладку консоли (в инструментах разработчика). Эта вкладка позволяет нам выполнять JS-код в контексте приложения. Если мы вставим наш код справа, то увидим выбранное поле ввода слева.

fb5ab70171ac834b7adc7226bee09cae.png

Давайте вставим текст в это поле. Для этого используем вот этот код:

document.querySelector("#searchInput").value = 'test';

820ce422bea5e3a573d2fb93ef37ae71.png

Теперь давайте повторим наши действия для кнопки поиска и кликнем по ней. Найдем и скопируем ее JS код (через стрелку находим элемент, кликаем на 3 точки и выбираем Copy → Copy JS):

7373ee3aeaed9025d9be91a905e1f460.png

Если вставить наш код получиться:

document.querySelector("#search-form > fieldset > button")

Дополним его кликом по этому элементу:

f98570da3d61567d30d43a5744055fa5.png

Теперь объединим наши две строки в один тест. Мы добавляем функцию 'tests и поместим две строки в эту функцию.

Вот так выглядит наш первый тест:

function test() {
  document.querySelector("#searchInput").value = 'test';
  document.querySelector("#search-form > fieldset > button").click();
}

test();

Теперь запустим наш тест. Добавьте наш код в консоль и нажмите ввод.

ed6df6bec6376d54702238a3e7513bbe.png

Тест ввел в поле поиска текст и нажал на кнопку поиск.

Это успех: вот так и выглядит ваш первый тест!

Теперь мы перенесем наше тестирование с браузера на компьютер. Для этого создадим файл test.js на компьютере и попробуем запустить его. Для более удобного просмотра кода рекомендую установить https://code.visualstudio.com/

Но, если наш веб-браузер способен выполнять JavaScript-код по умолчанию, то наш компьютер этого не может. Для того, чтобы запускать JavaScript-код на вашем компьютере, вам необходимо установить Node.js. Вот ссылка на скачивание: https://nodejs.org/en/

После установки Node мы можем запустить файл test.js командой:

node test.js

7bc319646d22b579e643c91269fc2dac.png

Мы видим ошибку ReferenceError: document is not defined.

Эта ошибка возникает потому, что наш компьютер ничего не знает о элементах DOM и не имеет представления о нашем веб-сайте. В данный момент, наш код выполняется в контексте компьютера.

Если мы хотим связать наш компьютер с веб-приложением, нам следует использовать движки (ENGINES).

Шаг 3. Движки

Существует несколько способов связать ваш код с веб-приложением в браузере

4 самых популярных движка:

  1. Selenium: это широко используемый фреймворк для автоматизированного тестирования веб-приложений. Позволяет взаимодействовать с элементами веб-страниц, имитировать действия пользователя и выполнять автоматизированное тестирование в различных браузерах.

  2. Puppeteer: разработанный Google, Puppeteer — это библиотека для Node.js, предоставляющая высокоуровневый API для управления Chrome или Chromium, через протокол DevTools. Полезен для таких задач, как парсинг данных из веб-страниц, автоматизированное тестирование и создание скриншотов веб-страниц.

  3. Cypress: это фреймворк для тестирования конечного пользователя веб-приложений, разработанный для современного веба. Часто используется для тестирования всего, что запускается в браузере. Предоставляет широкий набор инструментов для написания, автоматизации и отладки тестов.

  4. Playwright: разработанный Microsoft, Playwright — это библиотека для Node.js, автоматизирующая браузеры, такие как Chromium, WebKit и Firefox. Предназначена для кросс-браузерной автоматизации тестирования и поддерживает несколько языков программирования.

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

О различиях минусах и плюсах каждого движка можно почитать вот этой статье https://habr.com/ru/articles/566348/

Для удобства выберим Playwright. Для установки Playwright нам нужно запустить команду:

 npm i -D playwright

После установки мы добавляем новую ссылку на Playwright в наш тест. После этого мы сможем её использовать.

Это рабочий код. Если мы его запустим, то увидим, что происходит следующее:

3060521e95f1132ee94a48fba9f30f75.png

  • Первая строка в файле это ссылка на двигатель Playwright.

  • Четвертой строка в коде это вызов Chrome браузера через Playwright.

  • Пятой строкой мы создаем новый контекст и открываем новую страницу в браузере.

  • Седьмая строка мы переходим на нашу страницу Википедии.

  • Восьмая строка вводим значение в поле поиска.

  • Девятая нажимаем кнопку поиска.

Чтобы запустить этот тест надо выполнить в командной строке:

node test_playwright.js

d0d1c4917dc6fdf7f01bb4eaa2e8cde6.png

Что делаем дальше? Мы не можем организовать наш код таким образом, потому что:

  • Команда Node.js позволяет запускать только один файл .js.

  • Если в этом файле содержится несколько тестов, они будут выполняться последовательно и зависимо друг от друга.

  • Если один тест завершится неудачно, следующий также остановится (не запустится).

Нам необходимо разделить наши тесты, чтобы в случае неудачи одного, другие могли продолжить тестирование. Для этого нам нужно разделить наши тесты на тест-кейсы, которые будут не зависеть друг от друга.

Шаг 4. Autotest Runner.

Тест-раннер — это инструмент, который обеспечивает управление и выполнение автоматизированных тестов. Он позволяет организовывать тесты, управлять их выполнением и анализировать результаты. Работа тест-раннера включает в себя следующие возможности:

  1. Запуск тестов: раннер позволяет запускать наборы тестов для проверки функциональности приложений или веб-страниц.

  2. Управление тестами: позволяет организовывать тесты в группы (например, наборы тестов, кейсы) для более удобного управления.

  3. Настройка After и Before тестов: предоставляет возможность выполнять определенные шаги перед началом тестов или после их выполнения (например, предварительная настройка окружения, очистка данных).

  4. Анализ результатов: после выполнения тестов раннер предоставляет отчеты о результатах тестирования, что помогает в идентификации проблем и отладке кода.

  5. Параллельный запуск: некоторые тест-раннеры позволяют запускать тесты параллельно, что повышает эффективность выполнения.

  6. Интеграция с другими инструментами: многие тест-раннеры интегрируются с различными фреймворками тестирования, позволяя легко использовать различные функции и библиотеки.

Популярные тест ранеры для NodeJs:

  • Playwright Test

  • Jest / Jasmine

  • AVA

  • Mocha

Обычно у каждого движка есть свой собственный тест-раннер.

Я считаю, что если вы только начинаете свой путь в автоматизации, лучше использовать тест-раннер, который идет в комплекте с движком по умолчанию. Давайте это сделаем. Я выбираю тест-раннер playwright для Playwright. Используйте эту команду node для его установки.

npm i -D @playwright/test

После установки мы можем использовать этот тест-раннер. Перепишем наш тест:

fe354624cad08ea0e729f5de922a9b0c.png

Первой строкой кода мы добавили ссылку на тестовый ранен. Потом мы обернули наш код в две test функции. Теперь у нас есть два теста: в первом случае мы вводим в поле ввода текст «test» во втором «test2».

! Важно ! Теперь, чтобы запустить наш код, нам нужно использовать команду:

npx playwright test

Разберемся в некоторых вещах:

Раньше мы использовали Node.js для запуска нашего теста. Сейчас мы используем раннер Playwright для этого. Этот ранер считывает код и делает из него тестовые случаи.

Сейчас наш код выглядит неплохо, но всё ещё есть некоторые проблемы. Если локатор для кнопки поиска изменится, нам придется обновить два теста. Если у нас будет три теста с этим локатором, то нам придется обновлять три теста и так далее. Для решение этой проблемы придумали Page Object .

Шаг 5. Page Object.

Паттерн Page Object — это такой подход в тестировании, когда каждая страница или фрагмент веб-приложения представлена в виде отдельного объекта или класса. Он позволяет абстрагировать элементы интерфейса и действия пользователя на этой странице, делая код тестов более читаемым, удобным для поддержки и сопровождения.

Этот подход предлагает создавать отдельные классы для каждой страницы или компонента приложения. Эти классы содержат информацию о структуре страницы (например, элементы управления, поля ввода, кнопки), а также методы для выполнения действий на этой странице (например, заполнение форм, клики на элементы).

Основные преимущества паттерна Page Object:

  1. Разделение ответственности: разделение между логикой тестов и описанием элементов страницы позволяет лучше организовать код и упрощает его поддержку.

  2. Повышение читаемости: создание абстракции для страниц делает код тестов более понятным и читаемым.

  3. Уменьшение дублирования кода: логика работы с элементами страницы инкапсулируется в классы Page Object, что позволяет избежать повторений.

  4. Упрощение изменений: если элементы страницы меняются, достаточно будет внести изменения только в соответствующем классе Page Object.

Этот паттерн широко используется в автоматизированном тестировании веб-приложений, упрощая разработку и обслуживание тестового кода.

Давайте разделим наш код. Мы создали класс WikipediaPage. Этот класс имеет два элемента: поле поиска и кнопку поиска для клика. Также мы создаем метод для перехода на эту страницу. Теперь если какой-то локатор изменится, мы изменим его только на странице класса WikipediaPage.

Объект страницы должен дублировать внешний вид страницы. Вот так выглядит наш класс:

b0aece409007a3197903bc1027def828.png

  • строка один — объявление класса

  • строки четыре и пять это наши локаторы объектов страницы: поля ввода (searchInput) и кнопка поиска (searchButton).

  • метод navigate обеспечивает переход на страницу Википедия.

Тепер вернемся к нашему тесту и перепишем его:

aad34458171aaa98f0ec1c3e69038d19.png

  • Строка пять создает экземпляр страницы википедия.

  • Строка шесть переходит на эту страницу.

  • Строка семь и восемь вводит в поле поиска текст и нажимает на кнопку поиска.

Теперь если у нас поменяется какой то из локатеров, то мы поменяем его значение только в одном месте- в классе WikipediaPage.

На этом собственно все. Надеюсь теперь начать свои первые шаги в автоматизации будет не так сложно.

Репозиторий с частью кода выложен тут https://github.com/ViaMay/first-step-to-automatization-web

Спасибо за внимание.

© Habrahabr.ru