На этом интенсиве познакомимся с Playwright — современным инструментом для автоматизации тестирования веб-приложений. Мы разберем основы его работы, преимущества перед другими фреймворками и научимся писать стабильные и эффективные тесты.
Практикум рассчитан на начинающих тестировщиков и разработчиков, которые хотят освоить Playwright для повседневной работы.
Playwright — это современный инструмент для автоматизации тестирования, созданный с акцентом на стабильность и мультибраузерную поддержку. Основные преимущества:
Поддержка нескольких браузеров:
Chromium, Firefox, WebKit — идеально подходит для кроссбраузерного тестирования.
Скорость и стабильность:
Работает напрямую с браузерами, без необходимости в дополнительных драйверах.
Асинхронная архитектура:
Быстрое выполнение тестов благодаря параллельной работе контекстов.
Удобные инструменты отладки:
Playwright Inspector и Trace Viewer позволяют анализировать и устранять ошибки в тестах.
Гибкость работы с API:
Возможность перехвата запросов и создания мок-данных для различных сценариев.
Поддержка мобильных эмуляций:
Эффективное тестирование веб-приложений для смартфонов и планшетов.
Изоляция контекстов:
Каждый тест выполняется в отдельной сессии браузера, что снижает риски влияния одного теста на другой.
Хорошая документация:
Подробные примеры и регулярные обновления делают инструмент доступным для изучения.
Относительная новизна:
Сообщество меньше по сравнению с Selenium или Cypress, что может усложнить поиск решений.
Порог входа:
Асинхронная природа (работа с async/await) может быть сложной для начинающих.
Размер зависимостей:
Проекты с Playwright тяжелее из-за интегрированных браузеров.
Установите Node.js
Скачайте Node.js с официального сайта и выполните установку.
Установите Visual Studio Code
Скачайте и установите Visual Studio Code — удобный редактор для написания тестов.
Проверьте версию Node.js
После установки откройте терминал в Visual Studio Code и выполните команду:
node -vЭто позволит убедиться, что Node.js установлен корректно.
Создайте новую папку для проекта
Например:
saucedemo-testУстановите Playwright
Внутри созданной папки выполните команду:
npm init playwright@latest
Во время установки выберите:
Результат установки
После выполнения команды будет автоматически:
playwright.config.ts.Теперь вы готовы писать и запускать тесты с использованием Playwright! 🎉
Перед созданием структуры проекта нужно определить, что именно требуется тестировать. Для этого необходимо поставить задачи.
Вот основные задачи:
Для самостоятельной работы:
Для успешной автоматизации тестирования мы разделяем проект на логические части, чтобы сделать код более организованным, читаемым и поддерживаемым. Это также помогает применять лучшие практики, такие как Page Object Model (POM), и обеспечивает удобство для командной работы.
saucedemo-tests/
├── tests/ # Тестовые файлы
│ ├── login.spec.ts # Тест авторизации
│ ├── cart.spec.ts # Тест корзины
├── pages/ # Page Object Model
│ ├── login.page.ts # Логин
│ ├── cart.page.ts # Корзина
└── playwright.config.ts # Конфигурация
saucedemo-tests/Это корневая директория проекта, где находятся все файлы для тестирования. Она включает в себя следующие разделы:
tests/ — для хранения тестовых сценариев.pages/ — для реализации логики взаимодействия с элементами страниц.playwright.config.ts — конфигурация проекта, задающая параметры запуска тестов.tests/Эта папка содержит тестовые сценарии, которые проверяют функциональность сайта Sauce Demo.
Каждый файл здесь фокусируется на определенной функциональности:
login.spec.ts:
Тестирует процесс авторизации:
cart.spec.ts:
Тестирует функциональность корзины:
pages/В этой папке реализована Page Object Model (POM) — подход, который выделяет логику взаимодействия с элементами интерфейса в отдельные классы.
Каждый файл соответствует одной странице веб-приложения:
login.page.ts:
Хранит методы для работы с экраном авторизации:
cart.page.ts:
Реализует функциональность работы с корзиной:
playwright.config.tsЭтот файл содержит настройки для запуска тестов. Он определяет:
Разделение логики:
pages/.Легкость поддержки:
Если изменится интерфейс страницы, достаточно внести изменения только в соответствующий файл pages/.
Читаемость:
Тесты читаются как шаги пользователя, что облегчает их понимание даже новичкам.
Масштабируемость:
Добавление новых тестов или страниц становится простым благодаря четкой структуре.
Почему мы выделяем страницы в отдельные файлы?
Представьте, что сайт изменился, и кнопка “Login” теперь называется “Sign In”. Вместо того чтобы искать это во всех тестах, достаточно обновить один метод в login.page.ts.
Почему разные файлы для тестов?
Тесты разбиты по функциональности, чтобы в случае ошибки было легко понять, что именно не работает: логин, корзина или заказ.
Зачем нужен playwright.config.ts?
Этот файл задает базовые настройки, чтобы не дублировать их в каждом тесте. Например, если нужно тестировать сайт на нескольких браузерах, это указывается только один раз в конфигурации.
playwright.config.ts — это основной файл конфигурации для Playwright. Он позволяет централизованно задавать настройки для запуска тестов, такие как браузеры, базовый URL, время ожидания и многое другое. Этот файл помогает сократить дублирование кода и упрощает управление тестами.
playwright.config.ts1. Импорты
В начале файла подключается необходимая библиотека Playwright:
import { defineConfig } from '@playwright/test';
defineConfig упрощает создание конфигурации с автодополнением.2. Общий объект конфигурации
Файл экспортирует конфигурацию в виде объекта:
export default defineConfig({
// Настройки указываются здесь
});
3. Базовый URL
Установка базового URL позволяет не писать полный путь для каждой страницы. Например:
use: {
baseURL: 'https://www.saucedemo.com/',
}
page.goto('https://www.saucedemo.com/login') достаточно написать page.goto('/login').4. Браузеры
Указываются браузеры, в которых будут запускаться тесты:
projects: [
{ name: 'chromium', use: { browserName: 'chromium' } },
{ name: 'firefox', use: { browserName: 'firefox' } },
{ name: 'webkit', use: { browserName: 'webkit' } },
]
chromium: используется Google Chrome и Microsoft Edge.firefox: для тестирования на браузере Mozilla Firefox.webkit: эмуляция Safari.5. Параметры для запуска
Настраиваются общие параметры для всех тестов:
use: {
headless: true, // Запуск в режиме без UI
viewport: { width: 1280, height: 720 }, // Размер окна браузера
ignoreHTTPSErrors: true, // Игнорирование ошибок HTTPS
video: 'on-first-retry', // Запись видео при повторном запуске
screenshot: 'only-on-failure' // Скриншот только при падении теста
}
headless: экономит ресурсы при тестировании, отключая графический интерфейс.viewport: задает размеры экрана, что полезно для адаптивного тестирования.ignoreHTTPSErrors: помогает избежать проблем при тестировании сайтов с самоподписанными сертификатами.video: полезно для анализа ошибок.screenshot: фиксирует состояние страницы при сбое.6. Время ожидания
Можно настроить таймауты для всех тестов:
timeout: 30000, // Таймаут для выполнения теста (30 секунд)
expect: { timeout: 5000 } // Таймаут для ожиданий (5 секунд)
7. Репорты
Репорты позволяют анализировать прохождение тестов:
reporter: [
['list'], // Отображение в консоли
['html', { outputFolder: 'reports' }] // HTML-отчет
]
list: показывает результаты тестов в реальном времени.html: создает визуальный отчет, который можно открыть в браузере.8. Пути хранения
Можно задать папки для хранения артефактов:
outputDir: 'test-results/', // Директория для результатов тестов
testDir: './tests/' // Путь к папке с тестами
playwright.config.tsimport { defineConfig } from '@playwright/test';export default defineConfig({
testDir: './tests', // Папка с тестами
timeout: 30000, // Таймаут выполнения тестов (30 секунд)
expect: { timeout: 5000 }, // Таймаут для ожиданий (5 секунд)
outputDir: 'test-results/', // Папка для результатовuse: {
baseURL: 'https://www.saucedemo.com/', // Базовый URL
headless: true, // Без графического интерфейса
viewport: { width: 1280, height: 720 }, // Размер окна
ignoreHTTPSErrors: true, // Игнорировать ошибки HTTPS
video: 'on-first-retry', // Видео при повторе
screenshot: 'only-on-failure' // Скриншот при ошибке
},projects: [
{ name: 'chromium', use: { browserName: 'chromium' } },
{ name: 'firefox', use: { browserName: 'firefox' } },
{ name: 'webkit', use: { browserName: 'webkit' } },
],reporter: [
['list'], // Вывод в консоль
['html', { outputFolder: 'reports' }] // HTML отчет
],
});Класс login.page.ts:
import { Page } from ‘@playwright/test’;
export class LoginPage {
constructor(private page: Page) {}
async navigate() {
await this.page.goto(‘https://www.saucedemo.com/’);
}
async login(username: string, password: string) {
await this.page.fill(‘#user-name’, username);
await this.page.fill(‘#password’, password);
await this.page.click(‘#login-button’);
}
}
Этот класс LoginPage создан для автоматизации тестирования страницы входа на сайте (в данном случае https://www.saucedemo.com/) с использованием Playwright. Он реализован в соответствии с Page Object Model (POM) — подходом, который упрощает управление и поддержку тестов за счет разделения взаимодействий с элементами страницы и самих тестовых сценариев. Давайте разберем его по частям.
Импорты
import { Page } from '@playwright/test';
Page — это объект, предоставляемый Playwright, представляющий открытое окно браузера или вкладку. Этот объект используется для взаимодействия с элементами веб-страницы (заполнение форм, клик по кнопкам, навигация и т. д.).Объявление класса
export class LoginPage {
constructor(private page: Page) {}
}
export — позволяет экспортировать класс, чтобы его можно было использовать в других модулях.LoginPage — имя класса, который описывает действия, связанные со страницей входа.constructor(private page: Page) — конструктор принимает объект типа Page и сохраняет его как приватное свойство page. Это позволяет использовать объект страницы внутри методов класса.Метод navigate
async navigate() {
await this.page.goto('https://www.saucedemo.com/');
}
this.page.goto(url: string) — метод Playwright для навигации к определённому URL.await — поскольку goto возвращает промис, await гарантирует выполнение метода до перехода к следующей строке кода.Пример использования:
const loginPage = new LoginPage(page);
await loginPage.navigate();
Метод login
async login(username: string, password: string) {
await this.page.fill('#user-name', username);
await this.page.fill('#password', password);
await this.page.click('#login-button');
}
username: string — логин пользователя.password: string — пароль пользователя.this.page.fill(selector: string, value: string):'#user-name' — селектор для поля ввода логина.'#password' — селектор для поля ввода пароля.this.page.click(selector: string):'#login-button' — селектор кнопки входа.Класс cart.page.ts:
import { Page } from ‘@playwright/test’;
export class CartPage {
constructor(private page: Page) {}
async getCartItems(): Promise<string[]> {
return this.page.locator(‘.inventory_item_name’).allTextContents();
}
}
Класс CartPage в файле cart.page.ts представляет собой реализацию страницы корзины в рамках Page Object Model (POM) для тестирования с использованием Playwright. Он служит для организации тестов и облегчения их поддержки.
Давайте разберем код по частям:
1. Импорт модуля Page
import { Page } from '@playwright/test';
Этот импорт предоставляет тип Page, который используется для взаимодействия с веб-страницей через Playwright. Он необходим для всех действий, связанных с браузером: клики, ввод текста, ожидания и т. д.
2. Определение класса CartPage
export class CartPage {
constructor(private page: Page) {}
}
export — делает класс доступным для импорта в других файлах, что удобно при построении тестов.class CartPage — это объявление класса, который будет представлять страницу корзины.constructor(private page: Page):page (инстанс класса Page), который используется для выполнения действий на странице.private автоматически добавляет поле page в класс и ограничивает доступ к нему только внутри этого класса.3. Метод getCartItems
async getCartItems(): Promise<string[]> {
return this.page.locator('.inventory_item_name').allTextContents();
}
async — делает метод асинхронным, позволяя использовать await внутри метода.getCartItems() — метод, который возвращает массив строк (названия товаров в корзине).Promise<string[]> — указывает, что метод возвращает Promise с массивом строк.this.page.locator('.inventory_item_name'):.inventory_item_name.locator позволяет работать с элементами на странице..allTextContents():.inventory_item_name, метод вернет массив их текстов: ["Item 1", "Item 2", "Item 3"].Класс inventory.page.ts:
Этот код представляет класс InventoryPage, который является частью реализации Page Object Model (POM) для страницы с товарами в приложении SauceDemo. Он предоставляет методы для взаимодействия с элементами на странице. Давайте разберем каждую часть кода.
Импортирование модулей
import { Page, expect } from '@playwright/test';
Page — тип из Playwright, который представляет страницу в браузере. Он используется для всех взаимодействий с веб-страницей.expect — используется для ассертов (проверок) в тестах. С его помощью можно проверять состояние элементов и выполнения действий.Конструктор класса
constructor(private page: Page) {}
InventoryPage принимает объект page, который передается как параметр.private page: Page — это свойство, которое будет использоваться для взаимодействия с браузерной страницей.private автоматически создает свойство класса, доступное только внутри этого класса.Метод navigate
async navigate() {
await this.page.goto('https://www.saucedemo.com/inventory.html');
}
navigate — метод для перехода на страницу с товарами.this.page.goto(...) — метод Playwright для перехода на указанный URL.Метод addItemToCart
async addItemToCart() {
const addCartButton = this.page.locator('[data-test="add-to-cart-sauce-labs-backpack"]');
const isEnabled = await addCartButton.isEnabled();
await expect(isEnabled).toBeTruthy();
await addCartButton.click();
}
addItemToCart — метод для добавления товара в корзину.this.page.locator('[data-test="add-to-cart-sauce-labs-backpack"]'):data-test, который идентифицирует кнопку для добавления рюкзака “Sauce Labs Backpack” в корзину.await addCartButton.isEnabled():await expect(isEnabled).toBeTruthy():isEnabled равно true).await addCartButton.click():Метод clickInventory
async clickInventory() {
const isVisible = await this.page.locator('[data-test="inventory-item-name"]').first().isVisible();
expect(isVisible).toBeTruthy();
}
clickInventory — метод для проверки видимости первого товара в инвентаре.this.page.locator('[data-test="inventory-item-name"]'):data-test="inventory-item-name", который представляет имя товара.first():await isVisible():expect(isVisible).toBeTruthy():isVisible должно быть true).Метод openCart
async openCart() {
await this.page.click('.shopping_cart_link');
}
openCart — метод для открытия корзины.this.page.click('.shopping_cart_link'):shopping_cart_link, который представляет ссылку на корзину.Авторизация (тест: login.spec.ts)
import { test, expect } from ‘@playwright/test’;
import { LoginPage } from ‘../pages/login.page’;
test(‘authorization: successful login’, async ({ page }) => {
const loginPage = new LoginPage(page);
await loginPage.navigate();
await loginPage.login(‘standard_user’, ‘secret_sauce’);
expect(page.url()).toContain(‘/inventory.html’);
});
Этот код представляет тестовый сценарий, который проверяет успешную авторизацию пользователя в приложении.
Импорт модулей
import { test, expect } from '@playwright/test';
import { LoginPage } from '../pages/login.page';
test — используется для определения и выполнения теста.expect — предоставляет возможность проверять условия в тесте.LoginPage — это класс, реализующий Page Object Model (POM) для страницы авторизации. Импортируется из файла login.page.Описание теста
test('Authorization: Successful login', async ({ page }) => {
const loginPage = new LoginPage(page);await loginPage.navigate();
await loginPage.login(‘standard_user’, ‘secret_sauce’);
expect(page.url()).toContain(‘/inventory.html’);
});
1. Имя теста
test('Authorization: Successful login', async ({ page }) => {
Authorization: Successful login.async ({ page }):page — объект Playwright, представляющий открытую вкладку браузера. Он автоматически предоставляется Playwright для каждого теста.2. Создание экземпляра LoginPage
const loginPage = new LoginPage(page);
loginPage, который позволяет использовать методы, описанные в классе LoginPage.page в качестве параметра конструктора.3. Переход на страницу авторизации
await loginPage.navigate();
navigate из класса LoginPage выполняет переход на страницу авторизации.navigate будет использоваться метод Playwright page.goto(...), чтобы открыть URL приложения.4. Авторизация
await loginPage.login('standard_user', 'secret_sauce');
login из класса LoginPage выполняет авторизацию:'standard_user' — имя пользователя.'secret_sauce' — пароль.login будет взаимодействие с полями ввода и кнопкой входа.5. Проверка успешной авторизации
expect(page.url()).toContain('/inventory.html');
'/inventory.html'.Добавление в корзину (тест: cart.spec.ts)
import { test, expect } from ‘@playwright/test’;
import { InventoryPage } from ‘../pages/inventory.page’;
import { CartPage } from ‘../pages/cart.page’;
import { LoginPage } from ‘../pages/login.page’;
test.describe(‘Check cart’, () => {
let inventoryPage: InventoryPage;
let cartPage: CartPage;
let loginPage: LoginPage;
test.beforeEach(async ({ page }) => {
inventoryPage = new InventoryPage(page);
cartPage = new CartPage(page);
loginPage = new LoginPage(page);
await inventoryPage.navigate();
await loginPage.login(‘standard_user’, ‘secret_sauce’);
});
test(‘Add to cart’, async ({ page }) => {
await inventoryPage.clickInventory();
await inventoryPage.addItemToCart();
await inventoryPage.openCart();
const cartItems = await cartPage.getCartItems();
expect(cartItems).toContain(‘Sauce Labs Backpack’);
});
});
import { test, expect } from '@playwright/test';
import { InventoryPage } from '../pages/inventory.page';
import { CartPage } from '../pages/cart.page';
import { LoginPage } from '../pages/login.page';
test и expect — стандартные функции Playwright для написания тестов и утверждений.InventoryPage, CartPage, LoginPage) — классы, которые инкапсулируют логику взаимодействия с конкретными страницами приложения.test.describetest.describe('Check cart', () => { ... });
let inventoryPage: InventoryPage;
let cartPage: CartPage;
let loginPage: LoginPage;
beforeEach.beforeEachtest.beforeEach(async ({ page }) => {
inventoryPage = new InventoryPage(page);
cartPage = new CartPage(page);
loginPage = new LoginPage(page);await inventoryPage.navigate();
await loginPage.login('standard_user', 'secret_sauce');
});
navigate: Переход на страницу (возможно, главную страницу приложения).login: Авторизация с использованием стандартного пользователя и пароля.test('Add to cart', async ({ page }) => {
await inventoryPage.clickInventory();
await inventoryPage.addItemToCart();
await inventoryPage.openCart();const cartItems = await cartPage.getCartItems();
expect(cartItems).toContain('Sauce Labs Backpack');
});
clickInventory: Переход к списку товаров.addItemToCart: Добавление товара (например, “Sauce Labs Backpack”) в корзину.openCart: Переход на страницу корзины.getCartItems: Получение списка товаров в корзине.expect: Утверждение, что товар “Sauce Labs Backpack” находится в корзине.
Для запуску тестів за допомогою Playwright, використовуйте команду:
npx playwright test
Ця команда автоматично запустить всі тести з папки tests, згідно з налаштуваннями в конфігураційному файлі playwright.config.ts.
Запуск конкретного тесту:
Якщо ви хочете запустити конкретний тест, вкажіть шлях до цього тесту:
npx playwright test tests/login.spec.ts
Наприклад, щоб запускати тести в режимі headed (з інтерфейсом браузера), використовуйте:
npx playwright test –headed
Щоб включити більше логів під час запуску тестів:
npx playwright test –verbose
Після завершення тестування, ви зможете побачити результат виконання тестів прямо в консолі. Якщо тести не пройшли, Playwright виведе детальні помилки, щоб допомогти вам виправити проблеми.
Для сверки своего кода вы можете скачать уже готовый проект с репозитория
от базовых операций до продвинутых техник автоматизации.
чтобы создавать более надежные и масштабируемые тесты.
приближенных к боевым задачам.
интеграция с CI/CD, работа с API
Мы также присутствуем в социальных сетях! Подписывайтесь на нас и получайте последние новости, акции, скидки, бесплатные тренинги и участие в марафонах.
Будем рады видеть вас в нашем сообществе!
Публичная оферта. Авторское право © 2024 Школа подготовки тестировщиков