Gözetimsiz Chrome'u Kullanmaya Başlama

Özet

Gözetimsiz Chrome Chrome 59 sürümünde kullanıma sunuluyor. Bu, Chrome tarayıcıyı gözetimsiz bir ortamda çalıştırmanın bir yoludur. Kısacası, Chrome'u içermeyen Chrome! Sağlanan tüm modern web platformu özelliklerini sunar oluşturma motoru tarafından komut satırına eklenir.

Neden yararlı?

Gözetimsiz tarayıcı, otomatik test ve sunucu ortamları için mükemmel bir araçtır. görünür bir kullanıcı arayüzü kabuğuna ihtiyaç duymaz. Örneğin, her ekip üyesiyle ilgili birtakım testler gerçek bir web sayfasını ziyaret edebilir, PDF'si oluşturabilir veya tarayıcının bir URL'yi nasıl oluşturduğunu inceleyebilirsiniz.

Gözetimsiz Başlatma (KSA)

Gözetimsiz modu kullanmaya başlamanın en kolay yolu Chrome ikili programını açmaktır. komutunu çalıştırın. Chrome 59 veya sonraki bir sürüm yüklüyse Chrome'u --headless işaretiyle başlatın:

chrome \
--headless \                   # Runs Chrome in headless mode.
--disable-gpu \                # Temporarily needed if running on Windows.
--remote-debugging-port=9222 \
https://www.chromestatus.com   # URL to open. Defaults to about:blank.

chrome, Chrome yüklemenize işaret etmelidir. Tam konum, değişiklik gösterir. Mac kullandığım için uygun takma adlar oluşturdum her Chrome sürümünü çalıştırıyor.

Chrome'un mevcut ürün kanalındaysanız ve Beta sürümünü alamıyorsanız chrome-canary kullanılarak:

alias chrome="/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome"
alias chrome-canary="/Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary"
alias chromium="/Applications/Chromium.app/Contents/MacOS/Chromium"

Chrome Canary'yi buradan indirin.

Komut satırı özellikleri

Bazı durumlarda, gözetimsiz Chrome'u programatik olarak komut dosyası çalıştırmanız gerekmeyebilir. Bazı faydalı komut satırı işaretleri vardır. yaygın görevleri yerine getirmek için kullanılır.

DOM'yi yazdırma

--dump-dom işareti document.body.innerHTML öğesini stdout'a yazdırır:

    chrome --headless --disable-gpu --dump-dom https://www.chromestatus.com/

PDF oluşturun

--print-to-pdf işareti sayfanın PDF dosyasını oluşturur:

chrome --headless --disable-gpu --print-to-pdf https://www.chromestatus.com/

Ekran görüntüsü alma

Bir sayfanın ekran görüntüsünü almak için --screenshot işaretini kullanın:

chrome --headless --disable-gpu --screenshot https://www.chromestatus.com/

# Size of a standard letterhead.
chrome --headless --disable-gpu --screenshot --window-size=1280,1696 https://www.chromestatus.com/

# Nexus 5x
chrome --headless --disable-gpu --screenshot --window-size=412,732 https://www.chromestatus.com/

--screenshot ile çalıştırıldığında,screenshot.png mevcut çalışma dizinine ekleyin. Tam sayfa ekran görüntüleri arıyorsanız biraz daha karmaşıktır. Harika bir blog David Schnurr'dan bu iletiyi inceleyebilirsiniz. Ödeme yap Otomatik ekran görüntüsü aracı olarak gözetimsiz Chrome'u kullanma .

REPL modu (okuma-eval-yazdırma döngüsü)

--repl işareti, JS ifadelerini değerlendirebileceğiniz bir modda Gözetimsiz olarak çalışır doğrudan komut satırından:

$ chrome --headless --disable-gpu --repl --crash-dumps-dir=./tmp https://www.chromestatus.com/
[0608/112805.245285:INFO:headless_shell.cc(278)] Type a Javascript expression to evaluate or "quit" to exit.
>>> location.href
{"result":{"type":"string","value":"https://www.chromestatus.com/features"}}
>>> quit
$

Tarayıcı kullanıcı arayüzü olmadan Chrome'daki hata ayıklama işlemleri

Chrome'u --remote-debugging-port=9222 ile çalıştırdığınızda bir örnek başlatır Geliştirici Araçları protokolü etkinleştirilmiş olmalıdır. İlgili içeriği oluşturmak için kullanılan protokolü, Chrome ile iletişim kurmak ve gözetimsiz kurulumu yürütmek için kullanılır kullanabilirsiniz. Ayrıca Sublime, VS Code ve Node gibi araçlar, bir uygulamada uzaktan hata ayıklamak. #synergy

Sayfayı görüntülemek için tarayıcı kullanıcı arayüzünüz olmadığından http://localhost:9222 adresine gidin başka bir tarayıcıda açın. Bağlantı kurulduğunda Tıklayıp Gözetimsiz'in ne oluşturduğunu görebileceğiniz incelenebilir sayfalar:

Geliştirici Araçları Uzaktan Kumandası
Geliştirici Araçları uzaktan hata ayıklama kullanıcı arayüzü

Buradan, bildiğiniz Geliştirici Araçları özelliklerini kullanarak inceleme, hata ayıklama ve ince ayar yapabilirsiniz. normal şekilde açın. Gözetimsiz modeli programatik olarak kullanıyorsanız sayfası, tüm ham Geliştirici Araçları protokolünü görmek için güçlü bir hata ayıklama aracıdır. komutlar vererek kablonun başından sonuna kadar gezinmesini ve tarayıcıyla iletişim kurmasını sağlar.

Programlı olarak kullanma (Düğüm)

Kuklacı

Puppeteer, bir Düğüm kitaplığıdır Chrome ekibi tarafından geliştirilmiştir. Gözetimsiz kontrol için üst düzey bir API sunar. (veya tam donanımlı) Chrome'u seçin. Phantom gibi diğer otomatik test kitaplıklarına benzer ve NightmareJS'ye uygundur, ancak yalnızca Chrome'un son sürümleriyle çalışır.

Puppeteer, diğer işlevlerinin yanı sıra, kolayca ekran görüntüsü almak, PDF oluşturmak, ve bu sayfalarla ilgili bilgileri getirir. Kitaplığı öneririm tarayıcı testini hızlı bir şekilde otomatik hale getirmek istiyorsanız. Karmaşıklığı gizler son derece önemli görevleri yerine getirir. hata ayıklama örneğimize bakın.

Yükleyin:

npm i --save puppeteer

Örnek - kullanıcı aracısını yazdırma

const puppeteer = require('puppeteer');

(async() => {
  const browser = await puppeteer.launch();
  console.log(await browser.version());
  await browser.close();
})();

Örnek: Sayfanın ekran görüntüsünü alma

const puppeteer = require('puppeteer');

(async() => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://www.chromestatus.com', {waitUntil: 'networkidle2'});
  await page.pdf({path: 'page.pdf', format: 'A4'});

  await browser.close();
})();

Puppeteer'ın belgelerine göz atın ziyaret edin.

CRI kitaplığı

chrome-remote-interface Puppeteer API'sinden daha alt düzey bir kitaplıktır. istiyorsanız bunu öneririm yakın bir yerde bulun ve doğrudan Geliştirici Araçları protokolünü kullanın.

Chrome başlatılıyor

chrome-remote-interface Chrome sizin için başlamadığından, gerek yoktur.

KSA bölümünde, "Chrome'u manuel olarak başlattık" --headless --remote-debugging-port=9222. Ancak testleri tamamen otomatikleştirmek için uygulamanızdan Chrome'u oluşturmak istiyorsunuz.

Bunlardan biri child_process işlevini kullanmaktır:

const execFile = require('child_process').execFile;

function launchHeadlessChrome(url, callback) {
  // Assuming MacOSx.
  const CHROME = '/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome';
  execFile(CHROME, ['--headless', '--disable-gpu', '--remote-debugging-port=9222', url], callback);
}

launchHeadlessChrome('https://www.chromestatus.com', (err, stdout, stderr) => {
  ...
});

Ancak birden fazla cihazda çalışan taşınabilir bir çözüm arıyorsanız işler zor olabilir. platformlar. Chrome'a giden şu sabit kodlu yola bakmanız yeterli :(

ChromeLauncher'ı kullanma

Lighthouse olağanüstü bir web uygulamalarınızın kalitesini test etmenize yardımcı olan bir araçtır. Lansman için güçlü bir modül Chrome, Lighthouse içinde geliştirilmiştir ve artık bağımsız kullanım için çıkarılmaktadır. chrome-launcher NPM modülü nerede duracağını Chrome yüklendi, hata ayıklama örneği oluşturun, tarayıcıyı başlatın ve sonlandırın çok önemlidir. Bunun en iyi yanı, farklı platformlarda Düğüm!

Varsayılan olarak chrome-launcher, Chrome Canary'yi başlatmaya çalışır (Chrome Canary'de yüklü olur), ancak hangi Chrome'un kullanılacağını manuel olarak seçmek için bunu değiştirebilirsiniz. Alıcı: kullanın, önce npm'den yükleyin:

npm i --save chrome-launcher

Örnek: Gözetimsiz modu başlatmak için chrome-launcher kullanma

const chromeLauncher = require('chrome-launcher');

// Optional: set logging level of launcher to see its output.
// Install it using: npm i --save lighthouse-logger
// const log = require('lighthouse-logger');
// log.setLevel('info');

/**
 * Launches a debugging instance of Chrome.
 * @param {boolean=} headless True (default) launches Chrome in headless mode.
 *     False launches a full version of Chrome.
 * @return {Promise<ChromeLauncher>}
 */
function launchChrome(headless=true) {
  return chromeLauncher.launch({
    // port: 9222, // Uncomment to force a specific port of your choice.
    chromeFlags: [
      '--window-size=412,732',
      '--disable-gpu',
      headless ? '--headless' : ''
    ]
  });
}

launchChrome().then(chrome => {
  console.log(`Chrome debuggable on port: ${chrome.port}`);
  ...
  // chrome.kill();
});

Bu komut dosyasının çalıştırılması pek işe yaramaz ancak Chrome, about:blank ürününü yükleyen görev yöneticisinde etkinleşir. Unutmayın, herhangi bir tarayıcının kullanıcı arayüzü olmayacaktır. Gözetimsiziz.

Tarayıcıyı kontrol etmek için Geliştirici Araçları protokolüne ihtiyacımız var.

Sayfa hakkında bilgi alınıyor

Kitaplığı yükleyelim:

npm i --save chrome-remote-interface
Örnekler

Örnek - kullanıcı aracısını yazdırma

const CDP = require('chrome-remote-interface');

...

launchChrome().then(async chrome => {
  const version = await CDP.Version({port: chrome.port});
  console.log(version['User-Agent']);
});

Şuna benzer şekilde sonuçlanıyor: HeadlessChrome/60.0.3082.0

Örnek: Sitenin bir web uygulaması manifesti içerip içermediğini kontrol edin.

const CDP = require('chrome-remote-interface');

...

(async function() {

const chrome = await launchChrome();
const protocol = await CDP({port: chrome.port});

// Extract the DevTools protocol domains we need and enable them.
// See API docs: https://chromedevtools.github.io/devtools-protocol/
const {Page} = protocol;
await Page.enable();

Page.navigate({url: 'https://www.chromestatus.com/'});

// Wait for window.onload before doing stuff.
Page.loadEventFired(async () => {
  const manifest = await Page.getAppManifest();

  if (manifest.url) {
    console.log('Manifest: ' + manifest.url);
    console.log(manifest.data);
  } else {
    console.log('Site has no app manifest');
  }

  protocol.close();
  chrome.kill(); // Kill Chrome.
});

})();

Örnek - DOM API'lerini kullanarak sayfanın <title> öğesini çıkarın.

const CDP = require('chrome-remote-interface');

...

(async function() {

const chrome = await launchChrome();
const protocol = await CDP({port: chrome.port});

// Extract the DevTools protocol domains we need and enable them.
// See API docs: https://chromedevtools.github.io/devtools-protocol/
const {Page, Runtime} = protocol;
await Promise.all([Page.enable(), Runtime.enable()]);

Page.navigate({url: 'https://www.chromestatus.com/'});

// Wait for window.onload before doing stuff.
Page.loadEventFired(async () => {
  const js = "document.querySelector('title').textContent";
  // Evaluate the JS expression in the page.
  const result = await Runtime.evaluate({expression: js});

  console.log('Title of page: ' + result.result.value);

  protocol.close();
  chrome.kill(); // Kill Chrome.
});

})();

Selenium, WebDriver ve ChromeDriver'ı kullanma

Selenium şu anda Chrome'un tam bir örneğini açmaktadır. Başka bir deyişle, tamamen gözetimsiz olmasa da otomatik bir çözüm sunuyor. Ancak Selenyum gözetimsiz Chrome'u çalıştırmak üzere yapılandırılmıştır. Önerim Gözetimsiz Chrome ile Selenyum Çalıştırma CANNOT TRANSLATE onları nasıl kuracağınıza ilişkin talimatların tamamını burada bulabilirsiniz. aşağıdaki örneklere göz atın.

ChromeDriver'ı kullanma

ChromeDriver 2.32 Chrome 61 sürümünü kullanır ve gözetimsiz Chrome ile iyi performans gösterir.

Yükleme:

npm i --save-dev selenium-webdriver chromedriver

Örnek:

const fs = require('fs');
const webdriver = require('selenium-webdriver');
const chromedriver = require('chromedriver');

const chromeCapabilities = webdriver.Capabilities.chrome();
chromeCapabilities.set('chromeOptions', {args: ['--headless']});

const driver = new webdriver.Builder()
  .forBrowser('chrome')
  .withCapabilities(chromeCapabilities)
  .build();

// Navigate to google.com, enter a search.
driver.get('https://www.google.com/');
driver.findElement({name: 'q'}).sendKeys('webdriver');
driver.findElement({name: 'btnG'}).click();
driver.wait(webdriver.until.titleIs('webdriver - Google Search'), 1000);

// Take screenshot of results page. Save to disk.
driver.takeScreenshot().then(base64png => {
  fs.writeFileSync('screenshot.png', new Buffer(base64png, 'base64'));
});

driver.quit();

WebDriverIO'yu kullanma

WebDriverIO, Selenium WebDriver'ın üzerinde yer alan daha üst düzey bir API'dir.

Yükleme:

npm i --save-dev webdriverio chromedriver

Örnek: chromestatus.com'da CSS özelliklerini filtreleme

const webdriverio = require('webdriverio');
const chromedriver = require('chromedriver');

const PORT = 9515;

chromedriver.start([
  '--url-base=wd/hub',
  `--port=${PORT}`,
  '--verbose'
]);

(async () => {

const opts = {
  port: PORT,
  desiredCapabilities: {
    browserName: 'chrome',
    chromeOptions: {args: ['--headless']}
  }
};

const browser = webdriverio.remote(opts).init();

await browser.url('https://www.chromestatus.com/features');

const title = await browser.getTitle();
console.log(`Title: ${title}`);

await browser.waitForText('.num-features', 3000);
let numFeatures = await browser.getText('.num-features');
console.log(`Chrome has ${numFeatures} total features`);

await browser.setValue('input[type="search"]', 'CSS');
console.log('Filtering features...');
await browser.pause(1000);

numFeatures = await browser.getText('.num-features');
console.log(`Chrome has ${numFeatures} CSS features`);

const buffer = await browser.saveScreenshot('screenshot.png');
console.log('Saved screenshot...');

chromedriver.stop();
browser.end();

})();

Diğer kaynaklar

Başlamanıza yardımcı olacak bazı faydalı kaynakları aşağıda bulabilirsiniz:

Belgeler

Araçlar

  • chrome-remote-interface - düğüm DevTools protokolünü sarmalayan modül
  • Lighthouse: Test amaçlı otomatik araç web uygulaması kalitesi; protokolü yoğun bir şekilde kullanır
  • chrome-launcher - Chrome'u başlatmak için kullanılan, otomasyona hazır düğüm modülü

Demolar

  • "The Headless Web" (Gözetimsiz Web) - Paul Kinlan'ın harika blogu api.ai ile Gözetimsiz Kullanımı hakkındaki gönderiyi paylaşın.

SSS

--disable-gpu işaretine ihtiyacım var mı?

Yalnızca Windows'da. Diğer platformlar artık bunu gerektirmiyor. --disable-gpu işareti ve geçici bir çözüm olarak düşünebilirsiniz. Şu uygulamanın sonraki sürümlerinde bu bayrağa ihtiyacınız olmayacak: Chrome'a dokunun. crbug.com/737678 adresine bakın konulu videomuzu izleyin.

Xvfb'ye hâlâ ihtiyacım var mı?

Hayır. Gözetimsiz Chrome'da pencere kullanılmadığından Xvfb gibi bir görüntüleme sunucusu artık gerekmiyor. Bu API olmadan otomatik testlerinizi memnuniyetle gerçekleştirebilirsiniz.

Xvfb nedir? Xvfb, Unix benzeri sistemler için tasarlanmış bir bellek içi görüntüleme sunucusudur ve fiziksel bir ekran olmadan grafik uygulamalarını (Chrome gibi) çalıştırmak için. Birçok kişi "gözetimsiz" yapmak için Chrome'un önceki sürümlerini çalıştırmak üzere Xvfb'yi kullanır teşvik etmek anlamına gelir.

Gözetimsiz Chrome çalıştıran bir Docker container'ı nasıl oluşturabilirim?

fener-ci sitesine göz atın. Bir örnek Dockerfile temel resim olarak node:8-slim kullanan, Lighthouse'u çalıştırıyor devam ediyor.

Bunu Selenyum / WebDriver / ChromeDriver ile kullanabilir miyim?

Evet. Selenium, WebDriver ve ChromeDriver'ı Kullanma başlıklı makaleye bakın.

Bunun PhantomJS ile olan ilişkisi nedir?

Gözetimsiz Chrome, PhantomJS gibi araçlara benzer. Her ikisi gözetimsiz bir ortamda otomatik test için kullanılabilir. Temel fark arasındaki fark, Phantom'un oluşturma işlemi için WebKit'in eski bir sürümünü kullanmasıdır. aracını da kullanabilirsiniz.

Şu anda Phantom, DevTools protokolünden daha yüksek düzeyde bir API de sunmaktadır.

Hataları nereye bildirebilirim?

Headless Chrome ile ilgili hataları crbug.com adresinden bildirin.

Geliştirici Araçları protokolündeki hataları github.com/ChromeDevTools/devtools-protocol adresinden bildirebilirsiniz.