سوالات متداول

وضعیت پشتیبانی از مرورگرهای متقابل چگونه است؟

پشتیبانی رسمی فایرفاکس آزمایشی است. هدف از همکاری مداوم با موزیلا، پشتیبانی از موارد استفاده از آزمایش‌های پایان به انتها است، که توسعه‌دهندگان انتظار پوشش بین مرورگر را دارند. تیم Puppeteer برای تثبیت پشتیبانی فایرفاکس و جلب توجه ما به APIهای گمشده به ورودی کاربران نیاز دارد.

از Puppeteer نسخه 2.1.0 به بعد، می توانید puppeteer.launch({product: 'firefox'}) برای اجرای اسکریپت های Puppeteer خود در Firefox Nightly، بدون هیچ گونه سفارشی اضافی مشخص کنید.
تکه ها در حالی که یک آزمایش قدیمی به نسخه اصلاح شده فایرفاکس نیاز داشت، رویکرد فعلی با فایرفاکس "استوک" کار می کند.

ما به همکاری با سایر فروشندگان مرورگر ادامه می دهیم تا پشتیبانی Puppeteer را به مرورگرهایی مانند Safari ارائه دهیم. این تلاش شامل کاوش استانداردی برای اجرای دستورات بین مرورگرها (به جای تکیه بر پروتکل غیر استاندارد DevTools مورد استفاده کروم) است.

اهداف و اصول Puppeteer چیست؟

اهداف پروژه عبارتند از:

  • یک کتابخانه باریک و متعارف ارائه کنید که قابلیت‌های پروتکل DevTools را برجسته می‌کند.
  • یک پیاده سازی مرجع برای کتابخانه های آزمایشی مشابه ارائه دهید. در نهایت، این چارچوب های دیگر می توانند Puppeteer را به عنوان لایه بنیادی خود بپذیرند.
  • پذیرش آزمایش مرورگر بدون سر/خودکار را افزایش دهید.
  • به بررسی ویژگی‌های پروتکل DevTools جدید کمک کنید...و اشکالات را پیدا کنید!
  • درباره نقاط دردناک تست خودکار مرورگر بیشتر بیاموزید و به پر کردن این شکاف ها کمک کنید.

ما اصول Chromium را تطبیق می‌دهیم تا به ما در تصمیم‌گیری درباره محصول کمک کند:

  • سرعت : Puppeteer سربار عملکرد تقریباً صفر بر روی یک صفحه خودکار دارد.
  • امنیت : Puppeteer خارج از فرآیند با توجه به Chromium عمل می‌کند و خودکار کردن صفحات احتمالی مخرب را ایمن می‌کند.
  • پایداری : عروسک گردان نباید پوسته پوسته شود و نباید حافظه اش را نشت کند.
  • سادگی : Puppeteer یک API سطح بالا ارائه می دهد که استفاده، درک و اشکال زدایی آسان است.

آیا Puppeteer جایگزین Selenium/WebDriver می شود؟

نه هر دو پروژه به دلایل بسیار متفاوت ارزشمند هستند:

  • Selenium/WebDriver بر اتوماسیون بین مرورگرها تمرکز دارد. ارزش پیشنهادی آن یک API استاندارد واحد است که در تمام مرورگرهای اصلی کار می کند.
  • Puppeteer روی Chromium تمرکز می کند. ارزش پیشنهادی آن قابلیت های غنی تر و قابلیت اطمینان بالاتر است.

با این حال، می‌توانید از Puppeteer برای اجرای آزمایش‌هایی علیه Chromium استفاده کنید، مانند استفاده از jest-puppeteer مبتنی بر جامعه. اگرچه این احتمالاً نباید تنها راه حل آزمایشی شما باشد، اما در مقایسه با WebDriver دارای چند نکته خوب است:

  • Puppeteer به نصب صفر نیاز دارد و همراه با نسخه Chromium که بهترین کار را با آن دارد ارائه می شود. بهتر است چند آزمایش فقط با Chromium اجرا شود تا اینکه اصلاً آزمایشی نداشته باشید.
  • Puppeteer دارای معماری رویداد محور است که بسیاری از پوسته پوسته شدن بالقوه را از بین می برد. در فیلمنامه های عروسک گردان نیازی به تماس های شیطانی "خواب (1000)" نیست.
  • Puppeteer به طور پیش فرض بدون هد اجرا می شود که باعث می شود سریع اجرا شود. Puppeteer v1.5.0 همچنین زمینه های مرورگر را در معرض دید قرار می دهد و امکان موازی سازی موثر اجرای آزمایش را فراهم می کند.
  • وقتی صحبت از اشکال زدایی به میان می آید، Puppeteer می درخشد: بیت "headless" را به false برگردانید، "slowMo" را اضافه کنید، و خواهید دید که مرورگر چه می کند. حتی می‌توانید Chrome DevTools را باز کنید تا محیط آزمایش را بررسی کنید.

چرا Puppeteer v.XXX با Chromium v.YYY کار نمی کند؟

ما Puppeteer را به عنوان یک موجودیت تقسیم ناپذیر با Chromium می بینیم. هر نسخه از Puppeteer یک نسخه خاص از Chromium را در بسته‌بندی می‌کند - تنها نسخه‌ای که کار با آن تضمین شده است.

این یک محدودیت مصنوعی نیست. کارهای زیادی روی Puppeteer در واقع در مخزن Chromium در حال انجام است. در اینجا یک داستان معمولی وجود دارد:

  1. یک اشکال Puppeteer گزارش شده است
  2. این یک مشکل با پروتکل DevTools است، بنابراین ما آن را در Chromium برطرف می کنیم
  3. به محض اینکه رفع مشکل بالادست انجام شد، Chromium به روز شده را در Puppeteer قرار می دهیم

با این حال، اغلب اوقات استفاده از Puppeteer با Google Chrome رسمی به جای Chromium مطلوب است. برای انجام این کار، باید نسخه‌ای puppeteer-core که مطابق با نسخه کروم است نصب کنید.

به عنوان مثال، برای هدایت Chrome 101 با Puppeteer-core، از برچسب chrome-101 npm استفاده کنید:

npm install puppeteer-core@chrome-101

Puppeteer از کدام نسخه Chromium استفاده می کند؟

نسخه را با استفاده از یکی از راه های زیر پیدا کنید:

  • به دنبال ورودی chromium در revisions.ts بگردید. برای یافتن commit و شماره نسخه مربوط به Chromium، نسخه‌ای را که با پیشوند r در بخش «یافتن نسخه‌ها» OmahaProxy وجود دارد، جستجو کنید.
  • به دنبال نقشه versionsPerRelease در versions.js بگردید که شامل نقشه برداری بین نسخه های Chromium و Puppeteer است. توجه: این فایل فقط شامل نسخه‌های Puppeteer است که Chromium به‌روزرسانی شده است. همه نسخه‌های Puppeteer فهرست نشده‌اند.

Puppeteer از کدام نسخه فایرفاکس استفاده می کند؟

از آنجایی که پشتیبانی از فایرفاکس آزمایشی است، Puppeteer آخرین نسخه Firefox Nightly را زمانی که متغیر محیطی PUPPETEER_PRODUCT روی firefox تنظیم شده است دانلود می کند. به همین دلیل است که ارزش firefox در revisions.ts latest است -- Puppeteer به نسخه خاصی از فایرفاکس وابسته نیست.

برای واکشی Firefox Nightly به عنوان بخشی از نصب Puppeteer:

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

چه چیزی ناوبری در نظر گرفته می شود؟

از دیدگاه Puppeteer، "ناوبری" هر چیزی است که URL صفحه را تغییر می دهد. جدای از ناوبری معمولی که در آن مرورگر برای دریافت یک سند جدید از وب سرور به شبکه برخورد می کند، این شامل ناوبری لنگر و استفاده از History API است.

با این تعریف از "ناوبری"، Puppeteer به طور یکپارچه با برنامه های تک صفحه ای کار می کند.

تفاوت بین رویداد ورودی "معتمد" و "غیر قابل اعتماد" چیست؟

در مرورگرها، رویدادهای ورودی را می توان به دو گروه بزرگ تقسیم کرد: قابل اعتماد در مقابل غیرقابل اعتماد.

  • رویدادهای مورد اعتماد : رویدادهایی که توسط کاربران در تعامل با صفحه ایجاد می شوند، مانند استفاده از ماوس یا صفحه کلید.
  • رویداد غیرقابل اعتماد : رویدادهایی که توسط Web APIها تولید می‌شوند، مانند متدهای 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 از نسخه نصب شده جداگانه Chrome با گزینه executablePath برای puppeteer.launch استفاده کند. فقط در صورتی باید از این پیکربندی استفاده کنید که به نسخه رسمی Chrome که از این قالب‌های رسانه پشتیبانی می‌کند نیاز دارید.
  • از آنجایی که Puppeteer (در همه پیکربندی‌ها) نسخه دسک‌تاپ Chromium یا Chrome را کنترل می‌کند، ویژگی‌هایی که فقط توسط نسخه موبایل Chrome پشتیبانی می‌شوند، پشتیبانی نمی‌شوند. این بدان معنی است که Puppeteer از HTTP Live Streaming (HLS) پشتیبانی نمی کند.

من در نصب / اجرای Puppeteer در محیط آزمایشی خود مشکل دارم. کجا باید دنبال کمک بگردم؟

ما یک راهنمای عیب یابی برای سیستم عامل های مختلف داریم که وابستگی های مورد نیاز را فهرست می کند.

Chromium در هر npm ci اجرا دانلود می شود. چگونه می توانم دانلود را کش کنم؟

مسیر دانلود پیش فرض 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 وجود دارد:

قبل از ارسال سوال حتما این کانال ها را جستجو کنید.