מצב 'דפדפן Chrome ללא GUI'

Peter Kvitek
Peter Kvitek

מצב 'דפדפן Chrome ללא GUI' מאפשר להפעיל את הדפדפן בסביבה שאינה בשימוש, בלי ממשק משתמש גלוי. בעיקרון, אפשר להריץ את Chrome בלי Chrome.

מצב 'ללא GUI' הוא בחירה פופולרית לאוטומציה של דפדפנים, באמצעות פרויקטים כמו Puppeteer או ChromeDriver.

שימוש במצב 'דפדפן ללא GUI'

כדי להשתמש במצב 'דפדפן ללא ממשק גרפי', מעבירים את דגל שורת הפקודה --headless:

chrome --headless

שימוש במצב 'דפדפן ללא GUI'

בעבר, מצב 'דפדפן ללא GUI' היה הטמעה נפרדת של דפדפן חלופי שנשלח כחלק מאותו בינארי של Chrome. לא שותף כל אחד מהקודים של דפדפן Chrome //chrome

ב-Chrome יש עכשיו מצבי 'דפדפן' ו'דפדפן ללא GUI' מאוחדים.

במצב 'דפדפן ללא GUI', הקוד משותף עם Chrome.

נכון לעכשיו, מצב 'ללא GUI' הקודם זמין עם:

chrome --headless=old

בבובת'

כדי להשתמש במצב 'דפדפן ללא GUI' ב-Puppeteer:

import puppeteer from 'puppeteer';

const browser = await puppeteer.launch({
  headless: 'true', // (default) enables Headless
  // `headless: 'old'` enables old Headless
  // `headless: false` enables "headful" mode
});

const page = await browser.newPage();
await page.goto('https://developer.chrome.com/');

// …

await browser.close();

ב-Selenium-WebDriver

כדי להשתמש במצב 'דפדפן ללא GUI' ב-Selenium-WebDriver:

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

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

// …

await driver.quit();

למידע נוסף, כולל דוגמאות לקישורי שפות אחרים, ניתן לעיין בפוסט בבלוג של צוות סלניום.

התרעות לגבי שורת הפקודה

סימוני שורת הפקודה הבאים זמינים במצב 'דפדפן ללא ממשק גרפי'.

--dump-dom

הדגל --dump-dom מדפיס את ה-DOM הסידורי של דף היעד ל-stdout. לדוגמה:

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

הדבר שונה מהדפסת קוד המקור של ה-HTML, שניתן לעשות עם curl כדי לספק לך את הפלט של --dump-dom, תחילה Chrome מנתח את ה-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 מורה ל-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'. אחרי שתי שניות, '2' וכן הלאה. כך מתעדים את מצב הדף לאחר 42 שניות ושומרים אותו כקובץ PDF:

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

--allow-chrome-scheme-url

הדגל --allow-chrome-scheme-url נדרש כדי לגשת לכתובות URL מסוג chrome://. הסימון הזה זמין ב-Chrome בגרסה 123. לדוגמה:

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

ניפוי באגים

Chrome בלתי נראה באופן יעיל במצב 'דפדפן ללא GUI', לכן הוא עשוי להישמע מסובך כדי לפתור בעיה. ניתן לנפות באגים ב-Chrome ללא ממשק גרפי באופן שקשה מאוד דומה ל-Chrome הראשי.

הפעלת Chrome במצב 'דפדפן ללא GUI' באמצעות דגל שורת הפקודה --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, אנחנו יכולים להשתמש לאחר מכן ניפוי באגים מרחוק בכלי הפיתוח ל-Chrome לצורך התחברות ליעד ללא GUI ולבדוק אותו.

  1. עוברים אל chrome://inspect ולוחצים על הלחצן Configure....
  2. מזינים את כתובת ה-IP ואת מספר היציאה מכתובת ה-URL של WebSocket.
    • בדוגמה הקודמת הזנתי 127.0.0.1:60926.
  3. לוחצים על סיום. אמור להופיע יעד מרוחק עם כל הכרטיסיות יעדים אחרים שצוינו.
  4. לוחצים על inspect כדי לגשת לכלי הפיתוח ל-Chrome ולבדוק את השלט הרחוק. יעד ללא GUI, כולל צפייה בזמן אמת של הדף.

כלי הפיתוח ל-Chrome יכולים לבדוק דף יעד מרוחק מסוג &#39;דפדפן ללא GUI&#39;

משוב

נשמח לקבל ממך משוב על מצב 'ללא GUI'. אם המיקום אם תיתקלו בבעיות, דווחו על באג.