Перетаскивание элементов в Playwright — это одна из важных возможностей для взаимодействия с элементами на веб-странице, позволяющая эмулировать действия пользователя, такие как перетаскивание и отпускание объектов на странице. Этот процесс полезен для тестирования интерфейсов, в которых элементы могут быть перемещены, такие как списки задач, канбан-доски, редакторы и другие интерактивные компоненты.
Перетаскивание (drag and drop) представляет собой взаимодействие с элементами на странице, когда один элемент перемещается из одной области в другую. В автоматизации тестов для web-приложений это часто используется для проверки корректности работы с динамическими элементами и событий, связанных с изменением их положения на экране.
Playwright предоставляет мощный API для реализации таких сценариев, поддерживающий как базовые действия, так и более сложные взаимодействия с элементами, включая перетаскивание.
Playwright включает метод dragAndDrop(), который
используется для эмуляции операции перетаскивания элемента из одной
точки в другую. Этот метод позволяет указать исходный элемент и целевой,
куда нужно переместить элемент.
Пример базового кода для перетаскивания:
const { test, expect } = require('@playwright/test');
test('drag and drop', async ({ page }) => {
await page.goto('https://example.com'); // Переход на страницу
const source = await page.locator('#source'); // Исходный элемент
const target = await page.locator('#target'); // Целевой элемент
// Перетаскивание элемента
await source.dragAndDrop(target);
// Проверка результата
await expect(target).toHaveText('Перемещено'); // Ожидаемый результат
});
В этом примере элемент с идентификатором #source
перемещается в элемент с идентификатором #target. После
выполнения операции можно проверить, что целевой элемент изменил свой
текст на “Перемещено”.
Playwright позволяет работать не только с самими элементами, но и с
событиями, которые могут происходить во время операции перетаскивания.
Например, можно следить за событиями dragstart,
dragend, drop или другими пользовательскими
событиями.
Использование событий в перетаскивании:
const { test, expect } = require('@playwright/test');
test('drag and drop with events', async ({ page }) => {
await page.goto('https://example.com');
const source = await page.locator('#source');
const target = await page.locator('#target');
// Подписка на события
page.on('dragstart', () => console.log('Перетаскивание начато'));
page.on('dragend', () => console.log('Перетаскивание завершено'));
page.on('drop', () => console.log('Элемент был перемещен'));
await source.dragAndDrop(target);
// Ожидание завершения перетаскивания
await expect(target).toHaveText('Перемещено');
});
Это позволяет отслеживать и логировать события, связанные с процессом перетаскивания, что полезно для отладки и более детализированного тестирования.
Иногда может потребоваться перетаскивать элемент в точку с
конкретными координатами, а не просто в другой элемент. В таких случаях
Playwright позволяет эмулировать более точное управление с помощью
метода mouse для симуляции действия мыши.
Пример перетаскивания с указанием координат:
const { test, expect } = require('@playwright/test');
test('drag and drop with coordinates', async ({ page }) => {
await page.goto('https://example.com');
const source = await page.locator('#source');
const target = await page.locator('#target');
// Получение координат целевого элемента
const targetBox = await target.boundingBox();
// Перетаскивание с координатами
const sourceBox = await source.boundingBox();
const offsetX = targetBox.x - sourceBox.x;
const offsetY = targetBox.y - sourceBox.y;
await source.mouse.move(sourceBox.x + sourceBox.width / 2, sourceBox.y + sourceBox.height / 2);
await source.mouse.down();
await source.mouse.move(targetBox.x + offsetX, targetBox.y + offsetY);
await source.mouse.up();
// Проверка результата
await expect(target).toHaveText('Перемещено');
});
В этом примере перетаскивание осуществляется с точностью до пикселей,
где mouse.move() используется для перемещения мыши в нужную
точку с учётом координат целевого элемента.
Для отладки перетаскивания и выявления возможных проблем можно использовать различные методы и подходы, включая создание скриншотов и запись видео.
Пример записи видео:
const { test, expect } = require('@playwright/test');
test('drag and drop with video recording', async ({ page }) => {
await page.goto('https://example.com');
await page.video().start();
const source = await page.locator('#source');
const target = await page.locator('#target');
await source.dragAndDrop(target);
// Проверка результата
await expect(target).toHaveText('Перемещено');
await page.video().stop();
});
Это позволяет зафиксировать все действия, связанные с перетаскиванием, и воспроизвести их для последующего анализа.
В реальных веб-приложениях часто встречаются динамичные интерфейсы, где элементы могут менять свое местоположение после взаимодействий с пользователем. Playwright может взаимодействовать с такими интерфейсами, однако необходимо учитывать, что элементы могут быть обновлены, исчезать или появляться.
Пример работы с динамическими элементами:
const { test, expect } = require('@playwright/test');
test('drag and drop in dynamic interface', async ({ page }) => {
await page.goto('https://example.com');
const source = await page.locator('#source');
const target = await page.locator('#target');
// Ожидание появления целевого элемента
await target.waitFor({ state: 'visible' });
// Перетаскивание
await source.dragAndDrop(target);
// Проверка результата
await expect(target).toHaveText('Перемещено');
});
Этот код гарантирует, что тест будет продолжен только после того, как целевой элемент станет видимым, что особенно важно при взаимодействии с динамически загружаемыми элементами.
Поддержка браузеров. Playwright поддерживает перетаскивание в всех поддерживаемых браузерах (Chromium, Firefox, WebKit), что позволяет тестировать функционал на разных платформах.
Динамичность страницы. Важно удостовериться, что
элементы, с которыми будет производиться перетаскивание, загружены и
отображаются на странице. Для этого можно использовать методы ожидания,
такие как waitForSelector() или
waitFor().
Местоположение элементов. В некоторых случаях элементы могут быть скрытыми или перекрытыми другими объектами. В таких ситуациях рекомендуется использовать методы проверки видимости элементов или прямую работу с их координатами.
Перетаскивание в Playwright — это мощный инструмент для тестирования интерактивных элементов веб-приложений. При правильном подходе к написанию тестов можно убедиться в стабильности и функциональности интерфейсов, которые используют операции перетаскивания.