Ö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:
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
- DevAraçlar Protokol Görüntüleyici - API referans belgeleri
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.