حالت بدون سر کروم

پیتر کویتک
Peter Kvitek

با حالت Chrome Headless، می‌توانید مرورگر را در یک محیط بدون نظارت و بدون هیچ رابط کاربری قابل مشاهده‌ای اجرا کنید. اساساً، می‌توانید کروم را بدون کروم اجرا کنید.

حالت بدون سر (Headless mode) یک انتخاب محبوب برای اتوماسیون مرورگر است که از طریق پروژه‌هایی مانند Puppeteer یا ChromeDriver انجام می‌شود.

از حالت بدون سر (Headless) استفاده کنید

برای استفاده از حالت Headless، از دستور --headless در خط فرمان استفاده کنید:

chrome --headless

از حالت قدیمی Headless استفاده کنید

پیش از این، حالت Headless یک پیاده‌سازی جداگانه و جایگزین برای مرورگر بود که اتفاقاً به عنوان بخشی از همان فایل باینری کروم ارائه می‌شد. این حالت هیچ یک از کدهای مرورگر کروم را در //chrome به اشتراک نمی‌گذاشت.

کروم اکنون حالت‌های Headless و Headful را یکپارچه کرده است.

حالت بدون سر (Headless mode) کد را با کروم به اشتراک می‌گذارد.

از نسخه ۱۳۲.۰.۶۷۹۳.۰ کروم، حالت قدیمی 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 و بررسی آن استفاده کنیم.

  1. به chrome://inspect بروید و روی دکمه Configure… کلیک کنید.
  2. آدرس IP و شماره پورت را از URL مربوط به WebSocket وارد کنید.
    • در مثال قبلی، من 127.0.0.1:60926 وارد کردم.
  3. روی «انجام شد» کلیک کنید. باید یک هدف از راه دور با تمام تب‌ها و سایر اهداف فهرست‌شده ظاهر شود.
  4. برای دسترسی به Chrome DevTools و بررسی هدف Headless از راه دور، از جمله نمای زنده صفحه، روی inspect کلیک کنید.

ابزارهای توسعه کروم می‌توانند یک صفحه هدف Headless از راه دور را بررسی کنند

بازخورد

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