โหมดไม่มีส่วนหัวของ Chrome

Peter Kvitek
Peter Kvitek

โหมด Headless ของ Chrome ช่วยให้คุณเรียกใช้เบราว์เซอร์ในสภาพแวดล้อมที่ไม่ต้องมีการดูแล โดยไม่มี UI ที่มองเห็นได้ กล่าวโดยสรุปคือ คุณสามารถเรียกใช้ Chrome โดยไม่มี Chrome ได้

โหมด Headless เป็นตัวเลือกยอดนิยมสำหรับการทำงานอัตโนมัติของเบราว์เซอร์ผ่านโปรเจ็กต์ต่างๆ เช่น Puppeteer หรือ ChromeDriver

ใช้โหมดไม่มีส่วนหัว

หากต้องการใช้โหมดไม่มีส่วนหัว ให้ส่ง--headless Flag บรรทัดคำสั่งต่อไปนี้

chrome --headless

ใช้โหมดไม่มีส่วนหัวแบบเดิม

ก่อนหน้านี้ โหมด Headless เป็น การติดตั้งใช้งานเบราว์เซอร์ทางเลือกที่แยกต่างหาก ซึ่งจัดส่งเป็นส่วนหนึ่งของไบนารี Chrome เดียวกัน โดยไม่ได้แชร์โค้ดเบราว์เซอร์ Chrome ใน//chrome

ตอนนี้ Chrome มีโหมด Headless และ Headful แบบรวมแล้ว

โหมดไม่มีส่วนหัวจะแชร์โค้ดกับ Chrome

ตั้งแต่ Chrome 132.0.6793.0 โหมด Headless แบบเดิมจะใช้ได้เฉพาะในรูปแบบไบนารีแบบสแตนด์อโลนที่ชื่อ chrome-headless-shell ซึ่งดาวน์โหลดได้ที่นี่

ใน Puppeteer

วิธีใช้โหมด 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 ได้ที่แหล่งข้อมูลที่นี่

ใน Selenium-WebDriver

วิธีใช้โหมดไม่มีส่วนหัวใน Selenium-WebDriver

const driver = await env
  .builder()
  .setChromeOptions(options.addArguments('--headless'))
  .build();

await driver.get('https://developer.chrome.com/');

// …

await driver.quit();

ดูข้อมูลเพิ่มเติมได้ที่บล็อกโพสต์ของทีม Selenium ซึ่งรวมถึงตัวอย่างการใช้การเชื่อมโยงภาษาอื่นๆ

Flag บรรทัดคำสั่ง

แฟล็กบรรทัดคำสั่งต่อไปนี้พร้อมใช้งานในโหมด Headless และใน Headless Shell

--dump-dom

ฟีเจอร์ --dump-dom จะพิมพ์ DOM ที่แปลงเป็นอนุกรมของหน้าเป้าหมายไปยัง stdout เช่น

chrome --headless --dump-dom https://developer.chrome.com/

ซึ่งแตกต่างจากการพิมพ์ซอร์สโค้ด HTML ที่คุณอาจทำด้วย curl Chrome จะแยกวิเคราะห์โค้ด HTML เป็น DOM ก่อน จากนั้นจะเรียกใช้ <script> ที่อาจแก้ไข DOM แล้วเปลี่ยน DOM นั้นกลับเป็นสตริง HTML ที่จัดลำดับแล้ว--dump-dom

--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 จะบอกให้ Chrome รอสูงสุด 5 วินาทีก่อนพิมพ์ ไฟล์ PDF ดังนั้นกระบวนการนี้จึงใช้เวลาไม่เกิน 5 วินาที

--virtual-time-budget

--virtual-time-budget ทำหน้าที่เป็น "กรอไปข้างหน้า" สำหรับโค้ดที่ขึ้นอยู่กับเวลา (เช่น 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 วินาที หน้าเว็บจะมี "1" หลังจากผ่านไป 2 วินาที จะมี "2" และอื่นๆ วิธีจับภาพสถานะของหน้าเว็บหลังจากผ่านไป 42 วินาทีและบันทึกเป็น PDF มีดังนี้

chrome --headless --print-to-pdf --virtual-time-budget=42000 https://mathiasbynens.be/demo/time

--allow-chrome-scheme-url

ต้องใช้ Flag --allow-chrome-scheme-url เพื่อเข้าถึง URL ของ chrome:// Flag นี้พร้อมใช้งานใน Chrome 123 เช่น

chrome --headless --print-to-pdf --allow-chrome-scheme-url chrome://gpu

แก้ไขข้อบกพร่อง

เนื่องจาก Chrome จะมองไม่เห็นในโหมด Headless จึงอาจดูเหมือนว่าการแก้ปัญหาเป็นเรื่องยาก คุณสามารถแก้ไขข้อบกพร่องของ Chrome แบบ Headless ในลักษณะที่คล้ายกับ Chrome แบบ Headful มาก

เปิด Chrome ในโหมด 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 แบบ Headful เราจะใช้การแก้ไขข้อบกพร่องระยะไกลของเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome เพื่อเชื่อมต่อกับเป้าหมาย Headless และตรวจสอบได้

  1. ไปที่ chrome://inspect แล้วคลิกปุ่มกำหนดค่า...
  2. ป้อนที่อยู่ IP และหมายเลขพอร์ตจาก URL ของ WebSocket
    • ในตัวอย่างก่อนหน้า ฉันป้อน 127.0.0.1:60926
  3. คลิกเสร็จสิ้น คุณควรเห็นเป้าหมายระยะไกลปรากฏขึ้นพร้อมกับแท็บทั้งหมดและ เป้าหมายอื่นๆ ที่แสดง
  4. คลิกตรวจสอบเพื่อเข้าถึงเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome และตรวจสอบเป้าหมายระยะไกลแบบ Headless รวมถึงดูหน้าเว็บแบบเรียลไทม์

Chrome DevTools สามารถตรวจสอบหน้าเป้าหมายแบบ Headless ระยะไกลได้

ความคิดเห็น

เราหวังว่าจะได้รับฟังความคิดเห็นของคุณเกี่ยวกับโหมด Headless หากพบปัญหา โปรดรายงานข้อบกพร่อง