Chrome Gözetimsiz modu

Peter Kvitek
Peter Kvitek

Chrome Headless modu sayesinde, tarayıcıyı görünür kullanıcı arayüzü olmadan gözetimsiz bir ortamda çalıştırabilirsiniz. Yani Chrome'u Chrome olmadan çalıştırabilirsiniz.

Gözetimsiz mod, Puppeteer veya ChromeDriver gibi projeler aracılığıyla tarayıcı otomasyonu için popüler bir seçimdir.

Gözetimsiz modu kullanma

Gözetimsiz modu kullanmak için --headless komut satırı işaretini iletin:

chrome --headless

Eski Gözetimsiz modu kullanma

Daha önce, Gözetimsiz mod, aynı Chrome ikili programının bir parçası olarak gönderilen ayrı, alternatif bir tarayıcı uygulamasıydı. //chrome adresindeki Chrome Tarayıcı kodunun hiçbirini paylaşmadı.

Chrome artık birleşik bir başsız ve başlı modlara sahiptir.

Gözetimsiz mod, kodu Chrome ile paylaşır.

Şu anda eski Headless modu aşağıdakilerle kullanılabilir:

chrome --headless=old

Puppeteer'da

Puppeteer'da Headless modunu kullanmak için:

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'da

Selenium-WebDriver'da gözetimsiz modu kullanmak için:

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

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

// …

await driver.quit();

Diğer dil bağlamalarını kullanan örnekler de dahil olmak üzere daha fazla bilgi için Selenium ekibinin blog yayınını inceleyin.

Komut satırı işaretleri

Aşağıdaki komut satırı işaretçileri, Başsız modda kullanılabilir.

--dump-dom

--dump-dom işareti, hedef sayfanın serileştirilmiş DOM'unu stdout'a yazdırır. Örneğin:

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

Bu, curl ile yapabileceğiniz HTML kaynak kodunu yazdırmaktan farklıdır. Chrome, --dump-dom etkinleştirildiğinde size çıkışı sunmak için önce HTML kodunu bir DOM'a ayırır, DOM'u değiştirebilecek tüm <script>'leri yürütür, ardından bu DOM'u serileştirilmiş bir HTML dizesine dönüştürür.

--screenshot

--screenshot işareti, hedef sayfanın ekran görüntüsünü alır ve geçerli çalışma dizininde screenshot.png olarak kaydeder. Bu, özellikle --window-size işaretiyle birlikte kullanıldığında yararlıdır.

Örneğin:

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

--print-to-pdf

--print-to-pdf işareti, hedef sayfayı geçerli çalışma dizininde output.pdf adlı bir PDF olarak kaydeder. Örneğin:

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

İsteğe bağlı olarak, --no-pdf-header-footer işaretini ekleyerek baskı üst bilgisini (mevcut tarih ve saati içerir) ve alt bilgisini (URL ve sayfa numarasını içerir) atlayabilirsiniz.

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

Not: --no-pdf-header-footer bayrağının arkasındaki işlev daha önce --print-to-pdf-no-header bayrağıyla kullanılabiliyordu. Önceki bir sürümü kullanıyorsanız eski işaret adı için geri dönmeniz gerekebilir.

--timeout

--timeout işareti, sayfa hâlâ yükleniyor olsa bile sayfanın içeriğinin --dump-dom, --screenshot ve --print-to-pdf tarafından yakalanacağı maksimum bekleme süresini (milisaniye cinsinden) tanımlar.

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

--timeout=5000 işareti, Chrome'a PDF'yi yazdırmadan önce 5 saniye beklemesini söyler. Bu nedenle, bu işlemin çalışması en fazla 5 saniye sürer.

--virtual-time-budget

--virtual-time-budget, zamana bağlı herhangi bir kod (ör. setTimeout/setInterval) için "ileri sarma" işlevi görür. Tarayıcıyı sayfanın kodunun tamamını mümkün olduğunca hızlı bir şekilde yürütmeye zorlarken sayfaya zamanın gerçekten geçtiğini düşündürür.

Kullanımını açıklamak için setTimeout(fn, 1000) kullanarak her saniye bir sayacı artıran, kaydeden ve görüntüleyen bu demoyu inceleyin. İlgili kod aşağıda verilmiştir:

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

Bir saniye sonra sayfa "1", iki saniye sonra "2" ve bu şekilde devam eder. Sayfanın durumunu 42 saniye sonra yakalayıp PDF olarak kaydetme işlemini şu şekilde yapabilirsiniz:

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

--allow-chrome-scheme-url

chrome:// URL'lerine erişmek için --allow-chrome-scheme-url işareti gereklidir. Bu işaret, Chrome 123'ten itibaren kullanılabilir. Aşağıda bununla ilgili bir örnek verilmiştir:

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

Hata Ayıklama

Chrome, Gözetimsiz modda görünmez olduğundan bir sorunu çözmek zor görünebilir. Gözetimsiz Chrome'da, gözetimli Chrome'a çok benzer bir şekilde hata ayıklama yapılabilir.

Chrome'u --remote-debugging-port komut satırı işaretiyle gözetimsiz modda başlatın.

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

Bu komut, stdout'a benzersiz bir WebSocket URL'si yazdırır. Örneğin:

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

Ardından, başlık içeren bir Chrome örneğinde Chrome Geliştirici Araçları uzaktan hata ayıklama özelliğini kullanarak başlıksız hedefe bağlanabilir ve hedefi inceleyebiliriz.

  1. chrome://inspect bölümüne gidin ve Yapılandır… düğmesini tıklayın.
  2. WebSocket URL'sindeki IP adresini ve bağlantı noktası numarasını girin.
    • Önceki örnekte 127.0.0.1:60926 değerini girdim.
  3. Bitti'yi tıklayın. Tüm sekmelerinin ve diğer hedeflerinin listelendiği bir uzak hedef görürsünüz.
  4. Chrome Geliştirici Araçları'na erişmek ve sayfanın canlı görünümü dahil olmak üzere uzaktaki Headless hedefi incelemek için İncele'yi tıklayın.

Chrome Geliştirici Araçları, uzak bir Headless hedef sayfasını inceleyebilir

Geri bildirim

Başsız mod hakkındaki geri bildirimlerinizi bekliyoruz. Sorunla karşılaşırsanız hata bildirin.