О практикуме

На этом интенсиве познакомимся с Playwright — современным инструментом для автоматизации тестирования веб-приложений. Мы разберем основы его работы, преимущества перед другими фреймворками и научимся писать стабильные и эффективные тесты.

Практикум рассчитан на начинающих тестировщиков и разработчиков, которые хотят освоить Playwright для повседневной работы.

Что такое Playwright?

Playwright — это современный инструмент для автоматизации тестирования, созданный с акцентом на стабильность и мультибраузерную поддержку. Основные преимущества:

  • Работа с Chromium, Firefox и WebKit “из коробки”.
  • Поддержка эмуляции мобильных устройств и работы с несколькими браузерами одновременно.
  • Мощный API для стабильных тестов.

Плюсы Playwright

  • Поддержка нескольких браузеров:
    Chromium, Firefox, WebKit — идеально подходит для кроссбраузерного тестирования.

  • Скорость и стабильность:
    Работает напрямую с браузерами, без необходимости в дополнительных драйверах.

  • Асинхронная архитектура:
    Быстрое выполнение тестов благодаря параллельной работе контекстов.

  • Удобные инструменты отладки:
    Playwright Inspector и Trace Viewer позволяют анализировать и устранять ошибки в тестах.

  • Гибкость работы с API:
    Возможность перехвата запросов и создания мок-данных для различных сценариев.

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

  • Изоляция контекстов:
    Каждый тест выполняется в отдельной сессии браузера, что снижает риски влияния одного теста на другой.

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

Минусы Playwright

  • Относительная новизна:
    Сообщество меньше по сравнению с Selenium или Cypress, что может усложнить поиск решений.

  • Порог входа:
    Асинхронная природа (работа с async/await) может быть сложной для начинающих.

  • Размер зависимостей:
    Проекты с Playwright тяжелее из-за интегрированных браузеров.

Установка и настройка окружения для Playwright

  1. Установите Node.js
    Скачайте Node.js с официального сайта и выполните установку.

  2. Установите Visual Studio Code
    Скачайте и установите Visual Studio Code — удобный редактор для написания тестов.

  3. Проверьте версию Node.js
    После установки откройте терминал в Visual Studio Code и выполните команду:

    node -v

    Это позволит убедиться, что Node.js установлен корректно.

  4. Создайте новую папку для проекта
    Например:

    saucedemo-test
  5. Установите Playwright
    Внутри созданной папки выполните команду:

    npm init playwright@latest

    Во время установки выберите:

    • Тип проекта: TypeScript.
    • Необходимые браузеры: Chromium, Firefox, WebKit.
    • Дополнительные инструменты: GitHub Actions или другие CI/CD сервисы (по необходимости).
  6. Результат установки
    После выполнения команды будет автоматически:

    • Создана структура проекта с примерами тестов.
    • Сгенерирован файл конфигурации playwright.config.ts.
    • Загрузены необходимые браузеры для тестирования.

Теперь вы готовы писать и запускать тесты с использованием Playwright! 🎉

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

Вот основные задачи:

  1. Авторизация.
  2. Добавление товара в корзину.

Для самостоятельной работы:

  1. Негативные проверки авторизации
  2. Покрыть страницу категории
  3. Покрыть страницу товара

Для успешной автоматизации тестирования мы разделяем проект на логические части, чтобы сделать код более организованным, читаемым и поддерживаемым. Это также помогает применять лучшие практики, такие как Page Object Model (POM), и обеспечивает удобство для командной работы.

https://www.saucedemo.com

saucedemo-tests/
├── tests/ # Тестовые файлы
│ ├── login.spec.ts # Тест авторизации
│ ├── cart.spec.ts # Тест корзины
├── pages/ # Page Object Model
│ ├── login.page.ts # Логин
│ ├── cart.page.ts # Корзина
└── playwright.config.ts # Конфигурация

 

1. saucedemo-tests/

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

  • Папка tests/ — для хранения тестовых сценариев.
  • Папка pages/ — для реализации логики взаимодействия с элементами страниц.
  • Файл playwright.config.ts — конфигурация проекта, задающая параметры запуска тестов.

2. tests/

Эта папка содержит тестовые сценарии, которые проверяют функциональность сайта Sauce Demo.
Каждый файл здесь фокусируется на определенной функциональности:

  • login.spec.ts:
    Тестирует процесс авторизации:

    • Проверка успешного входа в систему.
  • cart.spec.ts:
    Тестирует функциональность корзины:

    • Добавление товара в корзину.

3. pages/

В этой папке реализована Page Object Model (POM) — подход, который выделяет логику взаимодействия с элементами интерфейса в отдельные классы.
Каждый файл соответствует одной странице веб-приложения:

  • login.page.ts:
    Хранит методы для работы с экраном авторизации:

    • Ввод логина и пароля.
    • Клик по кнопке “Login”.
  • cart.page.ts:
    Реализует функциональность работы с корзиной:

    • Проверка содержимого корзины.

4. playwright.config.ts

Этот файл содержит настройки для запуска тестов. Он определяет:

  • Браузеры, которые будут использоваться для тестирования (Chromium, Firefox, WebKit).
  • Параметры запуска, такие как:
    • Настройка базового URL для тестов.
    • Скриншоты и видео при ошибках.
    • Репорты о прохождении тестов.
  • Настройки времени ожидания (timeouts).

Преимущества такой структуры

  1. Разделение логики:

    • Тесты сосредоточены только на сценариях.
    • Вся логика работы с элементами хранится в pages/.
  2. Легкость поддержки:
    Если изменится интерфейс страницы, достаточно внести изменения только в соответствующий файл pages/.

  3. Читаемость:
    Тесты читаются как шаги пользователя, что облегчает их понимание даже новичкам.

  4. Масштабируемость:
    Добавление новых тестов или страниц становится простым благодаря четкой структуре.


Пример объяснения

  • Почему мы выделяем страницы в отдельные файлы?
    Представьте, что сайт изменился, и кнопка “Login” теперь называется “Sign In”. Вместо того чтобы искать это во всех тестах, достаточно обновить один метод в login.page.ts.

  • Почему разные файлы для тестов?
    Тесты разбиты по функциональности, чтобы в случае ошибки было легко понять, что именно не работает: логин, корзина или заказ.

  • Зачем нужен playwright.config.ts?
    Этот файл задает базовые настройки, чтобы не дублировать их в каждом тесте. Например, если нужно тестировать сайт на нескольких браузерах, это указывается только один раз в конфигурации.

playwright.config.ts — это основной файл конфигурации для Playwright. Он позволяет централизованно задавать настройки для запуска тестов, такие как браузеры, базовый URL, время ожидания и многое другое. Этот файл помогает сократить дублирование кода и упрощает управление тестами.


Основные разделы playwright.config.ts

1. Импорты

В начале файла подключается необходимая библиотека 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.ts

 
import { 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 — пароль пользователя.
  • Шаги:
    1. this.page.fill(selector: string, value: string):
      • Заполняет текстовое поле, выбранное с помощью CSS-селектора.
      • '#user-name' — селектор для поля ввода логина.
      • '#password' — селектор для поля ввода пароля.
    2. 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:

import { Page, expect } from ‘@playwright/test’;

export class InventoryPage {
  constructor(private page: Page) {}

  async navigate() {
    await this.page.goto(‘https://www.saucedemo.com/inventory.html’);
  }

  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();

  }
  async clickInventory(){
    const isVisible = await this.page.locator(‘[data-test=”inventory-item-name”]’).first().isVisible();
    expect(isVisible).toBeTruthy();
  }
  async openCart() {
    await this.page.click(‘.shopping_cart_link’);
  }
}

Этот код представляет класс 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.
    • В данном случае, мы открываем страницу с товарами на сайте SauceDemo.

Метод 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 — метод для добавления товара в корзину.
    1. this.page.locator('[data-test="add-to-cart-sauce-labs-backpack"]'):
      • Ищем кнопку с атрибутом data-test, который идентифицирует кнопку для добавления рюкзака “Sauce Labs Backpack” в корзину.
    2. await addCartButton.isEnabled():
      • Проверяем, активна ли кнопка (то есть, доступна ли она для клика).
    3. await expect(isEnabled).toBeTruthy():
      • Утверждаем, что кнопка действительно активна (проверка, что значение isEnabled равно true).
    4. await addCartButton.click():
      • Если кнопка активна, кликаем по ней, чтобы добавить товар в корзину.

Метод clickInventory

async clickInventory() { const isVisible = await this.page.locator('[data-test="inventory-item-name"]').first().isVisible(); expect(isVisible).toBeTruthy(); }
  • clickInventory — метод для проверки видимости первого товара в инвентаре.
    1. this.page.locator('[data-test="inventory-item-name"]'):
      • Ищем элемент с атрибутом data-test="inventory-item-name", который представляет имя товара.
    2. first():
      • Выбираем первый элемент среди найденных с этим селектором (если на странице несколько товаров, выбираем первый).
    3. await isVisible():
      • Проверяем, видим ли этот элемент на странице.
    4. 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';
  1. test — используется для определения и выполнения теста.
  2. expect — предоставляет возможность проверять условия в тесте.
  3. 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');
  • Проверяем, что URL текущей страницы содержит '/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’);
});
});

  1. Импорты
    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 для написания тестов и утверждений.
    • Page Objects (InventoryPageCartPageLoginPage) — классы, которые инкапсулируют логику взаимодействия с конкретными страницами приложения.

  1. test.describe
    test.describe('Check cart', () => { ... });
    • Группирует связанные тесты. В данном случае это тесты для проверки корзины.

  1. Объявление переменных страниц
    let inventoryPage: InventoryPage; let cartPage: CartPage; let loginPage: LoginPage;
    • Создаются переменные для работы с различными страницами. Их инициализация происходит в beforeEach.

  1. beforeEach
    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'); });
    • Этот хук выполняется перед каждым тестом.
    • Инициализируются страницы через их Page Object классы.
    • navigate: Переход на страницу (возможно, главную страницу приложения).
    • login: Авторизация с использованием стандартного пользователя и пароля.

  1. Тест на добавление товара в корзину
    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'); });
    • Тест проверяет, что товар добавляется в корзину:
      1. clickInventory: Переход к списку товаров.
      2. addItemToCart: Добавление товара (например, “Sauce Labs Backpack”) в корзину.
      3. openCart: Переход на страницу корзины.
      4. getCartItems: Получение списка товаров в корзине.
      5. 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 виведе детальні помилки, щоб допомогти вам виправити проблеми.

 

 

Скачать готовый проект с GitLab?

Для сверки своего кода вы можете скачать уже готовый проект с репозитория

Хотите пройти полноценный 2 месячный курс по Playwright на TypeScript?

На курсе вы

Изучите Playwright в деталях

от базовых операций до продвинутых техник автоматизации.

Освоите TypeScript

чтобы создавать более надежные и масштабируемые тесты.

Создадите тестовые сценарии для реальных проектов

приближенных к боевым задачам.

Погрузитесь в современные подходы автоматизации

интеграция с CI/CD, работа с API

16 декабря о 20:00

старт

Начало обучения через

0 Дней
0 Часов
0 Минут
0 Секунд

Хотите узнать больше про курс?

Мы также присутствуем в социальных сетях! Подписывайтесь на нас и получайте последние новости, акции, скидки, бесплатные тренинги и участие в марафонах.
Будем рады видеть вас в нашем сообществе!

Курсы

Публичная оферта. Авторское право © 2024 Школа подготовки тестировщиков