์ธํ”„๋Ÿฐ ๊ฐ•์˜ - Playwright ๊ธฐ์ดˆ (๊ธฐ์ดˆ์ ์ธ ํ™œ์šฉ๋ฒ•๊ณผ ํ•ต์‹ฌ ์›๋ฆฌ)

2025. 6. 14. 14:20ยท๐Ÿ“‚ Additional/๐Ÿ“„ Playwright
 

[์ง€๊ธˆ ๋ฌด๋ฃŒ]Playwright ๊ธฐ์ดˆ - ๊ธฐ์ดˆ์ ์ธ ํ™œ์šฉ๋ฒ•๊ณผ ํ•ต์‹ฌ ์›๋ฆฌ ๊ฐ•์˜ | duckyoung lee - ์ธํ”„๋Ÿฐ

duckyoung lee | , [์‚ฌ์ง„]Playwright ๊ธฐ์ดˆ ๊ฐ•์˜Playwright ๊ธฐ์ดˆ ๊ฐ•์˜์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ E2E ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์ธ Playwright์˜ ๊ธฐ์ดˆ์ ์ธ ํ™œ์šฉ๋ฒ•๊ณผ ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ๋ฐฐ์›๋‹ˆ๋‹ค.์ด๋Ÿฐ ๋ถ„๋“ค๊ป˜ ์ถ”์ฒœํ•ด์š”E2Eํ…Œ์ŠคํŠธ๊ฐ€ ์ฒ˜์Œ์ด

www.inflearn.com

 

๐Ÿ“Œ ํ”„๋กœ์ ํŠธ ์„ค์ •

๐Ÿš€ npm init playwright@latest
 ใ„ด Playwright๋Š” ์›น ์ž๋™ํ™” ํ…Œ์ŠคํŠธ ๋„๊ตฌ (E2E ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉ๋จ)
 ใ„ด ์ด ๋ช…๋ น์–ด๋Š” Playwright๋ฅผ ์œ„ํ•œ ๊ธฐ๋ณธ ์„ค์ •๊ณผ ์ƒ˜ํ”Œ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์„ ์ƒ์„ฑ

๐Ÿš€ npx playwright test
 ใ„ด Playwright ํ…Œ์ŠคํŠธ ์‹คํ–‰
 ใ„ด CLI ์ƒ์—์„œ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ์ถœ๋ ฅ
 ใ„ด playwright-report/ ํด๋”์— HTML ๋ฆฌํฌํŠธ๋„ ์ƒ์„ฑ

 

package.json์˜ scripts์— ๋‹ค์Œ์ฒ˜๋Ÿผ ์ถ”๊ฐ€

"scripts": {
    "test": "npx playwright test"
}

 

๊ทธ ์ดํ›„๋ถ€ํ„ฐ๋Š” ์•„๋ž˜ ๋ช…๋ น์–ด๋งŒ์œผ๋กœ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๊ฐ€๋Šฅ

npm run test

 

๊ทธ ํ›„, VS Code์—์„œ Playwright Test for VSโ€ฏCode ํ™•์žฅ ์„ค์น˜

 

1. ํ…Œ์ŠคํŠธ ํƒ์ƒ‰ & ์‹คํ–‰

  • ์‚ฌ์ด๋“œ๋ฐ”์—์„œ ํ…Œ์ŠคํŠธ ํŒŒ์ผ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ํ™•์ธ
  • ๊ฐœ๋ณ„ ํ…Œ์ŠคํŠธ ๋˜๋Š” ์ „์ฒด ์‹คํ–‰ ๋ฒ„ํŠผ ํด๋ฆญ
  • Projects ์„น์…˜์—์„œ ์›ํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €๋งŒ ์„ ํƒํ•˜์—ฌ ์‹คํ–‰

2. ์‹œ๊ฐ์  ๋””๋ฒ„๊น…

  • "Show browser" ์ฒดํฌ → ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๊ณผ์ •์„ ์‹ค์ œ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Œ
  • "Show trace viewer" ์ฒดํฌ → ์‹คํ–‰ ํ›„ ํƒ€์ž„๋ผ์ธ์œผ๋กœ ๋ถ„์„ ๊ฐ€๋Šฅ

3. ์ฝ”๋“œ ์ƒ์„ฑ & Locator ์ฐพ๊ธฐ

  • Pick locator: ๋ธŒ๋ผ์šฐ์ €์—์„œ ์š”์†Œ ํด๋ฆญ → selector ์ž๋™ ์ƒ์„ฑ
  • Record new: ๋ธŒ๋ผ์šฐ์ € ์กฐ์ž‘ → ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž๋™ ์ƒ์„ฑ
  • Locator ํŽธ์ง‘ ํ›„ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ•˜์ด๋ผ์ดํŠธ๋กœ ์ฆ‰์‹œ ํ™•์ธ

4. ์‹คํŒจ ๋ถ„์„

  • ํ…Œ์ŠคํŠธ ์‹คํŒจ ์‹œ ํ•ด๋‹น ์ง€์  ํด๋ฆญ → ๋ธŒ๋ ˆ์ดํฌํฌ์ธํŠธ ์„ค์ •
  • ๋ผ์ด๋ธŒ ๋””๋ฒ„๊ทธ ๋ชจ๋“œ๋กœ ๋‹จ๊ณ„๋ณ„ ์‹คํ–‰ ๋ฐ ๋ณ€์ˆ˜ ํ™•์ธ
  • Trace Viewer๋กœ ์‹คํŒจ ์ˆœ๊ฐ„์˜ ์Šคํฌ๋ฆฐ์ƒท, ๋„คํŠธ์›Œํฌ ๋กœ๊ทธ ๋“ฑ ๋ถ„์„

 

๐Ÿ“Œ ๊ธฐ์ดˆ ์˜ˆ์ œ

๐Ÿ’ก ๋„ค๋น„๊ฒŒ์ด์…˜ ํ…Œ์ŠคํŠธ ์ž‘์„ฑํ•˜๊ธฐ

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

test('if user visit home and click "Get Started", h1 "introduction" is visible and page title is contains "Introduction"', async ({page}) => {
    const startUrl = 'https://nextjs.org/';
    const h1 = "Next.js Docs";
    const title = /Docs/;

    await page.goto(startUrl);
    await page.getByRole('link', { name: 'Get Started' }).click();

    await expect(page.getByRole('heading', { name: h1, level: 1 })).toBeVisible();
    await expect(page).toHaveTitle(title);
});

 

๐Ÿ’ก ๋ฒ„ํŠผ ํด๋ฆญ ํ…Œ์ŠคํŠธ ์ž‘์„ฑํ•˜๊ธฐ

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

test.describe('button click', () => {
    test('open preferences menu', async ({page}) => {
        const startUrl = 'http://localhost:3000/';
        
        await page.goto(startUrl);
        
        await test.step('if click next.js icon, show dropdown menu', async () => {
            await page.getByRole('button', { name: 'Open Next.js Dev Tools'}).click();
            await expect(page.getByText('Preferences')).toBeVisible();
        });
        await test.step('if click preferences, show preferences menu', async () => {
            await page.getByText('Preferences').click();
            await expect(page.getByRole('heading', {name: 'Preferences'})).toBeVisible();
        });
    })
})

 

๐Ÿ’ก ์ œ์ถœ ์–‘์‹ ํ…Œ์ŠคํŠธ ์ž‘์„ฑํ•˜๊ธฐ

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

test.describe('sign-up', () => {
    test.describe('validation', () => {
        test('if select plan type and fill name, submit enabled', async ({page}) => {
            const startUrl = 'https://vercel.com/signup';

            await page.goto(startUrl);

            await page.getByText("I'm working on personal projects").click();
            await page.getByLabel('Your Name').fill('input content');
            await expect(page.getByRole('button', {name: 'Continue'})).toBeEnabled();
        });
    });
});

 

๐Ÿ“Œ ํ•ต์‹ฌ ๊ฐœ๋…

package.json์˜ scripts์— ๋‹ค์Œ์ฒ˜๋Ÿผ ์ˆ˜์ • ์‹œ, ui ๋ชจ๋“œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

"scripts": {
    "test": "npx playwright test --ui"
}

 

โœ… ui ๋ชจ๋“œ ์ฃผ์š” ๋ชฉ์ 

  • ํ…Œ์ŠคํŠธ ํƒ์ƒ‰, ์„ ํƒ, ์‹คํ–‰์„ GUI๋กœ ์ œ์–ด
  • ํ…Œ์ŠคํŠธ์˜ ํžˆ์Šคํ† ๋ฆฌ์™€ ๊ฐ ๋‹จ๊ณ„์˜ ์Šค๋ƒ…์ƒท ํ™•์ธ

โœ… ui ๋ชจ๋“œ์—์„œ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ

  • ์ „์ฒด ํ…Œ์ŠคํŠธ ๋ชฉ๋ก์„ ์‹œ๊ฐ์ ์œผ๋กœ ํƒ์ƒ‰
  • ํŠน์ • ํ…Œ์ŠคํŠธ๋งŒ ์„ ํƒํ•˜์—ฌ ์‹คํ–‰
  • ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์ค‘ ๋‹จ๊ณ„๋ณ„ ์Šค๋ƒ…์ƒท ์ž๋™ ๊ธฐ๋ก
  • ๊ฐ ๋‹จ๊ณ„๋ณ„ locator, assert, click ๋“ฑ ์‹œ์ ๋ณ„ ์ƒํƒœ ํ™•์ธ
  • ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ์˜ DOM ์ƒํƒœ, ์—๋Ÿฌ ๋กœ๊ทธ, ์Šคํฌ๋ฆฐ์ƒท ํ™•์ธ
  • ์žฌ์‹คํ–‰ ๋ฐ ๋””๋ฒ„๊น… ๋ชจ๋“œ ์ „ํ™˜ ๊ฐ€๋Šฅ

โœ… ui ๋ชจ๋“œ ํŠน์ง•

  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋™์œผ๋กœ ๋œจ๋ฉฐ, GUI ๋„๊ตฌ๊ฐ€ ํ•จ๊ป˜ ์—ด๋ฆผ
  • ํ…Œ์ŠคํŠธ ์ „๋ฐ˜์ ์ธ ํ๋ฆ„์„ ๊ด€๋ฆฌํ•˜๊ณ ์ž ํ•  ๋•Œ ์ ํ•ฉ
  • ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒํ•˜๊ฒŒ ๊ฐœ๋ฐœ์ž์šฉ GUI์—์„œ ํ™•์ธํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ์œ ์šฉ

 

package.json์˜ scripts์— ๋‹ค์Œ์ฒ˜๋Ÿผ ์ˆ˜์ • ์‹œ, debug ๋ชจ๋“œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

"scripts": {
    "test": "npx playwright test --debug"
}

 

โœ… debug ๋ชจ๋“œ ์ฃผ์š” ๋ชฉ์ 

  • ํŠน์ • ํ…Œ์ŠคํŠธ๋ฅผ ์ค‘๊ฐ„์— ๋ฉˆ์ถ”๊ณ  ํ•œ ๋‹จ๊ณ„์”ฉ ์ˆ˜๋™ ์กฐ์ž‘
  • ๋””๋ฒ„๊น… ๋„๊ตฌ(Playwright Inspector)๋ฅผ ์—ด์–ด ๋‚ด๋ถ€ ์ƒํƒœ ๋ถ„์„

โœ… debug ๋ชจ๋“œ์—์„œ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ

  • ํ…Œ์ŠคํŠธ ์ค‘๋‹จ์ (pause) ์ƒํƒœ์—์„œ ์‹œ์ž‘
  • ํ…Œ์ŠคํŠธ ํ๋ฆ„์„ ํ•œ ๋‹จ๊ณ„์”ฉ ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰
  • ๊ฐ ๋ช…๋ น์–ด์˜ Locator ๊ฒฐ๊ณผ, ์ƒํƒœ, Timeout ๋“ฑ์„ ํ™•์ธ
  • ์‹ค์‹œ๊ฐ„ DOM ์ƒํƒœ ๊ด€์ฐฐ ๋ฐ ์กฐ์ž‘ ๊ฐ€๋Šฅ
  • ํ•„์š”ํ•œ ๊ฒฝ์šฐ page.pause(), debug() ๋“ฑ ์ฝ”๋“œ์— ์ง์ ‘ ์‚ฝ์ž… ๊ฐ€๋Šฅ

โœ… debug ๋ชจ๋“œ ํŠน์ง•

  • ์ž๋™ ์‹คํ–‰๋ณด๋‹จ ์ค‘๊ฐ„ ๊ฐœ์ž…์ด ํ•„์š”ํ•œ ๋””๋ฒ„๊น…์— ์ ํ•ฉ
  • ์ฝ˜์†”์—์„œ ์ง์ ‘ ์š”์†Œ ์ƒํƒœ ํ™•์ธ, ๋‹ค์‹œ ์‹œ๋„, ์ˆ˜์ • ๋“ฑ์„ ํ•  ์ˆ˜ ์žˆ์Œ
  • ๋ฐ˜๋ณต ์‹คํŒจ ๊ตฌ๊ฐ„์„ ์ •๋ฐ€ํ•˜๊ฒŒ ํŒŒ์•…ํ•˜๊ณ ์ž ํ•  ๋•Œ ์œ ์šฉ

 

๋˜ํ•œ, debug ๋ชจ๋“œ ์‹คํ–‰ ์‹œ ์ž๋™์œผ๋กœ ๋œจ๋Š” Playwright Inspector ์ฐฝ ์•ˆ์—์„œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณต

 

โœ… [Pick Locator] ๋ฒ„ํŠผ

  • ์›น ํŽ˜์ด์ง€์—์„œ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์€ ์š”์†Œ๋ฅผ ํด๋ฆญํ•˜๋ฉด, Playwright๊ฐ€ ์ตœ์ ์˜ Locator ์ฝ”๋“œ๋ฅผ ์ž๋™ ์ƒ์„ฑ
  • getByRole, getByText, locator() ๋“ฑ ๊ฐ€์žฅ ์•ˆ์ •์ ์ด๊ณ  ์˜๋ฏธ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ถ”์ฒœ
  • QA ์—”์ง€๋‹ˆ์–ด๋‚˜ ๋น„๊ฐœ๋ฐœ์ž๋„ ์ง์ ‘ CSS/XPath ๊ณ ๋ฏผ ์•ˆ ํ•˜๊ณ  ์š”์†Œ ์„ ํƒ ๊ฐ€๋Šฅ
  • ๋ถˆ์•ˆ์ •ํ•œ XPath ๋Œ€์‹  ์•ˆ์ •์ ์ธ Locator ์ถ”์ถœ์— ์‚ฌ์šฉ

โœ… [Record] ๋ฒ„ํŠผ

  • ์ง์ ‘ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์ฝ”๋“œ๊ฐ€ ์ž๋™ ์ƒ์„ฑ๋จ
  • ๋ฒ„ํŠผ ํด๋ฆญ → ์›นํŽ˜์ด์ง€์—์„œ ํด๋ฆญ/์ž…๋ ฅ/์ „ํ™˜ ๋“ฑ ์ˆ˜ํ–‰ → Playwright๊ฐ€ click(), fill(), navigate() ๋“ฑ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋กœ ์ž๋™ ๊ธฐ๋ก
  • ๋น„๊ฐœ๋ฐœ์ž QA ํŒ€์›์ด ํ…Œ์ŠคํŠธ ํ๋ฆ„์„ ์ง์ ‘ ๋”ฐ๋ผ๊ฐ€๋ฉด์„œ ์‹œ๋‚˜๋ฆฌ์˜ค ๊ธฐ๋ก ๊ฐ€๋Šฅ
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์„ ์ž๋™ํ™”ํ•˜๊ฑฐ๋‚˜, ์ดˆ์•ˆ์œผ๋กœ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

 

๐Ÿ“Œ ํ•„์ˆ˜ API

๐Ÿ’ก Locator

 

Locators | Playwright

Introduction

playwright.dev

  • page.getByRole()
     ใ„ด ๋ช…์‹œ์  ๋˜๋Š” ์•”์‹œ์ ์ธ ์ ‘๊ทผ์„ฑ ์†์„ฑ(role ๋“ฑ)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์š”์†Œ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•
  • page.getByText()
     ใ„ด ํ…์ŠคํŠธ ๋‚ด์šฉ์„ ๊ธฐ์ค€์œผ๋กœ ์š”์†Œ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•
  • page.getByLabel()
     ใ„ด ์—ฐ๊ด€๋œ label ํ…์ŠคํŠธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ form control ์š”์†Œ(์˜ˆ: input, textarea ๋“ฑ)๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•
  • page.getByPlaceholder()
     ใ„ด placeholder ์†์„ฑ์„ ๊ธฐ์ค€์œผ๋กœ input ์š”์†Œ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•
  • page.getByAltText()
     ใ„ด ๋Œ€์ฒด ํ…์ŠคํŠธ(alt ์†์„ฑ)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์š”์†Œ(์ฃผ๋กœ ์ด๋ฏธ์ง€)๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•
  • page.getByTitle()
     ใ„ด title ์†์„ฑ์„ ๊ธฐ์ค€์œผ๋กœ ์š”์†Œ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•
  • page.getByTestId()
     ใ„ด data-testid ์†์„ฑ(๋˜๋Š” ์„ค์ •ํ•œ ๋‹ค๋ฅธ ์†์„ฑ)์„ ๊ธฐ์ค€์œผ๋กœ ์š”์†Œ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•

 

๐Ÿ’ก Actions

 

Actions | Playwright

Introduction

playwright.dev

  • page.click()
     ใ„ด ์ง€์ •ํ•œ ์…€๋ ‰ํ„ฐ์˜ ์š”์†Œ๋ฅผ ํด๋ฆญํ•˜๋Š” ๋ฐฉ๋ฒ•
  • page.fill()
     ใ„ด input, textarea ๋“ฑ ์ž…๋ ฅ ํ•„๋“œ์— ๋ฌธ์ž์—ด์„ ์ž…๋ ฅํ•˜๋Š” ๋ฐฉ๋ฒ• (๊ธฐ์กด ๊ฐ’์€ ์ž๋™ ์‚ญ์ œ)
  • page.type()
     ใ„ด ํ‚ค๋ณด๋“œ ์ž…๋ ฅ์„ ํ•œ ๊ธ€์ž์”ฉ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ๋ฐฉ๋ฒ• (์ž…๋ ฅ ์†๋„ ์กฐ์ ˆ ๊ฐ€๋Šฅ)
  • page.press()
     ใ„ด ํ‚ค๋ณด๋“œ์˜ ํŠน์ • ํ‚ค(Enter, Tab ๋“ฑ)๋ฅผ ๋ˆ„๋ฅด๋Š” ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • page.check()
     ใ„ด ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์ฒดํฌ ์ƒํƒœ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•
  • page.uncheck()
     ใ„ด ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์ฒดํฌ ํ•ด์ œ ์ƒํƒœ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•
  • page.selectOption()
     ใ„ด `<select>` ์š”์†Œ์—์„œ ํŠน์ • ์˜ต์…˜์„ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•
  • page.focus()
     ใ„ด ํŠน์ • ์š”์†Œ์— ํฌ์ปค์Šค๋ฅผ ์ฃผ๋Š” ๋ฐฉ๋ฒ•
  • page.tap()
     ใ„ด ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ ํ„ฐ์น˜ ์ด๋ฒคํŠธ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • page.dragAndDrop()
     ใ„ด ํ•œ ์š”์†Œ๋ฅผ ๋‹ค๋ฅธ ์š”์†Œ๋กœ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญํ•˜๋Š” ๋ฐฉ๋ฒ•

 

๐Ÿ’ก Events

 

Events | Playwright

Introduction

playwright.dev

  • page.on('request', handler)
     ใ„ด HTTP ์š”์ฒญ ๋ฐœ์ƒ ์‹œ ์‹คํ–‰ํ•  ์ฝœ๋ฐฑ ๋“ฑ๋ก ๋ฐฉ๋ฒ•. 
  • page.on('response', handler)
     ใ„ด ์„œ๋ฒ„ ์‘๋‹ต ์ˆ˜์‹  ์‹œ ์‹คํ–‰ํ•  ์ฝœ๋ฐฑ ๋“ฑ๋ก ๋ฐฉ๋ฒ•.
  • page.on('requestfailed', handler)
     ใ„ด ์š”์ฒญ ์‹คํŒจ ์‹œ ์‹คํ–‰ํ•  ์ฝœ๋ฐฑ ๋“ฑ๋ก ๋ฐฉ๋ฒ•.
  • page.on('dialog', handler)
     ใ„ด alert/prompt/confirm ์ฐฝ ๋ฐœ์ƒ ์‹œ ์ฝœ๋ฐฑ ๋“ฑ๋ก ๋ฐฉ๋ฒ•.
  • page.on('popup', handler)
     ใ„ด ์ƒˆ ์ฐฝ์ด๋‚˜ ํƒญ์ด ์—ด๋ฆด ๋•Œ ์ฝœ๋ฐฑ ๋“ฑ๋ก ๋ฐฉ๋ฒ•.
  • page.on('pageerror', handler)
     ใ„ด JS ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์‹คํ–‰ํ•  ์ฝœ๋ฐฑ ๋“ฑ๋ก ๋ฐฉ๋ฒ•.

 

๐Ÿ’ก Assertions

 

Assertions | Playwright

Introduction

playwright.dev

  • await expect(locator).toBeVisible()
     ใ„ด ์š”์†Œ์˜ ๊ฐ€์‹œ์„ฑ์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•.
  • await expect(locator).toHaveText(textOrRegex)
     ใ„ด ์š”์†Œ๊ฐ€ ํŠน์ • ํ…์ŠคํŠธ๋ฅผ ํฌํ•จํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•.
  • await expect(locator).toHaveAttribute(name, valueOrRegex)
     ใ„ด ์š”์†Œ์˜ ํŠน์ • ์†์„ฑ(attribute) ๊ฐ’์„ ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•.
  • await expect(page).toHaveURL(urlOrRegex)
     ใ„ด ํ˜„์žฌ ํŽ˜์ด์ง€์˜ URL์ด ์˜ˆ์ƒํ•œ ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•.
  • await expect(page).toHaveTitle(titleOrRegex)
     ใ„ด ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ํƒ€์ดํ‹€์ด ์˜ˆ์ƒ๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•.
  • await expect(response).toBeOK()
     ใ„ด ๋„คํŠธ์›Œํฌ ์‘๋‹ต์ด 2xx ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•.

 

๐Ÿ“Œ ํ…Œ์ŠคํŠธ ์ƒ์„ฑ ๊ธฐ๋Šฅ

Playwright์˜ ๊ณต์‹ VS Code ํ™•์žฅ์ธ Playwright Test for VS Code๋ฅผ ์„ค์น˜ํ•˜๋ฉด, ์‚ฌ์ด๋“œ๋ฐ”์— [Record New] ๋ฒ„ํŠผ์ด ์ƒ๊ธด๋‹ค. ์ด ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ƒˆ๋กœ์šด ํ…Œ์ŠคํŠธ ํŒŒ์ผ์ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๊ณ , ๋ธŒ๋ผ์šฐ์ € ์ฐฝ์ด ํ•จ๊ป˜ ์—ด๋ฆฐ๋‹ค. ์ด ์ฐฝ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ณ  ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๋“ฑ, ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“  ๋™์ž‘์ด ์ž๋™์œผ๋กœ ๊ธฐ๋ก๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ™ˆํŽ˜์ด์ง€์— ์ ‘์†ํ•ด ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ณ  ์ž…๋ ฅ์ฐฝ์— ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด, ํ•ด๋‹น ํ–‰๋™์ด ๊ทธ๋Œ€๋กœ Playwright ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋˜์–ด ํ…Œ์ŠคํŠธ ํŒŒ์ผ์— ์ž๋™ ์ž…๋ ฅ๋œ๋‹ค.

 

์ด ์™ธ์—๋„ [Record at cursor] ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด, ์ด๋ฏธ ์ž‘์„ฑ ์ค‘์ธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ์ปค์„œ ์œ„์น˜ ์ดํ›„๋ถ€ํ„ฐ ๋…นํ™”๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์–ด ์ค‘๊ฐ„์— ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ด์–ด์„œ ์ž‘์„ฑํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค. ๋˜ํ•œ [Pick Locator] ๊ธฐ๋Šฅ์€ ์•ž์„œ ์‚ดํŽด๋ณธ ๋””๋ฒ„๊ทธ ๋ชจ๋“œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ํ™”๋ฉด์—์„œ ํŠน์ • ์š”์†Œ๋ฅผ ํด๋ฆญํ•˜๋ฉด ๊ฐ€์žฅ ์ ์ ˆํ•œ locator๋ฅผ ์ž๋™์œผ๋กœ ์ถ”์ถœํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์œผ๋กœ, ์ •ํ™•ํ•˜๊ณ  ์•ˆ์ •์ ์ธ ์š”์†Œ ์„ ํƒ์— ๋งค์šฐ ๋„์›€์ด ๋œ๋‹ค.

 

728x90
์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐Ÿ“‚ Additional > ๐Ÿ“„ Playwright' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Playwright ๊ตฌ์กฐ ๋œฏ์–ด๋ณด๊ธฐ  (11) 2025.11.24
'๐Ÿ“‚ Additional/๐Ÿ“„ Playwright' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • Playwright ๊ตฌ์กฐ ๋œฏ์–ด๋ณด๊ธฐ
YeonSu02
YeonSu02
Email : rkddustn2519@naver.com
  • YeonSu02
    IsLiife2
    YeonSu02
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ
      • ๐Ÿ“‚ Computer Science
      • ๐Ÿ“‚ Unity Engine
        • ๐Ÿ“„ Unity Lecture
        • ๐Ÿ“„ Unity References
        • ๐Ÿ’ป Game Development
      • ๐Ÿ“‚ Quality Assurance
        • ๐Ÿ”ฅ ์—˜๋ฆฌ์Šค SW QAํŠธ๋ž™
        • ๐Ÿ“„ Experience & Insight
        • ๐Ÿ“„ QA References
      • ๐Ÿ“‚ Program Language
        • ๐Ÿ“„ C#
        • ๐Ÿ“„ Python
        • ๐Ÿ“„ JavaScript
        • ๐Ÿ“„ TypeScript
      • ๐Ÿ“‚ Additional
        • ๐Ÿ“„ Docker
        • ๐Ÿ“„ Jenkins
        • ๐Ÿ“„ Playwright
      • ๐Ÿ“‚ Book Review
      • ๐Ÿ“‚ License
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
  • ๋งํฌ

    • GitHub
  • ์ธ๊ธฐ ๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
YeonSu02
์ธํ”„๋Ÿฐ ๊ฐ•์˜ - Playwright ๊ธฐ์ดˆ (๊ธฐ์ดˆ์ ์ธ ํ™œ์šฉ๋ฒ•๊ณผ ํ•ต์‹ฌ ์›๋ฆฌ)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”