با حالت Chrome Headless، میتوانید مرورگر را در یک محیط بدون نظارت و بدون هیچ رابط کاربری قابل مشاهدهای اجرا کنید. اساساً، میتوانید کروم را بدون کروم اجرا کنید.
حالت بدون سر (Headless mode) یک انتخاب محبوب برای اتوماسیون مرورگر است که از طریق پروژههایی مانند Puppeteer یا ChromeDriver انجام میشود.
از حالت بدون سر (Headless) استفاده کنید
برای استفاده از حالت Headless، از دستور --headless در خط فرمان استفاده کنید:
chrome --headless
از حالت قدیمی Headless استفاده کنید
پیش از این، حالت Headless یک پیادهسازی جداگانه و جایگزین برای مرورگر بود که اتفاقاً به عنوان بخشی از همان فایل باینری کروم ارائه میشد. این حالت هیچ یک از کدهای مرورگر کروم را در //chrome به اشتراک نمیگذاشت.
کروم اکنون حالتهای Headless و Headful را یکپارچه کرده است.
از نسخه ۱۳۲.۰.۶۷۹۳.۰ کروم، حالت قدیمی Headless فقط به صورت یک فایل باینری مستقل به نام chrome-headless-shell در دسترس است که میتوانید آن را از اینجا دانلود کنید.
در عروسکگردان
برای استفاده از حالت Headless در Puppeteer:
import puppeteer from 'puppeteer';
const browser = await puppeteer.launch({
headless: true, // (default) enables Chrome Headless mode
// `headless: 'shell'` enables Headless Shell (old headless)
// `headless: false` enables "headful" mode
});
const page = await browser.newPage();
await page.goto('https://developer.chrome.com/');
// …
await browser.close();
برای اطلاعات بیشتر در مورد استفاده از Headless در Puppeteer، میتوانید به منابع موجود در اینجا مراجعه کنید.
در سلنیوم-وبدرایور
برای استفاده از حالت Headless در Selenium-WebDriver:
const driver = await env
.builder()
.setChromeOptions(options.addArguments('--headless'))
.build();
await driver.get('https://developer.chrome.com/');
// …
await driver.quit();
برای اطلاعات بیشتر، از جمله مثالهایی با استفاده از مقیدسازیهای زبانهای دیگر، به پست وبلاگ تیم سلنیوم مراجعه کنید.
پرچمهای خط فرمان
پرچمهای خط فرمان زیر در حالت Headless و در پوسته Headless در دسترس هستند.
--dump-dom
پرچم --dump-dom DOM سریالیزه شده صفحه هدف را در stdout چاپ میکند. برای مثال:
chrome --headless --dump-dom https://developer.chrome.com/
این با چاپ کد منبع HTML که ممکن است با curl انجام دهید متفاوت است. برای نمایش خروجی --dump-dom ، کروم ابتدا کد HTML را به یک DOM تجزیه میکند، هر <script> که ممکن است DOM را تغییر دهد اجرا میکند، سپس آن DOM را دوباره به یک رشته سریالی از HTML تبدیل میکند.
--screenshot
پرچم --screenshot از صفحه هدف اسکرینشات میگیرد و آن را با نام screenshot.png در دایرکتوری کاری فعلی ذخیره میکند. این ویژگی به ویژه در ترکیب با پرچم --window-size مفید است.
برای مثال:
chrome --headless --screenshot --window-size=412,892 https://developer.chrome.com/
--print-to-pdf
پرچم --print-to-pdf صفحه هدف را به عنوان یک فایل PDF با نام output.pdf در دایرکتوری کاری فعلی ذخیره میکند. برای مثال:
chrome --headless --print-to-pdf https://developer.chrome.com/
به صورت اختیاری، میتوانید پرچم --no-pdf-header-footer را اضافه کنید تا سربرگ چاپ (شامل تاریخ و زمان فعلی) و پابرگ (شامل URL و شماره صفحه) حذف شوند.
chrome --headless --print-to-pdf --no-pdf-header-footer https://developer.chrome.com/
نکته: قابلیت پشت پرچم --no-pdf-header-footer قبلاً با پرچم --print-to-pdf-no-header در دسترس بود. اگر از نسخه قبلی استفاده میکنید، ممکن است لازم باشد به نام پرچم قدیمی برگردید.
--timeout
پرچم --timeout حداکثر زمان انتظار (به میلیثانیه) را تعریف میکند که پس از آن محتوای صفحه توسط --dump-dom ، --screenshot و --print-to-pdf حتی اگر صفحه هنوز در حال بارگیری باشد، ثبت میشود.
chrome --headless --print-to-pdf --timeout=5000 https://developer.chrome.com/
پرچم --timeout=5000 به کروم میگوید که قبل از چاپ PDF تا ۵ ثانیه صبر کند. بنابراین، اجرای این فرآیند حداکثر ۵ ثانیه طول میکشد.
--virtual-time-budget
گزینهی --virtual-time-budget به عنوان یک "fast-forward" برای هر کد وابسته به زمان (مثلاً setTimeout / setInterval ) عمل میکند. این گزینه مرورگر را مجبور میکند تا هر یک از کدهای صفحه را با بیشترین سرعت ممکن اجرا کند، در حالی که صفحه باور میکند که زمان واقعاً میگذرد.
برای نشان دادن کاربرد آن، این نسخه آزمایشی را در نظر بگیرید که با استفاده از setTimeout(fn, 1000) هر ثانیه یک شمارنده را افزایش، ثبت و نمایش میدهد . کد مربوطه در اینجا آمده است:
<output>0</output>
<script>
const element = document.querySelector('output');
let counter = 0;
setInterval(() => {
counter++;
console.log(counter);
element.textContent = counter;
}, 1_000);
</script>
بعد از یک ثانیه، صفحه شامل "1" میشود؛ بعد از دو ثانیه، "2" و به همین ترتیب. در اینجا نحوه ثبت وضعیت صفحه پس از 42 ثانیه و ذخیره آن به صورت PDF آورده شده است:
chrome --headless --print-to-pdf --virtual-time-budget=42000 https://mathiasbynens.be/demo/time
--allow-chrome-scheme-url
برای دسترسی به آدرسهای اینترنتی chrome:// ، استفاده از پرچم --allow-chrome-scheme-url الزامی است. این پرچم از نسخه ۱۲۳ کروم در دسترس است. در اینجا مثالی آورده شده است:
chrome --headless --print-to-pdf --allow-chrome-scheme-url chrome://gpu
اشکالزدایی
از آنجا که کروم در حالت Headless عملاً نامرئی است، ممکن است حل مشکل دشوار به نظر برسد. میتوان کروم Headless را به روشی بسیار شبیه به کروم headful اشکالزدایی کرد.
کروم را در حالت Headless با استفاده از پرچم خط فرمان --remote-debugging-port اجرا کنید.
chrome --headless --remote-debugging-port=0 https://developer.chrome.com/
این یک URL منحصر به فرد WebSocket را در stdout چاپ میکند، برای مثال:
DevTools listening on ws://127.0.0.1:60926/devtools/browser/b4bd6eaa-b7c8-4319-8212-225097472fd9
در یک نمونهی کامل از کروم، میتوانیم از اشکالزدایی از راه دور Chrome DevTools برای اتصال به هدف Headless و بررسی آن استفاده کنیم.
- به
chrome://inspectبروید و روی دکمه Configure… کلیک کنید. - آدرس IP و شماره پورت را از URL مربوط به WebSocket وارد کنید.
- در مثال قبلی، من
127.0.0.1:60926وارد کردم.
- در مثال قبلی، من
- روی «انجام شد» کلیک کنید. باید یک هدف از راه دور با تمام تبها و سایر اهداف فهرستشده ظاهر شود.
- برای دسترسی به Chrome DevTools و بررسی هدف Headless از راه دور، از جمله نمای زنده صفحه، روی inspect کلیک کنید.

بازخورد
مشتاقانه منتظر شنیدن نظرات شما در مورد حالت Headless هستیم. اگر با هرگونه مشکلی مواجه شدید، یک اشکال (bug) ثبت کنید .