@zcbenz phantomjs์ ๋์ฒดํ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ํค๋๋ฆฌ์ค ๋ฒ์ ์ atom-shell์ ๋ง๋๋ ๊ฒ์ด ์ผ๋ง๋ ๋ง์ ์์ ์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐ ํ์ญ๋๊น ?
phantomjs๋ ์ค๋๋ ์ค์ ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์ํํ๋ ๊ฒ๋ณด๋ค ์ ์ ๋ ๋ค์ณ์ง๊ณ ์์ผ๋ฉฐ ํค๋๋ฆฌ์ค ํ ์คํธ์ ์ฌ์ฉํ ์ ์๋ ์ต์ ๋ฒ์ ์ด ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
์จ๊ฒจ์ง ๋ธ๋ผ์ฐ์ ์ฐฝ์ ์ฌ์ฉํ์ฌ atom-shell์ ์ค์ ๋ก phantomjs๊ฐ ์ํํ๋ ์์ ์ ์ํํ ์ ์์ผ๋ฉฐ phantomjs ํํ์ด์ง์ ์์ ๋ atom-shell๋ก ๋ฒ์ญ๋ ์ ์์ต๋๋ค.
BrowserWindow = require('browser-window');
console.log('Loading a web page');
var page = new BrowserWindow({show: false});
var url = 'http://www.phantomjs.org/';
page.on('loading-state-changed', (event, isLoading) {
if (!isLoading)
//Page is loaded!
require('app').exit();
});
page.loadUrl(url);
๋ฌผ๋ก ์๋ํ ํ ์คํธ๋ฅผ ์ํด API๋ฅผ ๋ ์ถ๊ฐํด์ผ ํ ์๋ ์์ต๋๋ค.
์ ์ผํ ๋ฌธ์ ๋ ๊ฐ์ ๋ฒํผ์ ๊ทธ๋ฆฌ๋ ๋์ atom-shell์ด โโ์ค์ ๋ก ํ์ด์ง๋ฅผ ์ค์ ์ฐฝ์ ๊ทธ๋ฆฌ๋ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ์ํด์๋ ๊ทธ๋ํฝ ํ๊ฒฝ์ด ํ์ํฉ๋๋ค. Window ๋ฐ OS X์์๋ ์ค์ํ์ง ์์ง๋ง Linux์์๋ xvfb ๋ฅผ ์ฌ์ฉํด์ผ
๋๋ ์ต๊ทผ์ ์ด๊ฒ์ผ๋ก ์ฑ๊ณตํ์ต๋๋ค(Ubuntu ์๋ฒ์์ Xvfb ์ฌ์ฉ). ๋ด ์ฌ์ฉ ์ฌ๋ก๋ ํ ํ๋ฆฟ ํ์ด์ง์ ์คํฌ๋ฆฐ์ท์ ์บก์ฒํ๋ ๊ฒ์ ๋๋ค. ์ฌ์ค, ๋๋ ์๋ฒ(m3-large)์์ Xvfb๋ฅผ ํตํ atom-shell์ด โโ๋ด ๋ก์ปฌ Macbook pro๋ณด๋ค ๋ ๋์ ์ฑ๋ฅ์ ๊ฐ๋๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ด๋ก ์ธํด osx์์๋ Xvfb๋ฅผ ํตํด ์๋ํ๋ atom-shell์ด โโํ์ํ์ต๋๋ค.
osx๋ Xvfb์ ํจ๊ป ์ ๊ณต๋๊ธฐ ๋๋ฌธ์ ๊ทธ ๋ถ๋ถ์ ์ฝ์ต๋๋ค. osx์์ Xvfb ๋์คํ๋ ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด atom-shell์ ์ป์ ์ ์์ต๋๊น? Linux์์์ ๊ฐ์ด ํ์ค DISPLAY
env ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ํ์ง ์์ต๋๋ค. ์๋ง๋ libchromiumcontent๋ Darwin์์ ์คํํ ๋ X11์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅผ ๊ฒ์
๋๊น?
Xvfb๋ X11 ํ๊ฒฝ์ฉ์ผ๋ก ์์ฑ๋ ์์ฉ ํ๋ก๊ทธ๋จ์์๋ง ์๋ํฉ๋๋ค. OS X์์ atom-shell์ ํ์๋ฅผ ์ํด Cocoa๋ฅผ ์ฌ์ฉํฉ๋๋ค. Xvfb์์๋ ์๋ํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋, ์ข ๊ฐ์ด ๋ฃ์ด. ์๋ง๋ ๋์ X11์ฉ ์์ค์์ ์ปดํ์ผํ๋ ๋ฐฉ๋ฒ์ด ์๋ ๊ฒ์ ๋๋ค.
@zcbenz new BrowserWindow({show: false});
๋ฅผ ์ฌ์ฉํ๋๋ผ๋ OS X์ ํ์ฌ ํด์๋๋ณด๋ค ํฐ BrowserWindow
๋ฅผ ์์ฑํ๋ ๊ฒ์ ํ์ฌ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
@FWeinb ์์ ํน์ ํฐ์ผ์ ๋ณ๋๋ก ์ด ์ ์์ต๋๊น?
๋ง๋ #475
์ค์ ๋ก Chromium์์ ๊ธฐ๋ณธ ์์ ฏ์ ์์ฑํ์ง ์๊ณ ๋ ํ์ด์ง๋ฅผ ๊ทธ๋ฆด ์ ์๋ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ ์ด ๊ธ์ ๋ซ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ ๊ทธ๋ค์ด ๊ทธ๊ฒ์ ํ์ฉํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์๋ ํ ์คํธ์ ๊ฒฝ์ฐ Selenium์ ์ง์ํฉ๋๋ค.
CEF ํ๋ก์ ํธ๋ ์คํ์คํฌ๋ฆฐ ๋ ๋๋ง์ ์ง์ํ๋ฏ๋ก ์ฐฝ ๋์ ๋ฒํผ์ ํ๋ฉด์ ๊ทธ๋ฆด ์ ์์ต๋๋ค. Linux์ฉ X ์๋ฒ์ ๊ด๋ จํ์ฌ Ozone์ด๋ผ๋ ๋์์ ์ถ๊ฐํ์ฌ X ์๋ฒ ์์ด๋ ์์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค( ์ฌ๊ธฐ์์ ๋ ผ์
@etiktin ์ ๋ณด ๊ฐ์ฌํฉ๋๋ค! ๊ทธ๊ฒ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ธฐ์กด ๊ตฌํ์ด ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ค์ ์ฝ๋๋ค.
์ฐ๋ฆฌ๋ ์ด์ ๋ํ ์ง์์ ์ ๋ง๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ต๊ทผ์ Nightmare ์์ Phantom์ Electron์ผ๋ก ๊ต์ฒดํ๊ณ ์ง๊ธ๊น์ง ๊ทธ๊ฒ์ ์ข์ํ์ง๋ง Linux์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ํ์ง ์์ต๋๋ค.
์๋ํ๋ ค๋ฉด ์ง๊ธ ํด์ผ ํ ์ผ์ด ๋ค์๊ณผ ๊ฐ์ต๋๋ค. https://github.com/segmentio/nightmare/issues/224#issuecomment -141575361
๋ ๋ฆฝ ์คํํ ๋ฐ์คํฌํฑ Electron ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๋ณํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ค ํ๋์ ๋ํ ์ฌ์ฉ์ ํ๋์ ์๋ํํ๋ ์์ ์ ๋ฐ์์ต๋๋ค. ์ฐ๋ฆฌ ํ์ฌ๊ฐ ์ด๋ฌํ ์ด๋์ ๊ฒฐ์ ํ๊ธฐ ์ ์ ํฌ๋กฌ ์น ๋๋ผ์ด๋ฒ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด์ง ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ CSS ์ ํ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒํผ/๋๋กญ๋ค์ด/ํ ์คํธ ์์๋ฅผ ํธ์ถํ์ฌ ์น ์์ฉ ํ๋ก๊ทธ๋จ๊ณผ ์ํธ ์์ฉํ์ต๋๋ค. Electron ์ ธ๋ก ๋ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์ด ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ํ์ฌ๋ ํน์ ๊ธฐ๋ฅ์ ํธ์ถํ๊ธฐ ์ํด ๋ฉ๋ด ๋ชจ์ ์ต์ ์ ์ฌ์ฉํ ๊ณํ์ด๋ฉฐ JavaScript ๋๋ผ์ด๋ฒ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ/ํธ์ง/๋์๋ง๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ๋ฉ๋ด ๋ชจ์ ์ต์ ์ ์ก์ธ์คํ๋ ค๊ณ ์๋ํ์ง๋ง ์ฑ๊ณตํ์ง ๋ชปํ์ต๋๋ค. ์ด ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ ๊ฐ ์์ต๋๊น?
https://github.com/segmentio/nightmare/issues/224#issuecomment -141575361๋ @matthewmueller์ Linux์์ ์ํ์ ๋ํซ์ ๋ณด์ธ๋ค : +1 :
SuSE์์ ํค๋๋ฆฌ์ค ํ ์คํธ๋ฅผ ๋ฐ์ ์ฌ๋์ด ์์ต๋๊น? ํนํ SLES?
@fritx SlimerJS์ ์ฌ์ฉ๋๋ ๊ฒ๊ณผ ๋์ผํ์ง๋ง ํค๋๋ฆฌ์ค ๋ชจ๋๊ฐ ์๋๋๋ค.
@fritx ๊ทธ๊ฒ์ด @zcbenz ๊ฐ ๋งํ ๊ฒ์
๋๋ค. Xvfb๋ฅผ ์คํํด์ผ ํฉ๋๋ค. CEF3์ Chromium Content Shell์ ํ์ฌ Xlib์ ์์กดํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ค์กด ์๋ฃ์ ํจ๊ป: https://www.chromium.org/developers/design-documents/ozone
๋ฎ์ ์์ค์ I/O๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
๋ถ๋ช ํ Chromium ์์ฒด์ ๋ง์คํฐ ๋ฒ๊ทธ๊ฐ ์์ต๋๋ค. https://code.google.com/p/chromium/issues/detail?id=546953
์ด๊ฑด ์ฌ๋ฏธ ์๋ค:
๋ ์ง: 2015๋ 12์ 2์ผ ์์์ผ 15:35:21
[headless] headless/public/์ ์ด๊ธฐ ์ค์ผ๋ ํค
ํฅํ Headless API์ ๊ฐ์๋ฅผ ์์ฑํฉ๋๋ค.
ChromeDriver๋ ์ ์์ ํจ๊ป ์๋ํฉ๋๊น?
xvfb๊ฐ ํ์ํ์ง ์์ ํค๋๋ฆฌ์ค ๋ฐ์ด๋๋ฆฌ๋ AWS Lambda ์ ๊ฐ์ ์๋ก์ด ํ๊ฒฝ์ ์ด ์ ์์ต๋๋ค. ๊ฐ์ ํ์ญ์์ค!
@Vanuan ๋์ดํธ๋ฉ์ด ๋ผ๊ณ ๋ค์ด๋ณด์ จ๋์? ChromeDriver์์ ํน๋ณํ ํ์ํ ๊ฒ์ด ์๋ ๊ฒฝ์ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
Capybara/Selenium ๋๋ผ์ด๋ฒ๊ฐ ์์ต๋๊น?
+1
์กฐ๊ธ ํผ๋์ค๋ฝ์ต๋๋ค. ํค๋๋ฆฌ์ค ๋ชจ๋๊ฐ ์์ต๋๊น? BrowserWindow({show: false})๋ก ์ด๊ฒ์ ํจ๊ณผ์ ์ผ๋ก ํ ์ ์์ต๋๊น? ์ด๊ฒ์ ๋์๊ฒ ๋งค์ฐ ์ ์ฉํ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์๋ฒ ์ธก ์น ๊ตฌ์ฑ ์์๋ฅผ ์์ฑํ ์ ์๋๋ก ์๋์ํค๋ ค๊ณ ํฉ๋๋ค: https://github.com/scramjs/scram-markup-engine
์ฃผ์๋ฅผ ๋๋ฌ๋ณด๋ฉด์ ๋ด ์์ ์ ์ง๋ฌธ์ ๋ตํ ๊ฒ ๊ฐ์์. Electron์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ตํ ํค๋๋ฆฌ์ค ๋ชจ๋๋ฅผ ์ง์ํ์ง ์์ต๋๋ค. Nightmare๋ ์ด์ ์ ์ฌํ ๊ฒ์ ํ์ฉํ๋ ๊ฒ์ผ๋ก ๋ณด์ด์ง๋ง ๊ทธ๋ํฝ ํ๊ฒฝ์ด ์๋ ํน์ ์์คํ ์์ ์๋ํ๋ ค๋ฉด ์ผ๋ถ ๊ตฌ์ฑ์ ์ํํด์ผ ํฉ๋๋ค. Electron์ BrowserWindow({show: false})๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ์ด๋ฅผ ์ํํ ์ ์์ง๋ง ํค๋๋ฆฌ์ค Linux ์์คํ ์์ ๊ทธ๋ํฝ ํ๊ฒฝ์ ์ ๊ณตํ๋ ค๋ฉด xvfb๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค(์ค์ ๋ก ๊ทธ๋ ๊ฒ ๋์์ง๋ ์์ต๋๋ค). ๋ด๊ฐ ํ๋ ธ๋ค๋ฉด ์ ์ ํ๊ณ ์ด ๊ธฐ๋ฅ์ +1ํ์ญ์์ค.
์๋ก์ด ํฌ๋กฌ ํค๋๋ฆฌ์ค ํ๋ก์ ํธ[1]๋ก xvfb๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ ์ ํค๋๋ฆฌ์ค๋ฅผ ๋ง๋๋ ๊ฒ์ด ๊ฐ๋ฅํ ๊น์?
ํ์ฌ ์ ํ ์ฌํญ์ด libchromium์ ์๋ค๊ณ ์๊ฐํฉ๋๊น? ํฌ๋กฌ ์น๊ตฌ๋ค์ด ๊ณ ์ณค๋์?
1: https://chromium.googlesource.com/chromium/src/+/master/headless/README.md
๊ด๋ จ ํฌ๋ผ์ด ์์ต๋๋ค: https://groups.google.com/a/chromium.org/forum/#!forum/headless -dev
์ด์ ๋ํ ์ง์ ์ด ์์ต๋๊น? ์ด๊ฒ์ ํ ์คํธ์ ์ ๋ง ์ ์ฉํ ๊ฒ์ ๋๋ค.
segmentio/nightmare ๋ ์ด์ ์ ํฉํฉ๋๋ค. ๊ฐ๋จํ:
const nightmare = Nightmare({
show: true
});
@amilajack ๋จธ๋ฆฌ ์์ด ๊ฐ๋จํ Mocha ๋จ์ ํ ์คํธ๋ฅผ ์คํํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฐ๋จํ ๊ฒฝ์ฐ Nightmare๋ 20ํ์ด๋ ํฐ ๋ง์น๋ฅผ ์ฌ์ฉํ์ฌ ์์ ๋ชป์ ๋ฐ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค(์ฝ๊ธฐ: ์์ฒญ๋ ๊ณผ์). ๊ธฐ๋ณธ ํ์ ๋ฐ ์ ๋ ฅ์ ์ํํ ์ ์์ ๋ฟ๋ง ์๋๋ผ HTML ๋ฐ PDF ํ์ผ์ ๋์คํฌ์ ์ ์ฅํ๊ฑฐ๋ ์คํฌ๋ฆฐ์ท์ ์ฐ์ ์ ์๋ ๋ธ๋ผ์ฐ์ ์๋ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํฌํจ๋ ๋ณธ๊ฒฉ์ ์ธ ๋ฐฐํฐ๋ฆฌ์ ๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ํํ 0%๋ ๊ฐ๋จํ ๋จ์ ํ ์คํธ๋ฅผ ์คํํ๋ ๋ฐ ํ์ํฉ๋๋ค.
@isiahmeadows @mcolyer ๋ ๋์ฒดํ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ํค๋๋ฆฌ์ค ๋ฒ์ ์ atom-shell์ ์ํ๋ค๊ณ ๋งํ์ต๋๋ค. Electron์ ์ถ๊ฐ ๊ธฐ๋ฅ์ด ์๋ ๊ฒ๊ณผ ๊ฑฐ์ ๊ฐ์ต๋๋ค.
์, ํ์ง๋ง ์ฌ์ฉํ์ง ์๋ ์คํ์ด ์ ํ์ํ๊ฐ์? (๋๋ ๋ชจ๋ ์คํ์ ์ธ๊ธํ๊ณ ์์์ต๋๋ค. ์ด๋ก ์ ์ผ๋ก ๋ฐ๋๋ผ ๋ ธ๋ + OpenGL ๋ฐ์ธ๋ฉ์ผ๋ก Electron์ ์์ ํ ๋ค์ ๊ตฌํํ ์ ์์ต๋๋ค).
ํค๋๋ฆฌ์ค ๋ธ๋ผ์ฐ์ ์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ CLI์์ ๋ธ๋ผ์ฐ์ ๋จ์ ํ ์คํธ๋ฅผ ์คํํ๊ธฐ ์ํด ์ด๋ฏธ mocha-phantomjs ๋ฐ Karma๊ฐ ์กด์ฌํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฒ์ ๋๋ค. ๋๋ถ๋ถ์ ์ฌ๋๋ค์ Firefox/Chrome์ ํ ์คํธํด์ผ ํ๋ ๊ฒฝ์ฐ Travis์์ ํค๋๋ฆฌ์ค X ์๋ฒ์ธ xvfb๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์คํ ์ค์ธ X ์๋ฒ๊ฐ ์๊ธฐ ๋๋ฌธ์ Electron์ ์คํํ ์๋ ์์ง๋ง PhantomJS ๋ฐ SlimerJS์ ๊ฐ์ ํค๋๋ฆฌ์ค ๋ธ๋ผ์ฐ์ ๋ ' X ์๋ฒ๊ฐ ํ์ํฉ๋๋ค. Electron + Nightmare๋ ์คํํ๊ธฐ ์ํด ์ด๋ค ์ข ๋ฅ์ X ์๋ฒ๊ฐ ํ์ํ๋ฉฐ(xvfb์ผ์ง๋ผ๋) ์ด ๋ฌธ์ ๋ ํด๋น ์ข ์์ฑ์ ์ ๊ฑฐํ๋๋ก ์์ฒญํ์ง๋ง Chromium ์์ฒด๊ฐ ํค๋๋ฆฌ์ค๊ฐ ๋๊ณ ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ด ์ ํ๋ ๋๊น์ง๋ ๋ฐ์ํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค. libchromiumcontent .
ํค๋๋ฆฌ์ค๋ ์ด์ Chrome 59์ ์์ต๋๋ค. https://www.chromestatus.com/features/5678767817097216
@sindresorhus @zcbenz Chromium์ ์ด ๋ณ๊ฒฝ ์ฌํญ์ด ์ฌ๊ธฐ์ ์ด๋ค ์ฐจ์ด๋ฅผ ๋ง๋ค๊น์?
Electron์ ์ด๋ฏธ ํ๋ฅญํ๊ณ ํค๋๋ฆฌ์ค ๋ชจ๋๋ ๋ ๋์์ง ๊ฒ์ ๋๋ค!
(Electron ๊ธฐ๋ฐ์ Nightmare ์๋
๋๋ค ๊ธฐ๋ฐ ํ
์คํธ์ ๋์์ด ๋ ์ ์๋ ๋๋ค์์ Xvfb
์์
์ ํ ์ ์์์ต๋๋ค... https://github.com/nisaacson/aws-lambda-xvfb
Electron์ด ์ธ์ ์ง์ ํ ํค๋๋ฆฌ์ค๋ฅผ ์ง์ํ ๊ฒ์ธ์ง์ ๋ํ ๋ง์์ด ์์ต๋๊น? ์ฐ๋ฆฌ๋ ์ด๊ฒ์ด ์ผ์ด๋ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ ์ ์์ต๋๊น? xvfb๋ฅผ ์ญ์ ํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆด ์ ์์ต๋๋ค.
@lastmjs xvfb๋ฅผ ๊ธฐ๋ฐ์ผ๋ก AWS Lambda์์ Electron์ ์คํํ ์ ์์์ต๋๊น?
@schickling ์ฐธ์กฐ https://github.com/nisaacson/aws-lambda-xvfb
@MrSaints์ ์๊ฒฌ์ ๋ณด๋ด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. nightmare
๋ฅผ ์คํํ ์ ์๊ธฐ ๋๋ฌธ์ ์ง๊ธ ๋ช ์๊ฐ ๋์ ์ด ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๋๋ฒ๊น
ํ๊ณ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋น์ ์ ์ํด ์๋ํฉ๋๊น?
@zcbenz FYI chrome 59๋ ํค๋๋ฆฌ์ค ๋ชจ๋๋ฅผ ์ง์ํฉ๋๋ค. https://www.chromestatus.com/features/5678767817097216
@schickling ์ฐธ์กฐ https://github.com/JohannesHoppe/nightmare-html2pdf -- Xvfb๋ฅผ ์ฌ์ฉํ ๋์ปค์ ์ ๋ชฝ
@JohannesHoppe ๊ฐ์ฌํฉ๋๋ค. Xvfb๋ฅผ ์ฌ์ฉํ์ฌ Docker์์ Nightmare๋ฅผ ์๋ํ๊ฒ ํ์ง๋ง ๋์ AWS Lambda์์ ์คํํ๊ณ ์ถ์ต๋๋ค.
๋๋ Nightmare์์ Electron์ ํค๋๋ฆฌ์ค ํฌ๋กฌ์ผ๋ก ๊ต์ฒดํ๋ ๋ฌธ์ ๋ฅผ ์ด์์ต๋๋ค: https://github.com/segmentio/nightmare/issues/1092
@schickling ์ด๊ฒ์ ์๋ํ์ญ์์ค: https://github.com/dimkir/nightmare-lambda-tutorial
์ด๊ฒ์ด ๋ค๋ฅธ ๊ณณ์์ ๋ต๋ณ ๋ ๊ฒฝ์ฐ ์ฌ๊ณผํ์ง๋ง ๊ตฌ์ฒด์ ์ธ ๋ต๋ณ์ ์ฐพ์ ์ ์์ต๋๋ค. ์์ +1 ๋๊ธ ์์ @sandstrom ์ ์ด์ Chrome 59์์ ํค๋๋ฆฌ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ์ง์ ํ์ต๋๋ค.
Electron์ ๊ฐ๋ฐ ๋ก๋๋งต์์ Chrome์ ํค๋๋ฆฌ์ค ํ๋๊ทธ์ ๋ํ ์ง์์ด ์์ต๋๊น? ์ด๊ฒ์ ์ง์ ํ ํค๋๋ฆฌ์ค ์ฌ์ฉ์ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ๋๋ฌธ์ Electron์๊ฒ ์ ์ฌ์ ์ผ๋ก ํฐ "์น๋ฆฌ"์ธ ๊ฒ ๊ฐ์ต๋๋ค.
@rinogo๋ ๋ง์์ ๋์ํฉ๋๋ค. ์ ์์ ๋ํ ํค๋๋ฆฌ์ค ์ต์ ์ด ์์ผ๋ฉด ๊ฐ์ ๋์คํ๋ ์ด๊ฐ ํ์ํ์ง ์๊ณ ์์คํ ์ ์ธ์ํ์ง ์๊ณ ๋ ci ์์คํ ๋ฐ ๊ฐ๋ฐ ์์์์ ํ ์คํธ๋ฅผ ์คํํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ๋๋ ๋ํ ์ ์์ ๋ํ ๋ก๋๋งต์ ์๊ณ ๊ธฐ์ฌํ๊ณ ์ถ์ต๋๋ค.
Xvfb๋ ์ง์ฆ๋์ง๋ง Electron์ด ์ง์ ํ ํค๋๋ฆฌ์ค๋ฅผ ์ง์ํ๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค!
xvfb-์๋ง๋ ๊ทธ ๋์
Google์์ ์ ๊ธฐ์ฌ๊ฐ ์์ต๋๋ค. https://developers.google.com/web/updates/2017/04/headless-chrome
๊ณง ์ถ์๋ ์์ ์ ๋๋ค.
Chrome 59๊ฐ ํ์ฌ ์์ ์ ์ธ ์ฑ๋์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. Electron์์ ํค๋๋ฆฌ์ค๋ฅผ ์ง์ํ๊ธฐ ์ํ ๋ค์ ๋จ๊ณ๋ ๋ฌด์์ ๋๊น?
์ ๋ฐ, ์ด๊ฒ์ ํ์ค๋ก ๋ง๋์ญ์์ค. ์ด ์์ ์ ์ํํ๊ณ NightmareJS๊ฐ ํค๋๋ฆฌ์ค Electron์ ์คํํ๋๋ก ํ๋ฉด ๊ถ๊ทน์ ์ผ๋ก ๋ชจ๋ Selenium ์ฌ์ฉ ์ฌ๋ก์ 3๋ถ์ 1 ์ ๋๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค.*
* ๊ณผ์ฅ๋์ง๋ง ์ค์ ๋ก๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
@aendrew ์ ๋ NightmareJS๊ฐ Electron(์ฒ ํ: _ํฌ๋ก์ค ํ๋ซํผ ๋ฐ์คํฌํ ์ฑ ๋น๋ _)์ ํค๋๋ฆฌ์ค๋ก ๋ง๋๋ ๊ฒ๋ณด๋ค ์คํ๋ ค CDP ๋ฐฑ์๋๋ฅผ ์ฌ์ฉ/ํฌํจํ๋๋ก _์ฌ์์ฑ_ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฐธ์กฐ: https://github.com/cyrus-and/chrome-remote-interface
@MrSaints ๋๋ ๊ด๋ฆฌ์๋ฅผ ๋ถ๋ฌ์ํ์ง ์์ต๋๋ค. ๊ทธ๋ค์ _๊ทธ๋ฅ_ 1๋ ์ ์ PhantomJS์์ ๋ณํ์ ์๋ฃํ์ต๋๋ค. ์ด์จ๋ Nightmare์ ๋ธ๋ผ์ฐ์ ๋ ์ด์ด๋ฅผ ํ๋ฌ๊ทธํ์ผ๋ก ๋ง๋๋ ๊ฒ์ด ์ข์ ๋๊ธฐ๊ฐ ๋ ์ ์์ต๋๋ค.
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ Electron์ด ๋ฐ์คํฌํ ์งํฅ์ ์ด๋ผ๋ ์ ์ ์ ๋ฐ์๋ค์ฌ์ก์ต๋๋ค.
@aendrew @MrSaints ๋ด ๋ฌด์ง๋ฅผ headless
ํ๋๊ทธ ์ง์)์ ๊ตฌํํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ด๋ ต์ต๋๊น? Electron์ด Chromium๊ณผ ์ธํฐํ์ด์ค/ํ์ฅํ๋ ๋ฐฉ๋ฒ์ ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ด๋ฅผ ๊ตฌํํ๋ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
headless
๋ช
๋ น์ค ํ๋๊ทธ/๊ตฌ์ฑ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๊ณตํฉ๋๋ค.๋ด ๋ง์ headless
์ด์ Chromium์์ ์ฌ์ฉ ๊ฐ๋ฅํ์ฌ ํค๋๋ฆฌ์ค ๋ชจ๋(์: NightmareJS์ฉ)๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด ๋น๊ต์ ๊ฐ๋จํด ๋ณด์ธ๋ค๋ ๊ฒ์
๋๋ค. ๋ฌผ๋ก , Electron์ ๋ฒ์ฉ ๋ฒ์ ์ ํน์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ NightmareJS์ ๊ฐ์ ๊ฒ์ ์ํด ์ค๊ณ๋ ๋น๋๋ฅผ ์์ฑํ๋ ค๋ฉด ๋งค์ฐ ๊ฐ๋จํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ฃ ?
์๋ ํฅ์์ด ๋น์ฅ ํ์ํ๋ค๋ฉด ๋ฐ์ด๋ค์ด์ ์๋ํด ๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ฌ์ ํ NightmareJS๋ฅผ ์๋ ๊ทธ๋๋ก ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก ๋น๋ถ๊ฐ์ ๊ด์ฐฎ์ต๋๋ค.
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ , ์ด๋ฌํ ๋ชจ๋ ํ๋ก์ ํธ์ ์ ์ง ๊ด๋ฆฌ์์ ๊ธฐ์ฌ์ ๋ ธ๋ ฅ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! :)
NightmareJS ๊ด๋ จ: ์ฐ๋ฆฌ๋ ํ์ฌ AWS Lambda์ ๊ฐ์ ์๋ฒ๋ฆฌ์ค ํ๊ฒฝ์์๋ ์คํํ ์ ์๋ ํค๋๋ฆฌ์ค Chrome ๊ธฐ๋ฐ์ Nightmare ๋ฒ์ ์ ์์ ์ค์ ๋๋ค. ๊ณง @graphcool์์ ์์ค๋ฅผ ๊ณต๊ฐํ ์์ ์ ๋๋ค. ๐
@schickling ๊ต์ฅํ ๊ฑฐ์ผ!
ํฌ๋กฌ์ --headless
์์ ๋ช
์ฌํด์ผ ํ ํ ๊ฐ์ง๋ ๋ชจ๋ ํ๋ฌ๊ทธ์ธ์ ๋ํ ์ง์์ ๋นํ์ฑํํ๋ค๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ํ๋์(์ ์/์
๋ชฝ์ผ๋ก ์ํ ๊ฐ๋ฅ) ๋๋ PDF ๋ทฐ์ด ๋ฑ์ด ํ์ํ ๊ฒฝ์ฐ --headless
๋ ์ ํฉํ์ง ์์ผ๋ฉฐ xvfb๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ๊ฒ์
๋๋ค.
AWS Lambda์์ Electron์ ์คํํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆด ์ ์์ต๋๋ค...์ ์๊ฐ์๋
์๋ฉ @lastmjs ์๋ฉ
์ด ์๋ฃจ์
์ ์ด๋ป์ต๋๊น?
https://github.com/dimkir/nightmare-lambda-tutorial
์์ง ์๋ํ์ง ์์์ง๋ง
@xplodedthemes ๋
๋ป๋ปํ ํ๋ฌ๊ทธ: https://github.com/joelgriffith/navalia. ๊ธฐ๋ฅ ํ ์คํธ ๋ฑ์ ์ํด ํค๋๋ฆฌ์ค Chrome์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋์์ต๋๋ค. ์ฌ๋ฌ ์์ ๋ณ๋ ฌํ, GraphQL ํ๋ฐํธ ์๋ ๋ฑ๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ๋ฉ์ง ๊ธฐ๋ฅ์ด ํฌํจ๋์ด ์์ต๋๋ค.
์ด๋ค PR/์ด์/ํผ๋๋ฐฑ๋ ํ์ํฉ๋๋ค!
์๋ ๋ชจ๋๋ค! ๊ธฐ๋ค๋ฆฌ๊ฒ ํด์ ์ฃ์กํฉ๋๋ค... ๐ค
์ฐ๋ฆฌ๋ Chromeless๋ฅผ ์คํ์์คํํ์ต๋๋ค. ํค๋๋ฆฌ์ค Chrome์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ ๋ก์ปฌ ๋ฐ AWS Lambda ๋ชจ๋์์ ์๋ํฉ๋๋ค. API๋ NightmareJS์ ๋งค์ฐ ์ ์ฌํฉ๋๋ค.
์ฌ๊ธฐ์์ ์ฌ์ฉํด ๋ณผ ์ ์์ต๋๋ค: https://chromeless.netlify.com
Chromeless๊ฐ ๋ฐฉ๊ธ Nightmare๋ฅผ ๋์ฒดํ์ต๋๊น? Chromeless๋ Nightmare๋ฅผ ๋ฐ๋ผ์ก๊ธฐ๊น์ง ๊ฐ ๊ธธ์ด ๋ฉ๋๋ค.
๋์์ ์ฌ๋ฌ ํ ์คํธ๋ฅผ ์คํํ ์ ์๋ ๊ธฐ๋ฅ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ Nightmare์ ๋์ฒดํ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
์ง๋ฌธ(์ด ์ค๋ ๋์๋ ์ ํฉํ์ง ์์ ์ ์์): pdf ๊ธฐ๋ฅ์ ์๋์ํค๋ ๊ฒ์ ๊ณ ๋ คํ๊ณ ์์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด ์์ฒญ๋ ๋ํต(๋ฐ ๋น์ฉ)์ ์ ์ฝํ ์ ์์ต๋๋ค.
์, ์ ๋ง ๋๋๋ค์. ์ํ์ด ์๋ค์!
@zcbenz ์ด์ ๋ํ ์๋ฃจ์ ์ด ๋์จ ๊ฒ ๊ฐ์ต๋๋ค. ๋ซ์๋ ๋ ๊น์?
์ ์ด ๋ฌธ์ ๋ ์ฌ์ ํ ๋งค์ฐ ์ ํจํฉ๋๋ค. "ํด๊ฒฐ์ฑ "์ ๋ชจ๋ ์ ๋ชฝ์์ ์์ ํ ๋ฒ์ด๋๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
@keithkml์ ์์ ํ ๋์ํ์ต๋๋ค. ์๋ฃจ์ ์ ๋น๋ก ์๋๋ ์ข์์ง๋ง(๊ฐ์ฌํฉ๋๋ค!) ์ค์ ์๋ฃจ์ ์ด ์ ๊ณต๋ ๋๊น์ง "๋์"์ ๋ ์ด์ ์๊ฒฌ ์์ ์ ๊ธฐํ ์ง๋ฌธ์ ๋ต๋ณํ ์ ์๋ ์ถฉ๋ถํ ์ ๋ฌธ ์ง์์ ๊ฐ์ง๊ณ ์์ต๋๊น? (๊ทธ๋ฆฌ๊ณ ๋ค์, ๋์ ๋ฌด์ง๋ฅผ ์ฉ์ํ์ญ์์ค! :))
๋๋ ์ฌ์ ํ ๋๋ต์ ์์ ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์ ์ ์ฑ์ CI์์ ์คํํ ์ ์๋ NATIVE ํค๋๋ฆฌ์ค ๋ชจ๋๊ฐ ์๋์ง ๋๊ฐ ๋์๊ฒ ๋ช ํํ ์๋ ค์ฃผ์๊ฒ ์ต๋๊น?
@hitliubo Chrome์๋ --headless
ํ๋๊ทธ๊ฐ ์์ง๋ง Flash ๋๋ PDF ๋ฆฌ๋์ ๊ฐ์ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ์๋ง ์๋ํฉ๋๋ค. ๋น์ ์ด ์ธ ๊ฒฝ์ฐ ๋๋ต์ ํ์ฌ ๊ธ์ ์ ์ธ ์๋์ค์
๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ์ปจํ
์คํธ๋ฅผ ์์ฑํ ๋ ํด๋น ํ๋๊ทธ(ํ์ํ ๊ฒฝ์ฐ --disable-gpu
์ ํจ๊ป - ์ต์ Chrome ๋ฒ์ IIRC์์ ๋๋ฝ๋ ์๋ฏธ๋ฅผ ์์ ํจ)๋ฅผ ์ ๋ฌํ๊ณ ์๋ํ๋์ง ํ์ธํ ์ ์์ต๋๋ค. (๋ง์ฝ ๋น์ ์ด Nightmare์ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ๊ณ ์๊ณ ๋น์ ์ด ๋ ๋ฒ์งธ ๋ฒ์ฃผ์ ์ํ๋ค๋ฉด, ๋น์ ์ ์ด๋ฏธ ๋ฌธ์ ๊ฐ ์๋ค๋ฉด ๊ทธ ํ๋ก์ ํธ์ ๊ฐ๊ฐ์ repo์ ์ ๋ง๋ก ๋ฌธ์ ๋ฅผ ์ ์ถํด์ผ ํฉ๋๋ค.)
--headless
์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ(๋๋ ์๋ํ์ง ์๋ ๊ฒฝ์ฐ)์๋ ๋ค์๊ณผ ๊ฐ์ ์ต์
์ด ์์ต๋๋ค.
@isiahmeadows ์ ๋ณด ๊ฐ์ฌํฉ๋๋ค. ํ์ฌ ๋ธ๋ผ์ฐ์ ์์ ์คํ ์ค์ธ ์น ์ฑ์ด ์๊ณ chrome/firefox๋ฅผ ์ฌ์ฉํ์ฌ ํค๋๋ฆฌ์ค ํ ์คํธ๋ฅผ ์ํด ํญ์ --headless๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ต๊ทผ์ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ Electron ์ฑ์ผ๋ก ๋ณํํ๊ณ ์ถ์ต๋๋ค. ์ macOS์์๋ ์๋ํ์ง ์๋ --headless๋ก ์๋ํ์ต๋๋ค. ์ด์ ์ด์ ๋ฅผ ์์์ต๋๋ค. ๊ฐ์ฌ ํด์!
์ฌ์ค ๋๋ xvfb์ ์๋ฃจ์ ์ด ๋ค์ดํฐ๋ธ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๋ง์์ ๋ค์ง ์์ต๋๋ค. ํ์ง๋ง ๋ค์ดํฐ๋ธ ํค๋๋ฆฌ์ค๋ฅผ ์ง์ํ์ง ์๋๋ค๋ ์ ์ ๊ฐ์ํ๋ฉด ์๋ํด ๋ณผ ํ์๊ฐ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
์ฐธ๊ณ - ์ด์ ํ ์คํธ์ ์นดํผ๋ฐ๋ผ๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๊ทธ๊ฒ์ ์ข์ ๊ฒ์ ๋๋ค (y)
์ด์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
Linux ํ๋ ์ ๋ฒํผ๋ก ์ง์ ๋ ๋๋งํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ฒ์๋ฌผ์์ ์ฌ๊ธฐ๋ก ๋ฆฌ๋๋ ์ ๋์์ง๋ง ์ด๊ฒ์ ํค๋๋ฆฌ์ค ํ ์คํธ์ ์ด์ ์ ๋ง์ถ ๊ฒ ๊ฐ์ต๋๋ค. _real_ ํ๋ ์ ๋ฒํผ๋ก ์ง์ ๋ ๋๋งํ๋ ๊ณผ์ ์ด ์งํ๋์์ต๋๊น?
@quinn ์ํ๋ ๊ฒฝ์ฐ ํ๋ ์ ๋ฒํผ์์ X11(Xorg)์ ์คํํ ์ ์์ง๋ง(์ฐธ์กฐ: https://www.x.org/releases/current/) X ์๋ฒ๊ฐ ํ์ํ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค. doc/man/man4/fbdev.4.xhtml).
_ํธ์งํ๋ค:_
์ค์ ๋ก ์ด๊ฒ์ ์กฐ๊ธ ๋ ์ดํด๋ณด๋ฉด ์ค์กด์ ์ฌ์ฉํ์ฌ ์ด๊ฒ์ ๋ฌ์ฑํ ์๋ ์์ต๋๋ค. ( https://github.com/jakwu/ozone-fb )
์ค์กด์ ์ถ๊ฐํ๋ฉด ๋๋ถ๋ถ์ Linux ๋ฐฐํฌํ์์ ์ดํ๋ก ์ ์๊ฐ ๋๋ฝ๋ ๋ ๋ค๋ฅธ ๊ธฐ๋ฅ์ธ wayland ์ง์์ด ๊ฐ๋ฅํฉ๋๋ค.
์ค์กด -fb ๋ฐ ๋ฐ๋ฅด๋ฉด ํ๋ ์ ๋ฒํผ๋ก ๋ ๋๋งํ๋ฉด GPU ๊ฐ์์ด ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
@trusktr 2๋ ๋ ๋๊ธ์ ๋๋ค. ๋ณ๊ฒฝ๋ ์ ์์ผ๋ฏ๋ก ๋ด ์๊ฒฌ์ ๊ถ์ ์๋ ๊ฒ์ผ๋ก ๋ฐ์๋ค์ด์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค(๊ทธ ์ดํ๋ก ํ์ธํ์ง ์์์ต๋๋ค).
์ ์์ headless lib๋ฅผ ์ถ๊ฐํ๊ณ HeadlessShellMain์ ํธ์ถํฉ๋๋คใ
์ด์:
e run --headless --enable-logging --v=2 --disable-gpu --screenshot http://192.168.50.206
๊ทธ๋ฌ๋ฉด ๋ค์์ด ํ์๋ฉ๋๋ค.
Running "/home/a/dev0/e9.2.1/src/out/ReleaseSym0/electron --headless --enable-logging --v=2 --disable-gpu --screenshot http://192.168.50.206:8889"
[1028/172650.483932:INFO:cpu_info.cc(53)] Available number of cores: 4
[1028/172650.484061:VERBOSE1:zygote_main_linux.cc(217)] ZygoteMain: initializing 0 fork delegates
[1028/172650.484400:INFO:cpu_info.cc(53)] Available number of cores: 4
[1028/172650.484465:VERBOSE1:zygote_main_linux.cc(217)] ZygoteMain: initializing 0 fork delegates
[1028/172650.493514:VERBOSE1:webrtc_internals.cc(119)] Could not get the download directory.
[1028/172650.494623:VERBOSE1:proxy_config_service_linux.cc(500)] All gsettings tests OK. Will get proxy config from gsettings.
[1028/172650.494764:VERBOSE1:proxy_config_service_linux.cc(1261)] Obtained proxy settings from annotation hash code 11258689
[1028/172650.494873:VERBOSE1:proxy_config_service_linux.cc(500)] All gsettings tests OK. Will get proxy config from gsettings.
[1028/172650.494919:VERBOSE1:proxy_config_service_linux.cc(1261)] Obtained proxy settings from annotation hash code 11258689
[1028/172650.504033:VERBOSE1:sandbox_linux.cc(69)] Activated seccomp-bpf sandbox for process type: renderer.
[1028/172650.505596:VERBOSE2:thread_state.cc(470)] [state:0x556bd75583a0] ScheduleGCIfNeeded
[1028/172650.511468:VERBOSE2:thread_state.cc(470)] [state:0x556bd75583a0] ScheduleGCIfNeeded
[1028/172650.524408:VERBOSE2:thread_state.cc(470)] [state:0x556bd75583a0] ScheduleGCIfNeeded
[1028/172650.524916:VERBOSE2:thread_state.cc(470)] [state:0x556bd75583a0] ScheduleGCIfNeeded
[1028/172650.525173:VERBOSE2:thread_state.cc(470)] [state:0x556bd75583a0] ScheduleGCIfNeeded
[1028/172650.525963:VERBOSE1:sandbox_linux.cc(69)] Activated seccomp-bpf sandbox for process type: gpu-process.
[1028/172650.526373:VERBOSE2:thread_state.cc(470)] [state:0x556bd75583a0] ScheduleGCIfNeeded
[1028/172650.528735:VERBOSE2:thread_state.cc(470)] [state:0x556bd75583a0] ScheduleGCIfNeeded
[1028/172650.531839:VERBOSE2:thread_state.cc(470)] [state:0x556bd75583a0] ScheduleGCIfNeeded
[1028/172650.535051:ERROR:paint_controller.cc(646)] PaintController::FinishCycle() completed
[1028/172650.550076:VERBOSE1:configured_proxy_resolution_service.cc(873)] PAC support disabled because there is no system implementation
[1028/172650.550312:VERBOSE1:configured_proxy_resolution_service.cc(873)] PAC support disabled because there is no system implementation
[1028/172650.550923:VERBOSE1:network_delegate.cc(32)] NetworkDelegate::NotifyBeforeURLRequest: http://192.168.50.206:8889/
[1028/172650.575829:VERBOSE1:url_loader.cc(418)] To buffer: http://192.168.50.206:8889/
[1028/172650.580122:VERBOSE1:v8_context_snapshot.cc(153)] A context is created from snapshot for main world
[1028/172650.587399:VERBOSE1:v8_context_snapshot.cc(153)] A context is created from snapshot for main world
[1028/172650.595294:ERROR:paint_controller.cc(646)] PaintController::FinishCycle() completed
[1028/172650.612295:ERROR:paint_controller.cc(646)] PaintController::FinishCycle() completed
[1028/172650.676553:INFO:headless_shell.cc(620)] Written to file screenshot.png.
ํค๋๋ฆฌ์ค๊ฐ ๊ตฌํ๋์๋ค๋ ๋ป์ธ๊ฐ์?
@bigben0123 ํฅ๋ฏธ๋กญ๊ณ ๋งค์ฐ ํฅ๋ฏธ์ง์งํฉ๋๋ค! ๊ทธ๋์ ํฌ๋กฌ์์ ํค๋๋ฆฌ์ค ์์ ํตํฉํ๋ ์ ์ ๋ฒ์ ์ ์ปดํ์ผ ํ์ต๋๊น?
Linux์์ X๊ฐ ์๋ ํ๊ฒฝ์์ ์๋ํ๋์ง ํ ์คํธํด ๋ณด์ จ์ต๋๊น?
ํฌ๋กฌ์ด ํค๋๋ฆฌ์ค ๋ชจ๋์์ ์คํ๋ ๋ ๋ ๋๋ง ํ์ ํ๋ก์ธ์ค๋ ํค๋๋ฆฌ์ค ํ๋๊ทธ๋ฅผ ํตํด ์์๋ฉ๋๋ค(๋ฉ๋ชจ๋ฆฌ์์ 'ps args'๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค). ์ด๊ฒ์ด ๋น์ ์ ์ํด ์ผ์ด๋๊ณ ์์ต๋๊น?
(์ด์ํ๊ฒ๋ ํ์ฌ ์ ์์ ํจ๊ป ์์ํ๋ ค๊ณ ํ๋ฉด โheadless ํ๋๊ทธ๊ฐ ๋ ๋๋ง ํ๋ก์ธ์ค๋ฅผ ํตํด ์ ๋ฌ๋์ง ์๊ณ GPU ํ๋ก์ธ์ค์ ์ ๋ฌ๋ฉ๋๋ค.)
@bigben0123 ํฅ๋ฏธ๋กญ๊ณ ๋งค์ฐ ํฅ๋ฏธ์ง์งํฉ๋๋ค! ๊ทธ๋์ ํฌ๋กฌ์์ ํค๋๋ฆฌ์ค ์์ ํตํฉํ๋ ์ ์ ๋ฒ์ ์ ์ปดํ์ผ ํ์ต๋๊น?
Linux์์ X๊ฐ ์๋ ํ๊ฒฝ์์ ์๋ํ๋์ง ํ ์คํธํด ๋ณด์ จ์ต๋๊น?
ํฌ๋กฌ์ด ํค๋๋ฆฌ์ค ๋ชจ๋์์ ์คํ๋ ๋ ๋ ๋๋ง ํ์ ํ๋ก์ธ์ค๋ ํค๋๋ฆฌ์ค ํ๋๊ทธ๋ฅผ ํตํด ์์๋ฉ๋๋ค(๋ฉ๋ชจ๋ฆฌ์์ 'ps args'๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค). ์ด๊ฒ์ด ๋น์ ์ ์ํด ์ผ์ด๋๊ณ ์์ต๋๊น?
(์ด์ํ๊ฒ๋ ํ์ฌ ์ ์์ ํจ๊ป ์์ํ๋ ค๊ณ ํ๋ฉด โheadless ํ๋๊ทธ๊ฐ ๋ ๋๋ง ํ๋ก์ธ์ค๋ฅผ ํตํด ์ ๋ฌ๋์ง ์๊ณ GPU ํ๋ก์ธ์ค์ ์ ๋ฌ๋ฉ๋๋ค.)
์, ์ฌ์ฉ์ ๋ช
๋ น ๋ชจ๋์์ ์์ํ๋ ์ฐ๋ถํฌ์์ ์คํํฉ๋๋ค.
ํค๋๋ฆฌ์ค ํต๊ณผ:
electron --headless --enable-logging --v=2 --disable-gpu -print-to-pdf http://www.google.com
electron --type=zygote --no-zygote-sandbox --enable-logging --headless --v=2 --headless
electron --type=zygote --enable-logging --headless --v=2 --headless
electron --type=zygote --enable-logging --headless --v=2 --headless
electron --type=gpu-process --field-trial-handle=15536072708541054845,15522400966085077738,131072 --enable-logging --headless --v=2 --headless --gpu-preferences=MAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAQAAAAAAAAAAAAAAAAAAAACAAAAAAAAAA= --use-gl=swiftshader-webgl --override-use-software-gl-for-tests --enable-logging --v=2 --shared-files
electron --type=utility --field-trial-handle=15536072708541054845,15522400966085077738,131072 --lang=en-US --service-sandbox-type=network --enable-logging --use-gl=swiftshader-webgl --v=2 --headless --enable-logging --v=2 --shared-files=v8_snapshot_data:100
electron --type=renderer --allow-pre-commit-input --enable-logging --v=2 --field-trial-handle=15536072708541054845,15522400966085077738,131072 --disable-databases --disable-gpu-compositing --lang=en-US --headless --lang=en-US --num-raster-threads=2 --enable-main-frame-before-activation --renderer-client-id=4 --shared-files=v8_snapshot_data:100
electron --type=broker
@bigben0123 ์ด๋๊ฐ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ต๋๊น? ์ด๋ค ์ด์ ๋ก ์ ์ ์ฝ์ด๋ก ๋ง๋ค์ง ์๋๋ผ๋ ์ฌ์ฉํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ด ์ปค๋ฐ์ chrome headless lib๋ฅผ ์ ์์ ๋ณํฉํ๊ธฐ๋ง ํ๊ณ ํฌ๋กฌ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
https://github.com/bigben0123/electron/commit/b6cad8993d68d39f1732aa6ed5ece0135b9ae0c8
๋ด๊ฐ ์๋ ํ, ํฌ๋กฌ๊ณผ ํค๋๋ฆฌ์ค๋ ์ฝํ ์ธ ๋ ์ด์ด ๊ตฌํ์ด ๋ค๋ฆ ๋๋ค. ๋ ๊ฐ์ ๋ธ๋ผ์ฐ์ ์ ธ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํค๋๋ฆฌ์ค๋ฅผ ์์ํ๋ฉด "chrome --headless"๋ก ์์ํ๋ ๊ฒ์ ์ ์ธํ๊ณ ๋ ํฌ๋กฌ๊ณผ ์๋ฌด ๊ด๋ จ์ด ์์ต๋๋ค.
ํค๋๋ฆฌ์ค ๋ชฉํ ์ค ํ๋๋ "Chromium์ ์ฝ๋ ๊ธฐ๋ฐ์ ๋ํ ์นจ์ ๋๋ ํค๋๋ฆฌ์ค ๊ด๋ จ ๋ณ๊ฒฝ(์: #ifdefs)์ ์๋ฅผ ์ต์ํ"ํ๋ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์ xvfb๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด ์ ์๊ฐ ํค๋๋ฆฌ์ค์ธ ๊ฒ์ ๊ตฌํํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ์ ์๊ฐ ํค๋๋ฆฌ์ค๋ฅผ ์ง์ํ๋๋ก ํ ์ ์์ง๋ง ์ ์ ์ฑ์ ์คํํ ์๋ ์์ต๋๋ค.
์๋ก์ด ํค๋๋ฆฌ์ค ๋ถ๊ธฐ๋ฅผ ์ป๊ธฐ ์ํด ์ ์๋ฅผ ๋์ฒดํ๊ธฐ ์ํด ํค๋๋ฆฌ์ค ๊ตฌํ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ ์/BUILD.gn์์ ์ข ์์ฑ์ ์ ๊ฑฐํฉ๋๋ค.
"//ui/events/devices/x11",
"//ui/events/platform/x11",
"//ui/gtk" #all of gkt related
if (use_x11) {
deps += [
"//ui/gfx/x",
"//ui/gtk:x",
]
}
configs += [ ":gio_unix" ]
configs += [ "//build/config/linux:x11" ]
๋ค์์ผ๋ก ๊ต์ฒด:
"//UI/๋์คํ๋ ์ด",
"//UI/์ด๋ฒคํธ/์ฅ์น",
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
NightmareJS ๊ด๋ จ: ์ฐ๋ฆฌ๋ ํ์ฌ AWS Lambda์ ๊ฐ์ ์๋ฒ๋ฆฌ์ค ํ๊ฒฝ์์๋ ์คํํ ์ ์๋ ํค๋๋ฆฌ์ค Chrome ๊ธฐ๋ฐ์ Nightmare ๋ฒ์ ์ ์์ ์ค์ ๋๋ค. ๊ณง @graphcool์์ ์์ค๋ฅผ ๊ณต๊ฐํ ์์ ์ ๋๋ค. ๐