अक्सर पूछे जाने वाले सवाल

क्रॉस-ब्राउज़र सपोर्ट की क्या स्थिति है?

Firefox का आधिकारिक सहायता प्रयोग के तौर पर उपलब्ध है. Mozilla के साथ मिलकर काम करने का मकसद, शुरुआत से अंत तक के टेस्टिंग के सामान्य उदाहरणों को सपोर्ट करना है. इसके लिए, डेवलपर क्रॉस-ब्राउज़र कवरेज की उम्मीद करते हैं. Puppeteer टीम को Firefox के सहायता को स्थिर करने और छूटे हुए API को हमारे ध्यान में लाने के लिए उपयोगकर्ताओं से इनपुट की ज़रूरत होती है.

Puppeteer v2.1.0 के बाद से, आपको puppeteer.launch({product: 'firefox'}) Firefox Nightly में अपनी Puppeteer स्क्रिप्ट को चलाने के लिए, अलग से कोई कस्टम पैच के बिना
तय करने की सुविधा मिलती है. पुराने प्रयोग के लिए Firefox के पैच किए गए वर्शन की ज़रूरत होती थी, लेकिन मौजूदा तरीका "stock" Firefox के साथ काम करता है.

हम Safari जैसे ब्राउज़र पर Puppeteer की सुविधा उपलब्ध कराने के लिए, दूसरे ब्राउज़र वेंडर के साथ मिलकर काम करते रहते हैं. इस कोशिश में, क्रॉस-ब्राउज़र कमांड को चलाने के लिए, एक स्टैंडर्ड एक्सप्लोर करना भी शामिल है. Chrome पर इस्तेमाल किए जाने वाले नॉन-स्टैंडर्ड DevTools पर भरोसा करने के बजाय, इस प्रोटोकॉल का इस्तेमाल किया जाता है.

Puppeteer के मकसद और सिद्धांत क्या हैं?

प्रोजेक्ट के लक्ष्य हैं:

  • एक छोटी और कैननिकल लाइब्रेरी उपलब्ध कराएं, जिसमें DevTools प्रोटोकॉल की क्षमताओं को हाइलाइट किया गया हो.
  • मिलती-जुलती टेस्टिंग लाइब्रेरी के लिए, रेफ़रंस लागू करें. आने वाले समय में, ये दूसरे फ़्रेमवर्क Puppeteer को अपने बुनियादी लेयर के तौर पर शामिल कर सकते हैं.
  • बिना ग्राफ़िक यूज़र इंटरफ़ेस वाले ब्राउज़र/ऑटोमेटेड ब्राउज़र टेस्टिंग की सुविधा को ज़्यादा से ज़्यादा लोगों तक पहुंचाएं.
  • DevTools प्रोटोकॉल की नई सुविधाएं आज़माने में मदद करें...और गड़बड़ियां पाएं!
  • ब्राउज़र को अपने-आप होने वाली टेस्टिंग से जुड़ी समस्याओं के बारे में ज़्यादा जानें और उन समस्याओं को हल करने में मदद करें.

हम प्रॉडक्ट से जुड़े फ़ैसले लेने के लिए, Chromium के सिद्धांतों को अपनाते हैं:

  • स्पीड: Puppeteer ने अपने-आप काम करने वाले किसी पेज पर, परफ़ॉर्मेंस पर करीब ज़ीरो ओवरहेड का इस्तेमाल किया है.
  • सुरक्षा: Chromium में Puppeteer प्रोसेस के अलावा, दूसरे प्रोसेस से काम करता है, जिससे नुकसान पहुंचाने वाले पेजों को ऑटोमेट करना सुरक्षित हो जाता है.
  • स्थिरता: Puppeteer को अस्थिर नहीं होना चाहिए और मेमोरी लीक नहीं होनी चाहिए.
  • आसान तरीका: Puppeteer में हाई-लेवल एपीआई उपलब्ध है. यह इस्तेमाल करने, समझने, और डीबग करने में आसान है.

क्या Puppeteer ने सेलियम/वेबड्राइवर की जगह ली है?

नहीं. दोनों प्रोजेक्ट बहुत अलग-अलग वजहों से अहम हैं:

  • Selenium/WebDriver, क्रॉस-ब्राउज़र ऑटोमेशन पर फ़ोकस करता है. इसकी खास बात, ऐसा एक स्टैंडर्ड एपीआई है जो सभी मुख्य ब्राउज़र पर काम करता है.
  • Puppeteer ने Chromium पर फ़ोकस किया है. इसकी खास बात यह है कि इसमें ज़्यादा सुविधाएं और भरोसा होता है.

हालांकि, Chromium की जांच करने के लिए Puppeteer का इस्तेमाल किया जा सकता है. जैसे, कम्यूनिटी के साथ काम करने वाले jest-ppeteer का इस्तेमाल करना. हालांकि, टेस्टिंग करने के लिए शायद यही आपका एकमात्र समाधान न हो, लेकिन WebDriver की तुलना में इसके कुछ अच्छे पॉइंट हैं:

  • Puppeteer को ज़ीरो सेटअप की ज़रूरत होती है. यह Chromium के उस वर्शन के साथ आता है जिस पर यह सबसे अच्छी तरह काम करता है. कोई भी टेस्ट न करने के बजाय, सिर्फ़ Chromium के लिए कुछ टेस्ट चलाना बेहतर है.
  • Puppeteer में इवेंट-प्रेरित आर्किटेक्चर है, जो बहुत सारी संभावित समस्याओं को दूर करता है. कठपुतली स्क्रिप्ट में बुरे "sleep(1000)" वाले कॉल की कोई ज़रूरत नहीं होती.
  • Puppeteer डिफ़ॉल्ट रूप से बिना ग्राफ़िक यूज़र इंटरफ़ेस के चलता है, जिससे यह तेज़ी से चलता है. Puppeteer v1.5.0 में ब्राउज़र के कॉन्टेक्स्ट भी दिखाए जाते हैं, जिससे टेस्ट एक्ज़ीक्यूशन को असरदार तरीके से साथ-साथ लोड किया जा सकता है.
  • जब डीबग करने की बात आती है, तब Puppeteer को ज़्यादा मदद मिलती है: "बिना ग्राफ़िक यूज़र इंटरफ़ेस के" बिट को गलत पर सेट करें, "slowMo" जोड़ें, और आपको पता चल जाएगा कि ब्राउज़र क्या कर रहा है. टेस्ट एनवायरमेंट की जांच करने के लिए, Chrome DevTools भी खोला जा सकता है.

Puppeteer v.XXX, Chromium v.YYY के साथ काम क्यों नहीं करता है?

हम Puppeteer को Chromium की मदद से, न दिखाई देने वाली इकाई के तौर पर देखते हैं. Puppeteer का हर वर्शन Chromium के एक खास वर्शन को बंडल करता है – एकमात्र वर्शन जिसके साथ काम करने की गारंटी दी जाती है.

यह कोई आर्टिफ़िशियल कंस्ट्रेंट नहीं है. Puppeteer पर ज़्यादातर काम, वाकई Chromium के डेटा स्टोर करने की जगह में हो रहा है. यह रही एक खास खबर:

  1. कठपुतली बग की शिकायत की गई
  2. यह DevTools प्रोटोकॉल की समस्या है. इसलिए, हम इसे Chromium में ठीक करते हैं
  3. अपस्ट्रीम ठीक होने के बाद, हम Chromium को Puppeteer में अपडेट कर देते हैं

हालांकि, अक्सर Chromium के बजाय आधिकारिक Google Chrome के साथ Puppeteer का इस्तेमाल करना बेहतर होता है. यह सुविधा काम करे, इसके लिए आपको puppeteer-core का ऐसा वर्शन इंस्टॉल करना होगा जो Chrome के वर्शन से मेल खाता हो.

उदाहरण के लिए, puppeteer-core के साथ Chrome 101 चलाने के लिए, chrome-101 npm टैग का इस्तेमाल करें:

npm install puppeteer-core@chrome-101

Puppeteer पेज पर, Chromium के किस वर्शन का इस्तेमाल किया जाता है?

इनमें से किसी एक तरीके का इस्तेमाल करके वर्शन का पता लगाएं:

  • revisions.ts में chromium एंट्री देखें. Chromium में इससे जुड़े कमिट और वर्शन नंबर को ढूंढने के लिए, OmahaProxy के "रिलीज़ खोजें" सेक्शन में r से प्रीफ़िक्स वाला वर्शन खोजें.
  • versions.js में versionsPerRelease मैप खोजें, जिसमें Chromium और Puppeteer वर्शन के बीच मैप करने की सुविधा शामिल है. ध्यान दें: फ़ाइल में सिर्फ़ Puppeteer के ऐसे वर्शन हैं जिनमें Chromium अपडेट है. सूची में Puppeteer के सभी वर्शन नहीं दिए गए हैं.

Puppeteer में Firefox का कौनसा वर्शन इस्तेमाल किया जाता है?

Firefox के साथ काम करने की सुविधा, एक्सपेरिमेंट के तौर पर उपलब्ध है. इसलिए, जब PUPPETEER_PRODUCT का एनवायरमेंट वैरिएबल firefox पर सेट होता है, तब Puppeteer ने Firefox Nightly का सबसे नया वर्शन डाउनलोड किया. इसी वजह से revisions.ts में firefox की वैल्यू latest है -- Puppeteer सुविधा को Firefox के किसी खास वर्शन से नहीं जोड़ा जा सकता.

Puppeteer इंस्टॉलेशन के हिस्से के रूप में Firefox Nightly को फ़ेच करने के लिए:

PUPPETEER_PRODUCT=firefox npm i puppeteer
# or "yarn add puppeteer"

नेविगेशन किसे माना जाता है?

Puppeteer के हिसाब से, "नेविगेशन" एक ऐसी चीज़ है जो किसी पेज के यूआरएल में बदलाव करती है. सामान्य नेविगेशन के अलावा, जहां ब्राउज़र, वेब सर्वर से नया दस्तावेज़ फ़ेच करने के लिए नेटवर्क पर जाता है, इसमें ऐंकर नेविगेशन और इतिहास एपीआई का इस्तेमाल शामिल है.

"नेविगेशन" की इस परिभाषा के साथ, Puppeteer एक पेज वाले ऐप्लिकेशन के साथ आसानी से काम करता है.

"भरोसेमंद" और "भरोसेमंद" इनपुट इवेंट में क्या अंतर है?

ब्राउज़र में, इनपुट इवेंट को दो बड़े ग्रुप में बांटा जा सकता है: भरोसेमंद बनाम गैर-भरोसेमंद.

  • भरोसेमंद इवेंट: ऐसे इवेंट जो पेज से इंटरैक्ट करने वाले उपयोगकर्ताओं की तरफ़ से जनरेट किए जाते हैं, जैसे कि माउस या कीबोर्ड का इस्तेमाल करके.
  • गैर-भरोसेमंद इवेंट: वेब एपीआई से जनरेट किए गए इवेंट, जैसे कि document.createEvent या element.click() तरीके.

वेबसाइटें इन दो ग्रुप के बीच अंतर कर सकती हैं:

  • Event.isTrusted इवेंट फ़्लैग का इस्तेमाल करके
  • स्निफ़िंग से जुड़े वीडियो. उदाहरण के लिए, हर भरोसेमंद 'click' इवेंट से पहले 'mousedown' और 'mouseup' इवेंट होते हैं.

ऑटोमेशन के लिए, भरोसेमंद इवेंट जनरेट करना ज़रूरी है. Puppeteer से जनरेट हुए सभी इनपुट इवेंट भरोसेमंद होते हैं और उनके साथ सही इवेंट फ़ायर होते हैं.

अगर किसी वजह से किसी ऐसे इवेंट की ज़रूरत हो जिस पर भरोसा न किया जा सके, तो page.evaluate के साथ पेज के कॉन्टेक्स्ट में जाकर, नकली इवेंट जनरेट किया जा सकता है:

await page.evaluate(() => {
  document.querySelector('button[type=submit]').click();
});

Puppeteer किन सुविधाओं के साथ काम नहीं करता?

ऑडियो और वीडियो वाले पेजों को कंट्रोल करते समय, शायद Puppeteer उम्मीद के मुताबिक काम नहीं कर रहा हो. उदाहरण के लिए, ऐसा हो सकता है कि वीडियो चलाने और स्क्रीनशॉट लेने में परेशानी हो.) ऐसा होने की दो वजहें होती हैं:

  • Puppeteer को Chromium के साथ बंडल किया गया है, न कि Chrome के साथ. इसलिए, डिफ़ॉल्ट रूप से, यह Chromium की मीडिया से जुड़ी सभी सीमाएं इनहेरिट करता है. इसका मतलब है कि Puppeteer लाइसेंस वाले फ़ॉर्मैट पर काम नहीं करता, जैसे कि AAC या H.264.
    • ऐसा हो सकता है कि Puppeteer को Chromium के बजाय, executablePath के विकल्प puppeteer.launch के बजाय, Chrome के बजाय अलग से इंस्टॉल किए गए वर्शन का इस्तेमाल करने के लिए मजबूर किया जा सके. आपको इस कॉन्फ़िगरेशन का इस्तेमाल सिर्फ़ तब करना चाहिए, जब आपको Chrome की ऐसी आधिकारिक रिलीज़ की ज़रूरत हो जो इन मीडिया फ़ॉर्मैट के साथ काम करती हो.
  • Puppeteer (सभी कॉन्फ़िगरेशन में) की मदद से, Chromium या Chrome के डेस्कटॉप वर्शन को कंट्रोल किया जाता है. इसलिए, वे सुविधाएं काम नहीं करती हैं जो सिर्फ़ Chrome के मोबाइल वर्शन पर काम करती हैं. इसका मतलब है कि Puppeteer पर एचटीटीपी लाइव स्ट्रीमिंग (HLS) की सुविधा काम नहीं करती.

मुझे टेस्ट एनवायरमेंट में Puppeteer को इंस्टॉल करने / चलाने में समस्या आ रही है. मुझे मदद कहां से मिल सकती है?

हमारे पास अलग-अलग ऑपरेटिंग सिस्टम के लिए, समस्या हल करने की गाइड मौजूद है. इसमें ज़रूरी डिपेंडेंसी की सूची होती है.

हर npm ci बार चलाने पर Chromium डाउनलोड हो जाता है. डाउनलोड की गई फ़ाइलों को कैश मेमोरी में कैसे सेव किया जा सकता है?

डाउनलोड का डिफ़ॉल्ट पाथ node_modules/puppeteer/.local-chromium है. हालांकि, PUPPETEER_DOWNLOAD_PATH एनवायरमेंट वैरिएबल से उस पाथ को बदला जा सकता है.

लॉन्च के दौरान, Puppeteer उस वैरिएबल का इस्तेमाल करके Chromium की एक्ज़ीक्यूटेबल जगह का समाधान करता है. इसलिए, आपको PUPPETEER_EXECUTABLE_PATH की जानकारी देने की ज़रूरत नहीं है.

उदाहरण के लिए, Chromium के डाउनलोड को ~/.npm/chromium में बनाए रखने के लिए:

export PUPPETEER_DOWNLOAD_PATH=~/.npm/chromium
npm ci

# by default the Chromium executable path is inferred
# from the download path
npm test

# a new run of npm ci will check for the existence of
# Chromium in ~/.npm/chromium
npm ci

मेरे पास और सवाल हैं! मैं कहां पूछूं?

Puppeteer पर मदद पाने के कई तरीके हैं:

अपना सवाल पोस्ट करने से पहले, इन चैनलों को ज़रूर खोजें.