Tryb bez interfejsu graficznego w Chrome

Peter Kvitek
Peter Kvitek

W 2017 r. w Chrome 59 wprowadziliśmy tryb bez interfejsu graficznego, umożliwiają uruchamianie przeglądarki w środowisku nienadzorowanym bez widocznego interfejsu użytkownika. Możesz używać Chrome bez Chrome.

Tryb bez interfejsu graficznego jest często stosowany w automatyzacji przeglądarek w takich projektach jak: Puppeteer lub ChromeDriver. Oto przykład tworzenia pliku PDF w minimalistycznym trybie wiersza poleceń przy użyciu trybu bez interfejsu graficznego danego adresu URL:

chrome --headless --print-to-pdf https://developer.chrome.com/

Jak działa bez interfejsu graficznego

Zanim omówimy, jak działa interfejs bez interfejsu graficznego, warto zrozumieć, jak „stary” Bez interfejsu graficznego działa. Poprzedni fragment kodu wiersza poleceń używa pola --headless flagi wiersza poleceń, co sugeruje, że bez interfejsu graficznego jest tylko tryb działania interfejsu w zwykłej przeglądarce Chrome. Co zaskakujące, w rzeczywistości nie było to prawdą. Stary model bez interfejsu graficznego osobnej implementacji alternatywnej przeglądarki które trafiały w ramach tego samego pliku binarnego Chrome. Nie udostępnia wszystkie fragmenty kodu przeglądarki Chrome //chrome

Wdrożenie i obsługa osobnej przeglądarki bez interfejsu graficznego wiąże się z wieloma wyzwaniami. za pracochłonność. A ponieważ technologia bez interfejsu graficznego była miała własne błędy i funkcje, które nie były dostępne w Chrome. Spowodowało to zamieszanie podczas automatycznych testów przeglądarki, które mogły w trybie HUD, ale występuje błąd w trybie bez interfejsu graficznego lub na odwrót.

Firma wykluczyła też wszystkie automatyczne testy, które polegały na przeglądarce. instalacji rozszerzenia. To samo dotyczy innych funkcji na poziomie przeglądarki, jeśli interfejs Headless nie miał osobnej implementacji, nie był on obsługiwany.

Zespół Chrome ujednolicił tryby bez interfejsu graficznego i tryb interfejsu graficznego.

Nowa wersja Chrome bez interfejsu graficznego nie jest już oddzielną implementacją przeglądarki. Zamiast tego udostępnia kod Chrome.

Nowy tryb bez interfejsu graficznego jest dostępny w Chrome 112. W tym trybie Chrome tworzy: ale nie wyświetla żadnych okien platformy. Wszystkie pozostałe funkcje, istniejące są dostępne bez ograniczeń.

Korzystanie z trybu bez interfejsu graficznego

Aby użyć nowego trybu bez interfejsu graficznego, przekaż flagę wiersza poleceń --headless=new:

chrome --headless=new

Na razie stary tryb bez interfejsu graficznego jest nadal dostępny w przypadku:

chrome --headless=old

W Puppeteer

Aby włączyć nowy tryb bez interfejsu graficznego w Puppeteer:

import puppeteer from 'puppeteer';

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

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

// …

await browser.close();

W Selenium-WebDriver

Aby użyć nowego trybu bez interfejsu graficznego w Selenium-WebDriver:

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

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

// …

await driver.quit();

Więcej informacji, w tym przykłady zastosowania innych wiązań językowych, znajdziesz w poście na blogu zespołu Sellenium.

Flagi wiersza poleceń

W nowym trybie bez interfejsu graficznego dostępne są następujące flagi wiersza poleceń.

--dump-dom

Flaga --dump-dom wyświetla zserializowany DOM strony docelowej do stdout. Na przykład:

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

Różni się to od drukowania kodu źródłowego HTML, którego można użyć curl Aby wyświetlić wynik działania --dump-dom, Chrome najpierw analizuje kod HTML do DOM, wykonuje wszystkie polecenia <script>, które mogą zmieniać DOM, a następnie przekształca ten DOM z powrotem w zserializowany ciąg kodu HTML.

--screenshot

Flaga --screenshot powoduje wykonanie zrzutu ekranu strony docelowej i zapisanie go jako screenshot.png w bieżącym katalogu roboczym. Jest to szczególnie przydatne w przypadku: w połączeniu z flagą --window-size.

Na przykład:

chrome --headless=new --screenshot --window-size=412,892 https://developer.chrome.com/

--print-to-pdf

Flaga --print-to-pdf zapisuje stronę docelową jako plik PDF o nazwie output.pdf w w bieżącym katalogu roboczym. Na przykład:

chrome --headless=new --print-to-pdf https://developer.chrome.com/

Opcjonalnie możesz dodać flagę --no-pdf-header-footer, aby pominąć wydruk nagłówek (z bieżącą datą i godziną) i stopkę (z adresem URL i stroną), ).

chrome --headless=new --print-to-pdf --no-pdf-header-footer https://developer.chrome.com/

Nie: funkcja dostępna za flagą --no-pdf-header-footer była wcześniej dostępna dostępny z flagą --print-to-pdf-no-header. Może być konieczne użycie starą nazwę flagi, jeśli jest używana poprzednia wersja.

--timeout

Flaga --timeout określa maksymalny czas oczekiwania (w milisekundach), po którym zawartość strony jest przechwytywana przez narzędzia --dump-dom, --screenshot oraz --print-to-pdf, nawet jeśli strona nadal się wczytuje.

chrome --headless=new --print-to-pdf --timeout=5000 https://developer.chrome.com/

Flaga --timeout=5000 informuje Chrome, że musi poczekać do 5 sekund przed rozpoczęciem drukowania plik PDF. Z tego powodu ten proces może potrwać maksymalnie 5 sekund.

--virtual-time-budget

Element --virtual-time-budget umożliwia „przejście do przodu” dla dowolnego kodu zależnego od czasu (np. setTimeout/setInterval). Wymusza wykonanie przez przeglądarkę kodu strony, jednocześnie dbając o to, aby strona uważała, która tak naprawdę upływa.

Aby zilustrować zastosowanie tej funkcji, spójrz na tę wersję demonstracyjną, przyrosty, dzienniki i wyświetlenie licznika co sekundę za pomocą funkcji setTimeout(fn, 1000). Oto odpowiedni kod:

<output>0</output>
<script>
  const element = document.querySelector('output');
  let counter = 0;
  setInterval(() => {
    counter++;
    console.log(counter);
    element.textContent = counter;
  }, 1_000);
</script>

Po sekundzie strona zawiera wartość „1”; po dwóch sekundach, „2” itd. Aby zapisać stan strony po 42 sekundach i zapisać ją jako plik PDF:

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

--allow-chrome-scheme-url

Flaga --allow-chrome-scheme-url jest wymagana, aby uzyskać dostęp do chrome:// adresów URL. Ta flaga jest dostępna od wersji Chrome 123. Oto przykład:

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

Debugowanie

Chrome jest niewidoczny w trybie bez interfejsu graficznego, więc może brzmieć trudno aby rozwiązać problem. Można debugować Chrome bez interfejsu graficznego w sposób, przypominające upiorny Chrome.

Uruchom Chrome w trybie bez interfejsu graficznego, używając Flaga wiersza poleceń --remote-debugging-port.

chrome --headless=new --remote-debugging-port=0 https://developer.chrome.com/

Powoduje to wydrukowanie unikalnego adresu URL WebSocket na potrzeby protokołu stdout, na przykład:

DevTools listening on ws://127.0.0.1:60926/devtools/browser/b4bd6eaa-b7c8-4319-8212-225097472fd9

W przejrzystej instancji Chrome możemy następnie użyć funkcji Zdalne debugowanie w Narzędziach deweloperskich w Chrome, aby nawiązać połączenie do celu bez interfejsu graficznego i je sprawdzić.

  1. Przejdź na stronę chrome://inspect i kliknij przycisk Konfiguruj....
  2. Wpisz adres IP i numer portu z adresu URL WebSocket.
    • W poprzednim przykładzie mam wpisany ciąg 127.0.0.1:60926.
  3. Kliknij Gotowe. Powinny być widoczne wszystkie karty i cel zdalny. inne cele na liście.
  4. Kliknij inspekcja, aby otworzyć Narzędzia deweloperskie w Chrome i sprawdzić pilota. Cel bez interfejsu graficznego, z podglądem na żywo strony.

Narzędzia deweloperskie w Chrome mogą sprawdzać zdalną stronę docelową bez interfejsu graficznego

Prześlij opinię

Chętnie poznamy Twoją opinię na temat nowego trybu bez interfejsu graficznego. Jeśli napotkanych problemów, zgłoś błąd.