Автоматизация миграции

Основы работы с Playwright

Playwright — это современная библиотека для автоматизации браузеров, поддерживающая Chromium, Firefox и WebKit. Она позволяет управлять браузером программно, имитировать действия пользователя и выполнять проверки интерфейса. В контексте миграции данных и интерфейсов Playwright используется для автоматизации последовательности действий в веб-приложениях, включая авторизацию, навигацию, ввод данных и проверку корректности результатов.

Основные элементы Playwright:

  • Browser — экземпляр браузера, запускаемый в режиме headless или с визуальным интерфейсом.
  • Context — изолированная сессия браузера, позволяет управлять cookies, storage и состоянием пользователя.
  • Page — вкладка браузера, на которой выполняются действия.
  • Locator — объект для поиска и взаимодействия с элементами страницы.

Настройка проекта

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

npm init -y
npm install -D playwright

Создание базового скрипта миграции выглядит так:

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch({ headless: true });
  const context = await browser.newContext();
  const page = await context.newPage();

  await page.goto('https://example.com/login');
  await page.fill('#username', 'admin');
  await page.fill('#password', 'password');
  await page.click('button[type="submit"]');

  await page.waitForNavigation();
  console.log('Вход выполнен успешно');

  await browser.close();
})();

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

Навигация и работа с динамическим контентом

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

await page.waitForSelector('#data-table');
const rows = await page.locator('#data-table tr').allTextContents();

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

Работа с файлами и загрузкой данных

Миграция часто связана с экспортом и импортом файлов. Playwright позволяет управлять диалогами загрузки и сохранения:

const [download] = await Promise.all([
  page.waitForEvent('download'),
  page.click('button#export')
]);

const path = await download.path();
console.log('Файл загружен:', path);

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

await page.setInputFiles('input[type="file"]', 'data.json');
await page.click('button#import');

Такие механизмы позволяют автоматизировать массовый перенос данных без ручного вмешательства.

Масштабирование сценариев миграции

Для сложных миграций рекомендуется структурировать тесты в виде функций и модулей:

async function login(page, username, password) {
  await page.goto('https://example.com/login');
  await page.fill('#username', username);
  await page.fill('#password', password);
  await page.click('button[type="submit"]');
  await page.waitForNavigation();
}

async function migrateData(page, data) {
  for (const item of data) {
    await page.fill('#name', item.name);
    await page.fill('#email', item.email);
    await page.click('button#save');
    await page.waitForSelector('.success');
  }
}

(async () => {
  const browser = await chromium.launch({ headless: true });
  const page = await (await browser.newContext()).newPage();

  await login(page, 'admin', 'password');

  const migrationData = [
    { name: 'Иван', email: 'ivan@example.com' },
    { name: 'Мария', email: 'maria@example.com' }
  ];

  await migrateData(page, migrationData);

  await browser.close();
})();

Такой подход позволяет повторно использовать код, легко добавлять новые шаги и поддерживать сценарии миграции на больших объемах данных.

Обработка ошибок и надежность

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

try {
  await page.click('button#submit');
  await page.waitForSelector('.success', { timeout: 5000 });
} catch (error) {
  console.error('Ошибка при сохранении данных:', error);
}

Можно использовать повторные попытки (retry) или контрольные точки (checkpoint) для повышения стабильности сценариев. Важно логировать все действия, чтобы в случае сбоя можно было восстановить процесс миграции с минимальными потерями.

Параллельное выполнение миграций

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

const { chromium } = require('playwright');

const users = ['admin1', 'admin2', 'admin3'];

await Promise.all(users.map(async (user) => {
  const browser = await chromium.launch();
  const page = await (await browser.newContext()).newPage();
  await login(page, user, 'password');
  await migrateData(page, migrationData);
  await browser.close();
}));

Параллельное выполнение снижает время миграции и позволяет использовать ресурсы сервера эффективно. Важно следить за ограничениями системы и не перегружать сеть или сервер.

Интеграция с CI/CD

Playwright легко интегрируется в CI/CD пайплайны, что позволяет запускать миграцию автоматически при обновлении данных или структуры приложений. Скрипты можно запускать через npm scripts:

"scripts": {
  "migrate": "node migrate.js"
}

В Jenkins, GitHub Actions или GitLab CI можно настроить шаги для запуска миграции после сборки приложения, обеспечивая синхронизацию данных и автоматическое тестирование корректности миграции.

Рекомендации по структуре миграционного проекта

  1. Разделять функции авторизации, навигации и обработки данных.
  2. Хранить тестовые данные в отдельных JSON-файлах.
  3. Логировать каждое действие с временными метками.
  4. Использовать try/catch и контрольные точки для устойчивости.
  5. Параллелить процессы для ускорения миграции больших объемов данных.
  6. Автоматизировать запуск через CI/CD для регулярной проверки и миграции.

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