본문 바로가기
테스트/Playwright

[Playwright] 드래그 앤 드랍

by 맨날개발 2025. 3. 24.

🎈 드래그 앤 드랍

드래그 앤 드랍의 경우 플레이라이트에서 함수로 제공해주고 있다.

source.dragTo(target);

 

아래는 간단하게 소스로부터 타겟에게 드래그앤드랍하는 HTML 코드이다. 정상적으로 드랍이 된 경우 부모 div에게 reverse라는 클래스를 추가해주었다.

더보기

HTML 코드

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .container {
      display: flex;
      flex-direction: column;
    }

    .container.reverse {
      flex-direction: column-reverse;
    }

    .container div {
      width: 100px;
      height: 100px;
      border: 1px solid #111;
    }

    .div1 {
      background: red;
    }

    .div2 {
      background: blue;
    }
  </style>
</head>
<body>
  <div class="container">
      <div id="source" class="div1" draggable="true"></div>
      <div id="target" class="div2"></div>
  </div>
  <script>
    document.querySelector('.div2').addEventListener('dragover', function(e) {
      e.preventDefault();
    });

    document.querySelector('.div2').addEventListener('drop', function(e) {
      e.preventDefault();
      document.querySelector('.container').classList.add('reverse');
    });
  </script>
</body>
</html>

 

 

드래그 앤 드랍 후 div에 reverse 클래스가 부여되는지를 테스트코드로 작성해보았다. dragTo 함수를 통해 간단하게 작성할 수 있다.

import { expect, test } from '@playwright/test';

test('Drag And Drop', async ({ page }) => {
  await page.goto('http://127.0.0.1:5500/index.html');
  
  const source = page.locator('#source');
  const target = page.locator('#target');

  await source.dragTo(target);
  await expect(page.locator('.reverse')).toBeVisible();
});

 

 

📯 드래그

dragTo는 드래그 앤 드랍을 사용할 때 사용할 수 있는 함수이다. 드랍을 사용하지 않고 드래그만 하는 경우에는 사용할 수 없다.

 

dragTo보다 좀더 정교하게 컨트롤하고 싶거나 또는 드래그만 하고 싶은 경우에는 마우스 다운, 이동, 업 이벤트를 모두 수동으로 동작시켜주어야 한다.

await page.mouse.down();
await page.mouse.move();
await page.mouse.up();

 

✨ down 함수에는 좌표를 전달할 수 없다. 즉, 마우스를 먼저 이동시킨 후 다운 이벤트를 트리거만 할 수 있다.

 

 

그래서 마우스를 먼저 이동시켜주어야 하는데, 마우스를 이동시킬때는 2가지 방법을 사용할 수 있다.

  1. 메인 프레임의 뷰포트를 기준으로 좌표값만큼 마우스를 이동
  2. 특정 Locator를 대상으로해서 이동

 

첫번째 방법은 page.mouse.move() 를 사용한다. down은 좌표를 전달할 수 없지만, move는 이동할 위치를 전달할 수 있다.

await page.mouse.move(x좌표, y좌표);

 

두번째 방법은 locator.hover() 를 사용한다. 원하는 대상으로 좌표계산없이 좀 더 쉽게 이동할 수 있다.

page.locator('div1').hover();

 

 

이를 통해서 dragTo를 사용하지 않고 드래그 앤 드랍을 수동으로 작동해보자. 동일하게 테스트에 통과하는것을 확인할 수 있다.

test('Drag And Drop', async ({ page }) => {
  await page.goto('http://127.0.0.1:5500/index.html');
  
  await page.locator('.div1').hover();
  await page.mouse.down();
  await page.locator('.div2').hover();
  await page.mouse.up();

  await expect(page.locator('.reverse')).toBeVisible();
});

 

✨ hover함수를 통해 직접 좌표를 계산할 필요 없이 간단하게 dragTo 기능을 수동으로 구현할 수 있다.
✨ 만약 드랍을 사용하지 않는다면 move()를 통해서 특정 좌표로 이동하면 된다.