Logo
Hyunsu Blog
robot

๐Ÿ“†Published :Jul 15, 2021 โ€ข

๐Ÿ“†Updated :Jul 15, 2021 โ€ข

โ˜•๏ธ4min

๋ธŒ๋ผ์šฐ์ € ํ…Œ์ŠคํŒ… ์ž๋™ํ™”

์ด ๊ธ€์€ ์ œ๊ฐ€ ์ตœ๊ทผ์— ์‹œ์ž‘ํ•œ ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ์— playwright๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด์„œ ๋ธŒ๋ผ์šฐ์ € ํ…Œ์ŠคํŒ…๊ณผ puppeteer, playwright, selenium ์— ๋Œ€ํ•˜์—ฌ ์ ์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.
์ž˜๋ชป๋œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค๋ฉด ๊ผญ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ € ํ…Œ์ŠคํŒ… ์ž๋™ํ™”์˜ ํ•„์š”์„ฑ

์›น ๊ฐœ๋ฐœ์„ ํ•˜๋Š” ๋ฐ ์žˆ์–ด์„œ ํ•ญ์ƒ ๋น ์ง€์ง€ ์•Š๊ณ  ์ƒ๊ฐํ•ด์•ผ ํ•  ๋ถ€๋ถ„ ์ค‘ ํ•˜๋‚˜๊ฐ€ cross-browser compatibility ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Chrome, Safari, Firefox, Edge ๋“ฑ์˜ ๋ธŒ๋ผ์šฐ์ €๋“ค์ด ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ถœ๋ ฅํ•˜์—ฌ ๋‚˜ํƒ€๋‚ด๋ฉด ์ด์ƒ์ ์ด๊ฒ ์ง€๋งŒ, ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ๊ณ ์œ ์˜ ๋ Œ๋”๋ง ์—”์ง„์ด ์žˆ๊ณ  ๋˜ํ•œ ๋ Œ๋”๋ง ์—”์ง„/ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— HTML์„ ๋‹ค๋ฃจ๋Š” ์Šคํƒ€์ผ ๋˜ํ•œ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ™์€ ์†Œ์Šค๋ผ๋„ ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ๊ทธ๋ ค์ง€๊ณ  ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค(cross browsing issue). ์ด๋Ÿฐ ์ด์Šˆ๋Š” ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์˜ ์งˆ์„ ๋‚ฎ์ถ”๋Š” ์˜ํ–ฅ์„ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— E2E ํ…Œ์ŠคํŠธ์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ๋ธŒ๋ผ์šฐ์ € ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ์ฝ”๋“œ๊ฐ€ ํ”„๋กœ๋•์…˜์œผ๋กœ ๋ฐฐ์†ก๋˜๊ธฐ ์ „์— ์˜ค๋ฅ˜๋‚˜ ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ํฌ์ฐฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ๋ธŒ๋ผ์šฐ์ € ๋งˆ๋‹ค ์–ด๋–ค ๋ Œ๋”๋ง ์—”์ง„๋“ค์ด ์žˆ์„๊นŒ์š”?

๋ธŒ๋ผ์šฐ์ €๋žœ๋”๋ง ์—”์ง„์†Œ์œ ๊ถŒ
EdgeEdgeHTML, Blink(2019)EdgeHTML : Microsoft, Blink: Google
ChromeWebkit, Blink( 2013, 4, ๋ฒ„์ „ 28 ์ดํ›„)Blink : Google
SafariWebkitApple
FireFoxGeckoMozilla
OperaWebkitApple

๋ธŒ๋ผ์šฐ์ € ์ž๋™ํ™”์˜ ๊ฐ•์ ์€ ๋งค๋‰ด์–ผ๋กœ ์‹œํ–‰๋  ํ…Œ์ŠคํŒ… ์Šคํ† ๋ฆฌ๋ฅผ ๊ทธ๋Œ€๋กœ ์ž๋™ํ™”๋กœ ์‹คํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.
๋งค๋‰ด์–ผ ํ…Œ์ŠคํŒ…์—์„œ์˜ ํฌํ•จ๋œ ์ผ๋“ค์„ ๋ณด๋ฉด, ๊ฐ ํŠธ๋žœ์žญ์…˜์„ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ๊ฐ ์‹œ๋‚˜๋ฆฌ์˜คํ…Œ์ŠคํŠธ์˜ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ๋ฆฌํฌํŠธ ํ•˜๋ฉฐ, ํผ์ด ์žˆ๋‹ค๋ฉด ํผ์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์Šคํฌ๋ฆฐ์ƒท์œผ๋กœ ์ฐ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ธŒ๋ผ์šฐ์ € ํ…Œ์ŠคํŒ…์„ ์‹ค์ œ ์‚ฌ์šฉ์žํ™˜๊ฒฝ๊ณผ ๋™์ผํ•œ ์กฐ๊ฑด์— ๋งž์ถ”์–ด ์—ฌ๋Ÿฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ํ…Œ์ŠคํŒ…์„ ์‹คํ˜„ํ•˜๊ฒŒ ๋„์™€์ฃผ๋Š” ๊ฒƒ์ด headles browser๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Headless Browser

ํ—ค๋“œ๋ฆฌ์Šค ๋ธŒ๋ผ์šฐ์ €๋Š” GUI(๊ทธ๋ž˜ํ”ฝ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค)๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์›น๋ธŒ๋ผ์šฐ์ €์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—†์ง€๋งŒ ์™„์ „ํ•œ ์›น๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์Šคํฌ๋ฆฝํŠธ๋‚˜ ๋‹ค๋ฅธ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด์„œ ํ™”๋ฉด์—์„œ UI ๋ฐ ๋‹ค์–‘ํ•œ ํ”ฝ์…€์˜ ๋ Œ๋”๋ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ทธ๋ฆฌ๋Š” ์ž‘์—…์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  (์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ์—†์ด) ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋™์ผํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ—ค๋“œ๋ฆฌ์Šค ๋ธŒ๋ผ์šฐ์ €๋Š” GUI๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์•„ ๋ฉ”๋ชจ๋ฆฌ, ์‹œ๊ฐ„ ๋ฐ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋œ ์†Œ๋ชจ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜ ๋ธŒ๋ผ์šฐ์ €๋ณด๋‹ค ๋น ๋ฆ…๋‹ˆ๋‹ค. ๋˜ํ•œ ํ—ค๋“œ๋ฆฌ์Šค ๋ธŒ๋ผ์šฐ์ €๋Š” ์ผ๋ถ€ Linux ๋ฐฐํฌํŒ ๋ฐ ์„œ๋ฒ„์˜ ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ๋ช…๋ น์ค„์„ ํ†ตํ•ด์„œ๋งŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ์Šคํ…œ ๋ฐ ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์›น ํ…Œ์ŠคํŠธ์™€ ์›น ์Šคํฌ๋ž˜ํ•‘์˜ ์šฉ๋„๋กœ ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ข…๋ฅ˜

  • Headless Chrome - Google, Chrome์ง€์›, 59๋ฒ„์ „๋ถ€ํ„ฐ released
  • Headless Firefox - Mozilla, Firefox์ง€์›
  • PanthomJS - released 2011, deprecated since March 2018, ๊ด€๋ฆฌ์ž๊ฐ€ ์ค‘๋‹จ ์„ ์–ธ ์•„์นด์ด๋ธŒ๋จ.
  • HtmlUnit Driver-์ž๋ฐ”๋ฅผ ์ง€์›ํ•˜๋Š” headless ๋ธŒ๋ผ์šฐ์ €
  • Erik -webkit ์ง€์›
  • triflejs

์œ„์—์„œ ์ œ์‹œํ•œ ํ—ค๋“œ๋ฆฌ์Šค ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ตฌ๋™/์ œ์–ด ํ•˜๊ธฐ์œ„ํ•ด์„  cli ๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์“ฐ์—ฌ์ง„ ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ—ค๋“œ๋ฆฌ์Šค ํฌ๋กฌ์„ ์ด์šฉํ•˜์—ฌ ์›นํŽ˜์ด์ง€์—์„œ pdfํŒŒ์ผ๋กœ ์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. (Mac and Linux ( Chrome 59๋ถ€ํ„ฐ ) Windows( Chrome 60 ๋ถ€ํ„ฐ)์˜ ํ™˜๊ฒฝ๋ถ€ํ„ฐ ๊ฐ€๋Šฅ) ์ฐธ๊ณ  ์ž๋ฃŒ : headlessChrome ์„ค์น˜ ๋ฐ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค

  1. cli๋กœ ์ง์ ‘์ ์œผ๋กœ headless browser๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
chrome \ --headless \ # Runs Chrome in headless mode. --disable-gpu \ # Temporarily needed if running on Windows. --remote-debugging-port=9222 \ https://www.chromestatus.com # URL to open. Defaults to about:blank. alias chrome="/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome" alias chrome-canary="/Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary" alias chromium="/Applications/Chromium.app/Contents/MacOS/Chromium"

ํ˜„์žฌ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ PDFํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด,

chrome --headless --disable-gpu --print-to-pdf https://www.chromestatus.com/

ํŒŒ์ผ์€ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

  1. ๋˜๋Š” Puppeteer(Node js library)๋ผ๋Š” ํˆด์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด JavaScript ์–ธ์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ ‘๊ทผ๋ฐฉ์‹๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. Puppeteer๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ํ›„,
const puppeteer = require('puppeteer') ;(async () => { const browser = await puppeteer.launch() const page = await browser.newPage() await page.goto('https://www.chromestatus.com', { waitUntil: 'networkidle2' }) await page.pdf({ path: 'page.pdf', format: 'A4' }) await browser.close() })()
  1. ํ—ค๋“œ๋ฆฌ์Šค ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €๋Š” ๋˜ํ•œ Selenium์ด๋ผ๋Š” ํˆด์„ ํ†ตํ•ด์„œ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. Selenium ์˜ ๊ฒฝ์šฐ WebDriver ๋ฅผ ํ†ตํ•ด์„œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ œ์–ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Selenium WebDriver๋ž€ ๋‹ค์–‘ํ•œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ž๋™ํ™” ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ ์ž…๋‹ˆ๋‹ค.๋” ์ž์„ธํ•œ ์„ค๋ช…์€ ์ด ๋ถ„ ์„ค๋ช…์ด ์ข‹์€๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. WebDriver๋Š” WebDriver JSON Wire Protoco๋ผ๋Š” ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ € (Chrome/Firefox/Safari/IE)์™€ ํ†ต์‹ ํ•˜๊ฑฐ๋‚˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ธŒ๋ผ์šฐ์ €์—๋Š” ์‘์šฉํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๊ฐ๊ฐ์˜ ๋“œ๋ผ์ด๋ฒ„ ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. headless chrome์˜ ๊ฒฝ์šฐ chrome Driver ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. chrome Driver๋ž€ Chromium() ๊ณผ์˜ ํ†ต์‹ ์„ ์œ„ํ•œ WebDriver์˜ ์œ ์„  ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋…๋ฆฝ๋œ ์‹คํ–‰๊ฐ€๋Šฅํ•œ ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค. ์ฐธ๊ณ ์ž๋ฃŒ : stackoverflow: How does chromedriver.exe work on a core and fundamental level

selenium ์—์„œ headlessChrome ์„ค์น˜ ๋ฐ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค

ํ—ค๋“œ๋ฆฌ์Šค ๋ธŒ๋ผ์šฐ์ €๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” API๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ๋ช‡๊ฐ€์ง€ ์ถ”๋ ธ์Šต๋‹ˆ๋‹ค.

  • Selenium
  • Playwright
  • Puppeteer
  • Cypress
  • CasperJS

๋” ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฆฌ์ŠคํŠธ๋Š” ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Selenium

released date: 2004๋…„
์ง€์›์–ธ์–ด : Python, Java, C-Sharp, JavaScript, Ruby, PHP, Perl.
์ง€์› ๋ธŒ๋ผ์šฐ์ € : Chromium/Chrome, Firefox, Edge, Safari,Opera, Internet Explorer

Selenium์€ 2004๋…„๋ถ€ํ„ฐ ๋ฆด๋ฆฌ์ฆˆ ๋˜์—ˆ์œผ๋ฉฐ, ์ง€์›์–ธ์–ด ๋ฐ ์ง€์› ๋Œ€์ƒ ๋ธŒ๋ผ์šฐ์ € ์ธก๋ฉด์—์„œ ๊ฐ€์žฅ ํฌ๊ด„์ ์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ€์žฅ ๋„๋ฆฌ ์•Œ๋ ค์ ธ ์žˆ์œผ๋ฉฐ ๋งŽ์ด ์“ฐ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
์•ž์„œ ์–ธ๊ธ‰ํ•˜์˜€๋“ฏ์ด ๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ €์˜ ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŒ… ํ•˜๋ ค๋ฉด, ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์„ค์น˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Chrome์˜ ๊ฒฝ์šฐ ChromeDriver, Safari๋Š” Safaridriver , Firefox๋Š” Geckodriver ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด WebDriver ์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•  ํ•œ ๊ฐ€์ง€๋Š” ๋ธŒ๋ผ์šฐ์ € ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์„ค์น˜ํ•˜์—ฌ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์— ์„ค๋ช…ํ•  puppeteer๋‚˜ playwright ๋ณด๋‹จ ๋ณต์žก์„ฑ์ด ์กฐ๊ธˆ ์ถ”๊ฐ€๋˜๋Š” ์ผ์ด์ง€๋งŒ ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ๋ธŒ๋ผ์šฐ์ €์™€ ๋‹ค์–‘ํ•œ ๋ฒ„์ „์„ ์ง€์› ํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ธŒ๋ผ์šฐ์ € ๊ฐ„ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
Selenium์€ ํ—ค๋“œ๋ฆฌ์Šค ๋ธŒ๋ผ์šฐ์ € ์ž๋™ํ™”๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. SeleniumWebDriver3 ์ด์ „ ๋ฒ„์ „์—์„œ๋Š” HTMLUnitDriver๋ฅผ ์ด์šฉํ•˜์—ฌ ํ—ค๋“œ๋ฆฌ์Šค ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ด์šฉํ•˜์˜€๊ณ , SeleniumWebDriver3 ์ดํ›„ ๋ถ€ํ„ฐ๋Š” ์‹ค์ œ๋ธŒ๋ผ์šฐ์ €์˜ ํ—ค๋“œ๋ฆฌ์Šค ๋ฒ„์ „๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. GUI๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž๋Š” ํ…Œ์ŠคํŠธ ์‹คํ–‰ ํ™”๋ฉด์„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Puppeteer

Released date : Jan, 2018 ์ง€์› ์–ธ์–ด: JavaScript
์ง€์› ๋ธŒ๋ผ์šฐ์ €: chrome, firefox

์ด๋ฆ„์—์„œ ์œ ์ถ” ํ•  ์ˆ˜ ์žˆ๋“ฏ์ด, ์›นํŽ˜์ด์ง€์—์„œ ์ผ๋ถ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์กฐ์ž‘ํ•˜๋Š” ๊ผญ๋‘๊ฐ์‹œ์ž…๋‹ˆ๋‹ค. Puppeteer๋Š” Selenium์˜ ์ผ๋ถ€ ๋‹จ์ ์— ๋Œ€ํ•œ Google์˜ ๋Œ€์‘์œผ๋กœ์จ Chrome DevToolsํŒ€์˜ ์•„์ด๋””์–ด๋กœ ์ง„ํ–‰๋œ ํ”„๋กœ์ ํŠธ ์ž…๋‹ˆ๋‹ค.

Browser๋ฅผ ์ œ์–ดํ•˜๋Š” ๋ฐฉ์‹์ด ์…€๋ ˆ๋Š„๊ณผ๋Š” ๋‹ค๋ฅธ webdriver๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  DevToolsํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด Chrome ๋˜๋Š” Chromium์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

DevToolsํ”„๋กœํ† ์ฝœ์€ ๋””๋ฒ„๊ทธ, ์ธ์ŠคํŽ™ํŠธ, profile chromiun, Chrome ๊ธฐ๋Šฅ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์˜ˆ๋กœ ํฌ๋กฌ์˜ DevTools๊ฐ€ ์ด ํ”„๋กœํ† ์ฝœ์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์…€๋ ˆ๋Š„๊ณผ ๋ฐ˜ํ•˜๋Š” ์žฅ์ ์œผ๋กœ๋Š” Puppeteer๋ฅผ ์„ค์น˜ํ•  ๋•Œ, Chromium์ด ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์…€๋ ˆ๋Š„์—์„œ์˜ ํ˜ธํ™˜๋˜๋Š” browser driver๋ฅผ ์„ค์น˜/์—…๊ทธ๋ ˆ์ด๋“œ ํ•ด์ค˜์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์„ ์—ฌ๊ธฐ์„  ์ž๋™ํ˜ธํ™˜๋˜๋Š” ๋ธŒ๋ผ์šฐ์ €๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ•ด์ค๋‹ˆ๋‹ค. ์…€๋ ˆ๋Š„์—์„œ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํฌ๋กฌ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ž๋™์œผ๋กœ ์„ค์น˜ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋Ÿฐ ๊ณผ์ • ๋˜ํ•œ Puppeteer์—์„  ๋ถˆํ•„์š”ํ•œ ๊ณผ์ •์ด๋ฏ€๋กœ, Puppeteer๊ฐ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ์— ๋” ์‰ฌ์šด ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€์›๋˜๋Š” ๋ธŒ๋ผ์šฐ์ €๋Š” Chrome์— ๊ตญํ•œ ๋ฉ๋‹ˆ๋‹ค. ์ตœ๊ทผ firefox๋ฅผ ์ง€์›ํ•˜๊ธด ํ–ˆ์ง€๋งŒ, is Puppeteer Firefox ready yet?์„ ์ฐธ๊ณ ํ•˜๋Š”๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ…Œ์ŠคํŒ…์„ ์ง„ํ–‰ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ์ธ์ง€ Puppeteer๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ํˆด๋ณด๋‹ค๋Š” automation ํˆด์— ๋” ๊ฐ€๊น๋‹ค๋Š” ๊ธ€, ์ •๋ณด๋“ค์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์Šคํฌ๋ž˜ํ•‘์ด๋‚˜ pdf๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ์ผ๋“ค์— ๋น ๋ฅธ ์ผ์ฒ˜๋ฆฌ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.

protocol

์ด๋ฏธ์ง€ ๋ฐœ์ทŒ : yogendra.me

Playwright

released date: 31 January 2020
์ง€์› ์–ธ์–ด: JavaScript, TypeScript, Java, Python, C#
์ง€์› ๋ธŒ๋ผ์šฐ์ €: Chrome, Friefox, Safari

Playwright ๊ณผ Puppeteer์€ ์ด๋ฆ„๋„ ๋น„์Šทํ•  ๋ฟ๋”๋Ÿฌ ๊นƒํ—™ ์ปจํŠธ๋ฆฌ๋ทฐํ„ฐ๋ฅผ ๋ณด๋ฉด ์ค‘๋ณต๋˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ์ธ์ง€ ์ œ๊ณต๋˜๋Š” API๊ฐ€ ๊ฑฐ์˜ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๊ธ€์— ์†ํ•ด์žˆ์—ˆ๋˜ pupeteerํŒ€์ด ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ์‚ฌ๋กœ ์ด์งํ–ˆ์Šต๋‹ˆ๋‹ค.TestTalks๋ฅผ ๋‹ค๋ฃจ๋Š” Test Guild์™€ ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ์‚ฌ์˜ Playwright JS team ํ”„๋กœ๊ทธ๋žจ ๋งค๋‹ˆ์ €์ธ Arjun Attam์™€์˜ ์ธํ„ฐ๋ทฐ์—์„œ Playwright๋Š” Puppeteer์™€๋Š” ๋‹ค๋ฅธ ์ฒ ํ•™์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ—ธ์Šต๋‹ˆ๋‹ค. ๊ทธ์˜ ๋ง์— ๋”ฐ๋ฅด๋ฉด์ด ํˆด์€ E2E(End to End) ํ…Œ์ŠคํŠธ์™€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋Š” ๋””๋ฒจ๋กœํผ ๋“ค์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. Playwright ํŒ€์€ ์ข…๋‹จ ๊ฐ„ ํ…Œ์ŠคํŠธ์—์„œ ์—ฌ๋Ÿฌ ๋ธŒ๋ผ์šฐ์ €์˜ ํ…Œ์ŠคํŒ… ์ง€์›์— ๋Œ€ํ•œ ๊ฐญ์„ ๋ฐœ๊ฒฌํ•˜์˜€๊ณ , Chrome, Safari, Firefox๋ฅผ ์ง€์›ํ•˜๊ฒŒ ํ•˜์˜€์Šต๋‹ˆ๋‹ค(Puppeteer์˜ ํ•œ๊ณ„๋ฅผ ๊ฐœ์„ ). ๋‹ค์–‘ํ•œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ง€์›ํ•ด์ฃผ๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ selenium์— ๋น„ํ•ด์„  ๋ธŒ๋ผ์šฐ์ €์˜ ๋‹ค์–‘ํ•œ ๋ฒ„์ „์„ ์ง€์›ํ•˜์ง„ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

Playwright๊ฐ€ puppteer ๋ณด๋‹ค ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์ง€์›๋œ ๋„๊ตฌ๋ž€ ์ ์„ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ๋ฅผ ์ง€์›ํ•˜๋Š” ์ ๊ณผ codeless ํ…Œ์ŠคํŠธ ์ž๋™ํ™”์ž…๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋‹ค ๋ณด๋ฉด ๋ฐ˜๋ณต์ ์ธ ์ผ๋“ค์„ ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ฝ”๋“œ ์—†์ด ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋งž์ถฐ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹œํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋ ˆ์ฝ”๋”ฉ ํ•˜๋ฉด ๊ทธ๊ฒƒ์ด ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ €๋„ ์˜์ƒ์œผ๋กœ๋งŒ ๋ด์„œ ์–ผ๋งˆ๋งŒํผ ์ •ํ™•ํ•˜๊ฒŒ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ• ์ง„ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ •๋ง ์ž˜ ๋œ๋‹ค๋ฉด ์ƒ์‚ฐ์„ฑ์„ ๊ฐ€์†ํ™” ํ•˜๋Š”๋ฐ ํ•œ๋ชซํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ API๋ฅผ ์ง๊ด€์  ๋งŒ๋“ค์–ด ๋‚ฎ์€ ๋Ÿฌ๋‹์ปค๋ธŒ์—๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค. Playwright๋Š” selenium์˜ ์ปค๋ฎค๋‹ˆํ‹ฐ๋ณด๋‹จ ์ž‘์ง€๋งŒ, ๋ฒ„๊ทธ๋‚˜ ์‚ฌ์šฉ์ž๋“ค์˜ ์ด์šฉ ํŽธ์˜์„ฑ์„ ์œ„ํ•ด slack ์ฑ„๋„์—์„œ ๋งค์šฐ ํ™œ๋™์ ์œผ๋กœ ํ™œ๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.(๋ฌผ์–ด๋ณด๋ฉด ๋‹ต๋ณ€์ด ๊ธˆ๋ฐฉ ์˜ต๋‹ˆ๋‹ค!) playwright์€ selenium์˜ ์ปค๋ฎค๋‹ˆํ‹ฐ๋ณด๋‹จ ์ž‘์ง€๋งŒ, ๋ฒ„๊ทธ๋‚˜ ์‚ฌ์šฉ์ž๋“ค์˜ ์ด์šฉ ํŽธ์˜์„ฑ์„ ์œ„ํ•ด slack ์ฑ„๋„์—์„œ ๋งค์šฐ ํ™œ๋™์ ์œผ๋กœ ํ™œ๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.(๋ฌผ์–ด๋ณด๋ฉด ๋‹ต๋ณ€์ด ๊ธˆ๋ฐฉ ์˜ต๋‹ˆ๋‹ค!)

๋‹ค์Œ ๊ธ€์—์„  playwright์˜ ํŠน์ง•๊ณผ ์ฃผ์š” ๊ธฐ๋Šฅ๋“ค์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ

Hi, I'm Hyunsu ๐Ÿ‘‹

Profile Image

์•ˆ๋…•ํ•˜์„ธ์š”. ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ์ฃผํ˜„์ˆ˜์ž…๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ํ’๋ถ€ํ•˜๊ณ  ๊ฐ€์น˜ ์žˆ๋Š” ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š” ์ผ์— ๋ฟŒ๋“ฏํ•จ์„ ๋Š๋‚๋‹ˆ๋‹ค.

์˜ต์‹œ๋””์–ธ(Obsidian)์—์„œ ํ˜„์žฌ ๋ธ”๋กœ๊ทธ๋กœ ํ•˜๋‚˜์”ฉ ๊ธ€์„ ์˜ฎ๊ธฐ๋Š” ๊ณผ์ •์— ์žˆ์–ด์š”. โ˜•๏ธ ๐Ÿ‘ฉโ€๐Ÿ’ป โ›ท

Github on ViewReach Me Out