שאלות נפוצות

מהו הסטטוס של תמיכה בדפדפנים שונים?

התמיכה הרשמית ב-Firefox היא ניסיונית. שיתוף הפעולה המתמשך עם Mozilla נועד לתמוך בתרחישים נפוצים של בדיקות מקצה לקצה, שעבורם המפתחים מצפים לכיסוי חוצה-דפדפנים. הצוות של Puppeteer זקוק למידע ממשתמשים כדי לייצב את התמיכה ב-Firefox ולהביא לתשומת ליבנו את ממשקי ה-API החסרים.

החל מגרסה 2.1.0 של Puppeteer ואילך, אפשר לקבוע puppeteer.launch({product: 'firefox'}) להפעיל את הסקריפטים של Puppeteer ב-Firefox Nightly, ללא תיקונים
נוספים בהתאמה אישית. למרות שניסוי ישן דרש גרסה מתוקנת של Firefox, הגישה הנוכחית פועלת עם Firefox במצב "stock" (מאגר) של Firefox.

אנחנו ממשיכים לשתף פעולה עם ספקי דפדפנים אחרים כדי לספק תמיכה ב-Puppeteer לדפדפנים כמו Safari. המאמצים כוללים ניתוח של תקן לביצוע פקודות בדפדפנים שונים (במקום להסתמך על פרוטוקול פיתוח לא סטנדרטי שמשמש את Chrome).

מהם היעדים והעקרונות של הבובת תיאטרון?

יעדי הפרויקט הן:

  • לספק ספרייה קנונית וצרה שמדגישה את היכולות של פרוטוקול כלי הפיתוח.
  • לספק הטמעה של קובצי עזר עבור ספריות בדיקה דומות. בסופו של דבר, המסגרות האחרות האלה יוכלו לאמץ את ה-Puppeteer כשכבה יסודות.
  • הרחבת השימוש בבדיקות דפדפן ללא GUI/אוטומטי.
  • רוצה לנסות לפני ההפצה של תכונות חדשות של פרוטוקול DevTools? ולאתר באגים!
  • מידע נוסף על הנקודות הבעייתיות של בדיקות אוטומטיות של הדפדפן ועזרה במילוי הפערים האלה.

אנחנו מיישמים את עקרונות Chromium כדי לעזור לנו לקבל החלטות בנוגע למוצרים:

  • מהירות: לבובתהם יש כמעט אפס התקורה של ביצועים מעל דף אוטומטי.
  • אבטחה: ה-Puppeteer פועל מחוץ ל-Chromium ומאפשר לבצע אוטומציה של דפים שעשויים להיות זדוניים.
  • יציבות: הבובת צריכה להיות רעועה ולא יכולה להדליף מהזיכרון.
  • פשטות: Puppeteer מספקת API ברמה גבוהה שקל להשתמש בו, להבין אותו ולנפות באגים.

האם ה-Puppeteer מחליף את סלניום/WebDriver?

לא. לשני הפרויקטים יש ערך מסיבות שונות מאוד:

  • Selenium/WebDriver מתמקדת באוטומציה בדפדפנים שונים. הצעת הערך שלה היא API סטנדרטי יחיד שפועל בכל הדפדפנים העיקריים.
  • ה-Puppeteer מתמקד ב-Chromium. הצעת הערך שלו כוללת יכולות עשירות יותר ואמינות גבוהה יותר.

עם זאת, אפשר להשתמש ב-Puppeteer כדי להריץ בדיקות נגד Chromium, למשל באמצעות jest-puppeteer מבוסס-קהילה. סביר להניח שזה לא הפתרון היחיד לבדיקות, אבל יש בו כמה נקודות טובות בהשוואה ל-WebDriver:

  • כדי להפעיל את Puppeteer נדרשת הגדרה של אפס, ומגיעה בחבילה עם גרסת Chromium שמתאימה לה ביותר. עדיף שיהיו כמה בדיקות שפועלות רק ב-Chromium, מאשר שלא יבצעו בדיקות בכלל.
  • לתיאטרון הבובות (Puppeteer) יש ארכיטקטורה מבוססת אירועים, שמונעת מקרים רבים שלה. אין צורך בקריאות "שינה(1000)" מרושעות בכתבי דמויות של בובות.
  • ה-Puppeteer פועל ללא GUI כברירת מחדל, ולכן ההרצה שלו מהירה. Puppeteer v1.5.0 חושף גם הקשרים של דפדפנים, וכך מאפשר לבצע ביעילות את ביצוע הבדיקה במקביל.
  • ה-Puppeteer זוהר בכל הקשור לניפוי: הופכים את הביט 'ללא אוזניות' ל-'false', מוסיפים את 'slowMo' ורואים מה הדפדפן עושה. אפשר אפילו לפתוח את כלי הפיתוח ל-Chrome כדי לבדוק את סביבת הבדיקה.

למה Puppeteer v.XXX לא פועלת עם Chromium v.YYY?

אנחנו רואים ב-Puppeteer ישות בלתי ניתנת לחלוקה ב-Chromium. כל גרסה של Puppeteer כוללת גרסה ספציפית של Chromium – הגרסה היחידה שמבטיחה שתעבוד איתה.

המגבלה הזאת לא קיימת באופן מלאכותי. עבודה רבה על Puppeteer מתבצעת בפועל במאגר של Chromium. הנה סיפור טיפוסי:

  1. מדווחים על באג של Puppeteer
  2. זו בעיה בפרוטוקול DevTools, ולכן תיקנו את הבעיה ב-Chromium
  3. ברגע שהתיקון ל-upstream מגיע, אנחנו משיקים את Chromium ל-Puppeteer

עם זאת, לעיתים קרובות רצוי להשתמש ב-Puppeteer עם Google Chrome הרשמי ולא ב-Chromium. כדי שזה יעבוד, צריך להתקין גרסת puppeteer-core שתואמת לגרסת Chrome.

לדוגמה, כדי להפעיל את Chrome 101 עם puppeteer-core, צריך להשתמש בתג npm chrome-101:

npm install puppeteer-core@chrome-101

באיזו גרסה של Chromium פועל Puppeteer?

ניתן למצוא את הגרסה באחת מהדרכים הבאות:

  • חפש את הערך chromium ב-revisions.ts. כדי למצוא את ההתחייבות ואת מספר הגרסה של Chromium, מחפשים את הגרסה עם קידומת r בקטע 'חיפוש גרסאות' של OmahaProxy.
  • צריך לחפש את המפה של versionsPerRelease ב-versions.js שמכילה מיפוי בין גרסאות Chromium ו-Puppeteer. הערה: הקובץ מכיל רק גרסאות של Puppeteer שבהן מתבצע עדכון של Chromium. לא כל הגרסאות של ה-Puppeteer מופיעות ברשימה.

באיזו גרסה של Firefox פועל Puppeteer?

מכיוון שהתמיכה ב-Firefox היא ניסיונית, Puppeteer מורידה את הגרסה האחרונה של Firefox Nightly כאשר משתנה הסביבה PUPPETEER_PRODUCT מוגדר ל-firefox. לכן, הערך של firefox ב-revisions.ts הוא latest -- Puppeteer אינו מקושר לגרסה מסוימת של Firefox.

כדי לאחזר את Firefox Nightly כחלק מהתקנת Puppeteer:

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

מה נחשב לניווט?

מנקודת המבט של הבוב הדוב, "ניווט" הוא כל מה שמשנה את כתובת ה-URL של דף כלשהו. מלבד ניווט רגיל שבו הדפדפן לוחץ על הרשת כדי לאחזר מסמך חדש משרת האינטרנט, זה כולל ניווטי עוגן ושימוש ב-History API.

בעזרת ההגדרה הזו של 'ניווט', Puppeteer עובד בצורה חלקה עם יישומים בדף יחיד.

מה ההבדל בין אירוע קלט 'מהימן' לבין אירוע קלט 'לא מהימן'?

בדפדפנים, אפשר לחלק את אירועי הקלט לשתי קבוצות גדולות: מהימנים ולא מהימנים.

  • אירועים מהימנים: אירועים שנוצרו על ידי משתמשים שקיימו אינטראקציה עם הדף, כמו שימוש בעכבר או במקלדת.
  • אירוע לא מהימן: אירועים שנוצרים על ידי ממשקי Web API, כמו document.createEvent או method 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 להשתמש בגרסת Chrome שהותקנה בנפרד במקום Chromium באמצעות האפשרות 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:

חשוב לחפש בערוצים האלה לפני פרסום השאלה.