Chrome'un gözetimsiz modu yeni sürüme geçirildi: --headless=new

Chrome'un Gözetimsiz modu çok daha iyi hale geldi!

Peter Kvitek
Peter Kvitek

Chrome'un Gözetimsiz modu çok daha iyi hale geldi! Bu makalede, gözetimsiz modu Chrome'un normal "dikkatli" moduna yaklaştırarak gözetimsiz modun geliştiriciler için daha kullanışlı hale getirilmesi amacıyla yapılan son mühendislik çalışmalarına genel bir bakış sunulmaktadır.

Arka plan

Chrome 59'da 2017 yılında, tarayıcıyı herhangi bir görünür kullanıcı arayüzü olmadan gözetimsiz bir ortamda çalıştırmanıza olanak tanıyan Gözetimsiz modu kullanıma sunduk. Kısacası, Chrome'u Chrome olmadan çalıştırmak!

Gözetimsiz mod, Puppeteer veya ChromeDriver gibi projelerde tarayıcı otomasyonu için yaygın olarak kullanılan bir seçenektir. Belirli bir URL'nin PDF dosyasını oluşturmak için Gözetimsiz modu kullanmaya ilişkin minimal komut satırı örneği aşağıda verilmiştir:

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

Gözetimsiz moddaki yenilikler

Son zamanlarda yapılan gözetimsiz iyileştirmelere geçmeden önce, "eski" gözetimsiz sistem özelliğinin nasıl çalıştığını anlamak önemlidir. Daha önce gösterdiğimiz komut satırı snippet'inde --headless komut satırı işareti kullanılmaktadır. Bu, Gözetimsiz özelliğinin normal Chrome tarayıcının yalnızca bir çalışma modu olduğunu belirtir. Belki de bunun aslında doğru olmamasıydı. Teknik olarak, eski gözetimsiz sistem, aynı Chrome ikili programı kapsamında gönderilen ayrı ve alternatif bir tarayıcı uygulamasıydı. //chrome'te Chrome tarayıcı kodunun hiçbiri paylaşılmaz.

Tahmin edebileceğiniz gibi, bu gözetimsiz tarayıcının uygulanması ve bakımının yapılması birçok mühendislik yükü beraberinde getirdi ve tek sorun bu değildi. Headless ayrı bir uygulama olduğundan, gözetimli Chrome'da bulunmayan kendi hataları ve özellikleri vardı. Bu durum, otomatik tarayıcı testlerinin gözetimsiz modda başarılıyken gözetimsiz modda (veya tam tersi) başarısız olabileceği kafa karıştırıcı bir durum yarattı. Bu da otomasyon mühendisleri için önemli bir sorun teşkil ediyordu. Ayrıca, örneğin bir tarayıcı uzantısının yüklü olduğu otomatik testler de hariç tutuldu. Aynı durum tarayıcı düzeyindeki diğer işlevler için de geçerlidir: Gözetimsiz, ayrı bir şekilde uygulanmadığı sürece desteklenmemektedir.

Chrome ekibi 2021'de bu sorunu çözmek ve Gözetimsiz ve gözetimsiz modları kesin olarak birleştirmek için işe koyuldu.

Yeni Chrome Gözetimsiz uygulaması artık ayrı bir tarayıcı uygulaması olmayıp kodu Chrome ile paylaşıyor.

Yeni gözetimsiz modun artık Chrome 112'de kullanıma sunulduğunu duyurmaktan heyecan duyuyoruz. Chrome bu modda platform penceresi oluşturur ancak görüntülemez. Mevcut ve gelecekteki tüm diğer işlevler sınırlama olmadan kullanılabilir.

Yeni Headless'i deneyin

Yeni Gözetimsiz modu denemek için --headless=new komut satırı işaretini iletin:

chrome --headless=new

Eski Gözetimsiz modu şu anda kullanmaya devam edebilirsiniz:

chrome --headless=old

Şu anda --headless komut satırı işaretini belirli bir değer olmadan iletmeye devam etmek eski Gözetimsiz modu etkinleştirmektedir. Ancak zaman içinde bu varsayılan ayarı yeni Gözetimsiz mod olarak değiştirmeyi planlıyoruz.

Eski gözetimsiz modu Chrome ikili programından tamamen kaldırmayı ve bu yılın ilerleyen dönemlerinde Puppeteer'da bu modu desteklemeyi durdurmayı planlıyoruz. Bu kaldırma işlemi kapsamında, henüz yeni sürüme geçemeyen kullanıcılar için eski Gözetimsiz ikili programı ayrı bir bağımsız ikili program olarak kullanıma sunacağız.

Yeni Puppeteer'da Headless

Puppeteer'daki yeni Gözetimsiz modu etkinleştirmek için:

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();

Selenium-WebDriver'da Yeni Gözetimsiz Uygulama

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

const driver = await env
  .builder()
  .setChromeOptions(options.addArguments('--headless=new'))
  .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ına bakın.

Gözetimsiz komut satırı işaretleri

Yeni Gözetimsiz modda aşağıdaki komut satırı işaretleri kullanılabilir.

--dump-dom

--dump-dom işareti, hedef sayfanın serileştirilmiş DOM'sini stdout'a yazdırır. Aşağıda bir örnek verilmiştir:

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

Bunun sadece HTML kaynak kodunun yazdırılmasından farklı olduğunu unutmayın (curl ile bunu yapabilirsiniz). --dump-dom çıktısını almak için Chrome önce HTML kodunu bir DOM'ye ayrıştırır, DOM'u değiştirebilecek herhangi bir <script>'yi yürütür ve ardından bu DOM'u tekrar 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 mevcut çalışma dizinine screenshot.png olarak kaydeder. Bu özellikle --window-size işaretiyle birlikte kullanıldığında kullanışlıdır. Aşağıda bir örnek verilmiştir:

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

--print-to-pdf

--print-to-pdf işareti, hedef sayfayı mevcut çalışma dizinine output.pdf adlı bir PDF olarak kaydeder. Aşağıda bir örnek verilmiştir:

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

İsteğe bağlı olarak, yazdırma üstbilgisini (geçerli tarih ve saatle birlikte) ve altbilgiyi (URL ve sayfa numarasıyla birlikte) atlamak için --no-pdf-header-footer işaretini ekleyebilirsiniz.

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

--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 yakalanması için gereken maksimum bekleme süresini (milisaniye cinsinden) tanımlar.

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

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

--virtual-time-budget

--virtual-time-budget zamanda yolculuk imkanı sağlar! Bir ölçüde. Sanal Zaman, zamana bağlı tüm kodlar (örneğin, setTimeout/setInterval) için "ileri sarma" görevi görür. Sayfayı zamanın gerçekten geçtiğine inanırken tarayıcıyı sayfanın herhangi bir kodunu mümkün olduğunca hızlı yürütmeye zorlar.

Kullanımını göstermek için setTimeout(fn, 1000) kullanarak saniyede bir artış gösteren, günlüğe kaydeden ve bir sayaç görüntüleyen bu demo sayfasına göz atın. İlgili kod şudur:

<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, sayfada "1"; iki saniye sonra "2" vb. bulunur. Aşağıda, sayfanın durumunu 42 saniye sonra nasıl yakalayacağınız ve PDF olarak kaydedeceğiniz açıklanmıştır:

chrome --headless=new --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 sürümünden itibaren kullanıma sunulmuştur. Aşağıda bir örnek verilmiştir:

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

Hata ayıklama

Chrome, Gözetimsiz modda fiilen görünmez olduğundan, herhangi bir sorun durumunda ne olup bittiğini anlamak zor gelebilir. Neyse ki Gözetimsiz Chrome'da, gözetimli Chrome'a çok benzer bir şekilde hata ayıklamak mümkündür. İşin sırrı, Chrome'u --remote-debugging-port komut satırı işaretiyle Gözetimsiz modda başlatmaktır.

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

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

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

Normal bir gözetimli Chrome örneğinde, Gözetimsiz hedefe bağlanmak ve onu incelemek için Chrome DevTools uzaktan hata ayıklama özelliğini kullanabiliriz. Bunun için chrome://inspect adresine gidin, Yapılandır... düğmesini tıklayın ve WebSocket URL'sinden IP adresini ve bağlantı noktası numarasını girin. Yukarıdaki örnekte 127.0.0.1:60926 değerini girdim. Bitti'yi tıkladığınızda, tüm sekmeleri ve aşağıda listelenen diğer hedeflerle birlikte bir Uzak Hedef görürsünüz. inspect'yi tıkladığınızda artık inspect, uzak Gözetimsiz hedefi inceleyen Chrome Geliştirici Araçları'na erişebilirsiniz.

Chrome Geliştirici Araçları, uzaktaki Gözetimsiz hedef sayfayı inceleyebilir

Geri bildirim

Yeni gözetimsiz modla ilgili geri bildiriminizi öğrenmek için sabırsızlanıyoruz. Herhangi bir sorunla karşılaşırsanız lütfen bunları bildirin.