साल 2017 में, Chrome 59 ने हेडलेस मोड लॉन्च किया. इस मोड की मदद से, ब्राउज़र को यूज़र इंटरफ़ेस (यूआई) के बिना, ऐसी जगह पर चलाया जा सकता है जिसका ऐक्सेस न हो. ज़रूरी है कि आप Chrome के बिना भी Chrome चला सकें.
Puppeteer या ChromeDriver जैसे प्रोजेक्ट के ज़रिए, ब्राउज़र ऑटोमेशन के लिए हेडलेस मोड काफ़ी लोकप्रिय है. यहां दिए गए यूआरएल की PDF फ़ाइल बनाने के लिए, हेडलेस मोड का इस्तेमाल करके, कमांड-लाइन का उदाहरण दिया गया है:
chrome --headless --print-to-pdf https://developer.chrome.com/
बिना ग्राफ़िक यूज़र इंटरफ़ेस वाला ब्राउज़र इस्तेमाल कैसे काम करता है
हेडलेस (सिर्फ़ बैक-एंड पर काम करने की सुविधा) कैसे काम करती है, इसकी समीक्षा करने से पहले, यह जानना ज़रूरी है
कि "पुराना" हेडलेस सिस्टम कैसे काम करता था. पिछले कमांड-लाइन स्निपेट में --headless
कमांड लाइन फ़्लैग का इस्तेमाल किया गया है. इससे पता चलता है कि हेडलेस, सामान्य Chrome ब्राउज़र पर सिर्फ़ एक मोड है. हैरानी की बात है कि असल में ऐसा नहीं था.
असल में, हेडलेस (सिर्फ़ बैक-एंड पर काम करने की सुविधा) अलग-अलग और वैकल्पिक ब्राउज़र को लागू करने की सुविधा थी. इसे उसी Chrome बाइनरी के हिस्से के तौर पर शिप किया गया था. //chrome
में, Chrome ब्राउज़र का कोई कोड शेयर नहीं किया जाता.
एक अलग हेडलेस (सिर्फ़ बैक-एंड पर काम करने की सुविधा देने वाला) ब्राउज़र इस्तेमाल करने और उसे मैनेज करने के लिए, कई काम करने पड़ते हैं. हेडलेस सिस्टम को लागू करने का एक अलग तरीका था. इसलिए, इसमें कुछ गड़बड़ियां और सुविधाएं थीं, जो हेडफ़ुल Chrome में मौजूद नहीं थीं. इससे, ऑटोमेटेड ब्राउज़र के टेस्ट में भ्रम पैदा हो सकता था, जो हेडफ़ुल मोड में पास हो सकता है, लेकिन हेडलेस मोड में या इसके उलटा हो सकता है.
इसके अलावा, हेडलेस ने अपने-आप होने वाली हर उस टेस्टिंग को शामिल नहीं किया जो ब्राउज़र एक्सटेंशन इंस्टॉल करने के भरोसे थी. ब्राउज़र लेवल के अन्य फ़ंक्शन पर भी यही बात लागू होती है; अगर हेडलेस की सुविधा के लिए, इसे अलग से लागू नहीं किया जाता था, तो यह काम नहीं करता था.
Chrome टीम ने अब हेडलेस और हेडफ़ुल मोड को एक साथ जोड़ दिया है.
Chrome 112 में, बिना ग्राफ़िक यूज़र इंटरफ़ेस वाला नया मोड उपलब्ध है. इस मोड में, Chrome कोई प्लैटफ़ॉर्म विंडो बनाता है, लेकिन उसे दिखाता नहीं है. अन्य सभी फ़ंक्शन, चाहे वे मौजूदा हों या आने वाले समय में, बिना किसी सीमा के उपलब्ध हैं.
बिना ग्राफ़िक यूज़र इंटरफ़ेस वाला मोड इस्तेमाल करें
नए हेडलेस मोड का इस्तेमाल करने के लिए, --headless=new
कमांड-लाइन फ़्लैग को पास करें:
chrome --headless=new
फ़िलहाल, बिना ग्राफ़िक यूज़र इंटरफ़ेस वाला पुराना मोड, अब भी इनके साथ उपलब्ध है:
chrome --headless=old
इन पपीटीयर
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();
Celenium-WebDriver में
Selenium-WebDriver में नए हेडलेस मोड का इस्तेमाल करने के लिए:
const driver = await env
.builder()
.setChromeOptions(options.addArguments('--headless=new'))
.build();
await driver.get('https://developer.chrome.com/');
// …
await driver.quit();
ज़्यादा जानकारी के लिए, Selenium टीम की ब्लॉग पोस्ट देखें. इसमें, भाषा की अन्य बाइंडिंग के उदाहरण भी शामिल हैं.
कमांड लाइन फ़्लैग
बिना ग्राफ़िक यूज़र इंटरफ़ेस वाले नए मोड में, यहां दिए गए कमांड लाइन फ़्लैग उपलब्ध हैं.
--dump-dom
--dump-dom
फ़्लैग, टारगेट पेज के सीरियल वाले DOM को stdout पर प्रिंट करता है.
उदाहरण के लिए:
chrome --headless=new --dump-dom https://developer.chrome.com/
यह एचटीएमएल सोर्स कोड को प्रिंट करने से अलग है. एचटीएमएल सोर्स कोड को curl
की मदद से प्रिंट किया जा सकता है. आपको --dump-dom
का आउटपुट देने के लिए, Chrome सबसे पहले एचटीएमएल कोड को डीओएम में पार्स करता है और ऐसे किसी भी <script>
को एक्ज़ीक्यूट करता है जिससे डीओएम में बदलाव हो सकता है. इसके बाद, उस डीओएम को वापस एचटीएमएल की सीरियल स्ट्रिंग में बदल देता है.
--screenshot
--screenshot
फ़्लैग, टारगेट पेज का स्क्रीनशॉट लेता है. साथ ही, उसे मौजूदा डायरेक्ट्री में screenshot.png
के तौर पर सेव करता है. यह खास तौर पर, --window-size
फ़्लैग के साथ
मिलकर काम करने में मददगार होता है.
उदाहरण के लिए:
chrome --headless=new --screenshot --window-size=412,892 https://developer.chrome.com/
--print-to-pdf
--print-to-pdf
फ़्लैग, टारगेट पेज को मौजूदा डायरेक्ट्री में output.pdf
नाम के PDF के तौर पर सेव करता है. उदाहरण के लिए:
chrome --headless=new --print-to-pdf https://developer.chrome.com/
इसके अलावा, प्रिंट हेडर (मौजूदा तारीख और समय के साथ) और फ़ुटर (यूआरएल और पेज नंबर के साथ) को हटाने के लिए, --no-pdf-header-footer
फ़्लैग जोड़ा जा सकता है.
chrome --headless=new --print-to-pdf --no-pdf-header-footer https://developer.chrome.com/
नहीं: --no-pdf-header-footer
फ़्लैग वाली सुविधा पहले
--print-to-pdf-no-header
फ़्लैग के साथ उपलब्ध थी. अगर पुराने वर्शन का इस्तेमाल किया जा रहा है, तो हो सकता है कि आपको फ़्लैग का पुराना नाम इस्तेमाल करना पड़े.
--timeout
--timeout
फ़्लैग ज़्यादा से ज़्यादा इंतज़ार के समय (मिलीसेकंड में) के बारे में बताता है जिसके बाद --dump-dom
, --screenshot
, और --print-to-pdf
पेज का कॉन्टेंट कैप्चर करते हैं. भले ही, पेज अब भी लोड हो रहा हो.
chrome --headless=new --print-to-pdf --timeout=5000 https://developer.chrome.com/
--timeout=5000
फ़्लैग, Chrome को PDF प्रिंट करने से पहले पांच सेकंड तक इंतज़ार करने के लिए कहता है. इसलिए, इस प्रोसेस को चलने में ज़्यादा से ज़्यादा पांच सेकंड लगते हैं.
--virtual-time-budget
--virtual-time-budget
किसी भी समय-निर्भर कोड के लिए "फ़ास्ट फ़ॉरवर्ड" की तरह काम करता है
(उदाहरण के लिए, setTimeout
/setInterval
). यह ब्राउज़र को पेज के किसी भी कोड को जल्द से जल्द एक्ज़ीक्यूट करने के लिए मजबूर करता है,
जिससे पेज को लगता है कि असल में समय बीत चुका है.
इसके इस्तेमाल को समझने के लिए, इस डेमो को ध्यान में रखें. यह setTimeout(fn, 1000)
का इस्तेमाल करके हर सेकंड बढ़ाता है, दिखाता है, और दिखाता है सही कोड यहां दिया गया है:
<output>0</output>
<script>
const element = document.querySelector('output');
let counter = 0;
setInterval(() => {
counter++;
console.log(counter);
element.textContent = counter;
}, 1_000);
</script>
एक सेकंड के बाद, पेज में "1" होता है; दो सेकंड के बाद "2" वगैरह. यहां बताया गया है कि 42 सेकंड के बाद, पेज की स्थिति को कैप्चर करके PDF के तौर पर कैसे सेव किया जाएगा:
chrome --headless=new --print-to-pdf --virtual-time-budget=42000 https://mathiasbynens.be/demo/time
--allow-chrome-scheme-url
chrome://
यूआरएल को ऐक्सेस करने के लिए, --allow-chrome-scheme-url
फ़्लैग की ज़रूरत होती है.
यह फ़्लैग Chrome 123 से उपलब्ध है. यहां एक उदाहरण दिया गया है:
chrome --headless=new --print-to-pdf --allow-chrome-scheme-url chrome://gpu
डीबग
Chrome, हेडलेस मोड में पूरी तरह से नहीं दिखता है. इसलिए, किसी समस्या को हल करना मुश्किल लग सकता है. बिना ग्राफ़िक यूज़र इंटरफ़ेस वाले Chrome को इस तरह से डीबग किया जा सकता है कि यह हेडफ़ुल Chrome से काफ़ी मिलता-जुलता है.
--remote-debugging-port
कमांड-लाइन फ़्लैग का इस्तेमाल करके, Chrome को हेडलेस मोड में लॉन्च करें.
chrome --headless=new --remote-debugging-port=0 https://developer.chrome.com/
यह stdout पर एक यूनीक WebSocket यूआरएल प्रिंट करता है, उदाहरण के लिए:
DevTools listening on ws://127.0.0.1:60926/devtools/browser/b4bd6eaa-b7c8-4319-8212-225097472fd9
हेडफ़ुल Chrome इंस्टेंस में, हम Chrome DevTools रिमोट डीबगिंग का इस्तेमाल करके, हेडलेस टारगेट से कनेक्ट कर सकते हैं और उसकी जांच कर सकते हैं.
chrome://inspect
पर जाएं और कॉन्फ़िगर करें... बटन पर क्लिक करें.- WebSocket यूआरएल से आईपी पता और पोर्ट नंबर डालें.
- पिछले उदाहरण में, मैंने
127.0.0.1:60926
डाला था.
- पिछले उदाहरण में, मैंने
- हो गया पर क्लिक करें. आपको एक रिमोट टारगेट दिखेगा, जिसमें उसके सभी टैब और सूची में मौजूद दूसरे टारगेट दिखेंगे.
- Chrome DevTools को ऐक्सेस करने के लिए, जांच करें पर क्लिक करें और रिमोट के बिना किए गए टारगेट की जांच करें. इसमें पेज का लाइव व्यू भी शामिल है.
सुझाव/राय दें या शिकायत करें
हमें हेडलेस (सिर्फ़ बैक-एंड पर काम करने की सुविधा) मोड के बारे में, आपके सुझाव, शिकायत या राय का इंतज़ार रहेगा. अगर कोई समस्या आती है, तो गड़बड़ी की शिकायत करें.