```html פלטפורימט ו-Puppeteer הם שניים מהכלים הפופולריים ביותר לאוטומציה של דפדפנים, אך הם נבדלים בביצועים וביכולות שלהם. במאמר זה, נשווה אותם זה לצד זה כדי לעזור לך להחליט איזה מהם מתאים לצרכים שלך. עם זאת, חשוב לזכור שככל שאתרי אינטרנט הופכים לקשים יותר לגישה באמצעות סקריפטים אוטומטיים, יעילות הקוד היא רק מחצית מהקרב. לכן נדון גם כיצד יכולים לעזור למנוע הפסקות ולהגדיל את האוטומציה באופן אמין, עם קישורים למדריכי שילוב ייעודיים עבור שתי הספריות. פתרונות פרוקסי מה זה Playwright? Playwright הוא מסגרת מודרנית בקוד פתוח שפותחה על ידי מיקרוסופט לבדיקות מקצה לקצה ואוטומציה של דפדפנים. הוא מאפשר למפתחים ליצור אינטראקציה עם יישומי אינטרנט בכל מנועי הדפדפנים המודרניים – Chromium (Chrome & Edge), Firefox, ו-WebKit (מנוע Safari) – ב-Windows, Linux, ו-macOS. בעוד שהוא בנוי על , Playwright תומך בשפות תכנות מרובות, כולל JavaScript, TypeScript, Python, Java, ו-.NET (C#), מה שהופך אותו לכלי מקיף עבור צוותים עם מבני טכנולוגיה מגוונים. עבור גירוד אתרים (web scraping), היכולת של Playwright לנהל מספר הקשרי דפדפן מבודדים (כל אחד עם עוגיות והגדרות פרוקסי משלו) מאפשרת חילוץ נתונים יעיל ומקבילי ללא תקורת הזיכרון של תהליכי דפדפן מרובים. Node.js חוזק מרכזי של Playwright הוא אמינותו. הוא כולל המתנה אוטומטית, המבטיחה שהאלמנטים ניתנים לפעולה לפני ביצוע אינטראקציה, מה שמפחית משמעותית את "התנודתיות" של הבדיקות. הוא גם תומך בגלישה רב-הקשרית, המאפשרת לך לבודד מספר דפים או iframes באותו סשן דפדפן. מעבר לאוטומציה בסיסית, הוא מציע יירוט רשת מקורי, הקלטת וידאו, ואמולציית מכשיר נייד. בעוד ש-Playwright חדש יחסית בהשוואה ל-Puppeteer, הוא הפך במהירות למנהיג בתחום. יכולתו לספק תוצאות עקביות וחוצות-דפדפנים, יחד עם כלי הרצת הבדיקות המובנה שלו, הופכים אותו לבחירה מובילה לפיתוח אתרים מודרני. מה זה Puppeteer? Puppeteer הוא ספריית בקוד פתוח שפותחה על ידי גוגל לאוטומציה של דפדפני Chrome ו-Chromium. היא בנויה בעיקר על פרוטוקול Chrome DevTools (CDP), המעניק למפתחים שליטה על פנימיות הדפדפן, מה שהופך אותה לקלת משקל, מהירה ומותאמת במיוחד למשימות ספציפיות ל-Chrome. Node.js Puppeteer פועל במצבי headless ו-headful. זהו כלי סטנדרטי לגירוד אתרים, יצירת קבצי PDF, ולכידת צילומי מסך אוטומטית. בשל האינטגרציה ההדוקה שלו עם מנוע Chromium, הוא לעתים קרובות משיג גישה לתכונות דפדפן חדשות לפני מסגרות אוטומציה אחרות. בעוד Puppeteer מצטיין במערכת האקולוגית של Chromium (כולל Microsoft Edge), יכולותיו חוצות-הדפדפנים מוגבלות יותר ממתחרים כמו Playwright. לדוגמה, למרות שהוא מספק כעת תמיכה יציבה ל-Firefox דרך פרויקט WebDriver BiDi, הוא עדיין חסר תמיכה מקורית ל-WebKit (Safari). Puppeteer בנוי במיוחד עבור סביבת Node.js ותומך רשמית רק ב-JavaScript ו-TypeScript. בעוד שישנן גרסאות לא רשמיות כמו Pyppeteer עבור Python, פרויקטים קהילתיים אלו לעתים קרובות חסרים עדכונים תכופים המסופקים על ידי הספרייה הראשית. למרות תמיכת השפה הצרה יותר, Puppeteer נותרת אחת הבחירות המובילות בזכות הפשטות, המהירות, והתמיכה הקהילתית הגדולה שלה לאוטומציה המתמקדת ב-Chrome. השוואת Playwright מול Puppeteer: סיכום למי שמחפש תשובה מהירה, הנה טבלת השוואה TL:DR של Playwright מול Puppeteer: תכונה Playwright Puppeteer מטרה עיקרית בדיקות E2E חוצות-דפדפנים, אוטומציה, וגירוד אוטומציית Chromium ממוקדת וגירוד פלטפורמות נתמכות Windows, macOS, Linux Windows, macOS, Linux תמיכה בשפות JavaScript, TypeScript, Python, Java, .NET (C#) JavaScript & TypeScript תמיכה בדפדפנים Chromium, Firefox, WebKit Chromium, Firefox (דרך WebDriver BiDi) ארכיטקטורה דרייבר מבוסס WebSocket (מפשט את כל הפרוטוקולים) Chrome DevTools Protocol (CDP) / WebDriver BiDi לקוח אסינכרוני & סינכרוני אסינכרוני תצורת מצב מצב Headful & headless (שניהם ראשון במעלה) מצב Headful & headless (שניהם ראשון במעלה) תיעוד טוב; התמקדות בבדיקות וניפוי שגיאות מצוין; בוגר ופשוט תמיכה קהילתית מערכת אקולוגית ענקית; קהילה נרחבת מערכת אקולוגית ענקית; קהילה נרחבת אסטרטגיית המתנה המתנה אוטומטית (אמינות מובנית) המתנה ידנית (דורש ) waitForSelector השוואת תמיכה בדפדפנים היתרון הבולט ביותר של Playwright הוא התמיכה המקורית שלו בכל שלושת מנועי הדפדפנים העיקריים: Chromium, Firefox, ו-WebKit. האחרון הופך את Playwright לבחירה המועדפת עבור מפתחים שצריכים להבטיח שיישומי האינטרנט שלהם יעבדו בצורה מושלמת ב-iOS או macOS, שכן הוא יכול לדמות את התנהגות Safari באמצעות WebKit על כל מערכת הפעלה. לעומת זאת, Puppeteer נותרת ספרייה המתמקדת ב-Chromium. למרות שהיא התייצבה והשיקה רשמית תמיכה מלאה ב-Firefox דרך פרוטוקול WebDriver BiDi, היא עדיין חסרה תמיכה מקורית ב-WebKit. אם אתם זקוקים לבדיקות עבור Safari או מחפשים חוויה חוצת-דפדפנים, Playwright עדיין המנצחת הברורה. שתי הספריות גם נבדלות באופן שבו הן שולטות בדפדפנים. Playwright מספק גרסאות "מתוקנות" משלו של קבצי הפעלה של דפדפנים. תיקונים אלו מאפשרים ל-Playwright לחשוף ממשקי API ברמה נמוכה שאינם זמינים בדפדפנים רגילים. הוא גם מאפשר תכונות כמו המתנה אוטומטית ויירוט רשת מתקדם. עם זאת, יש מחיר. מכיוון שדפדפנים אלה שונו, קיים סיכון תיאורטי שבדיקה תעבור בדפדפן Playwright מתוקן, אך תיכשל בדפדפן אמיתי. Puppeteer, לעומת זאת, בנה במקור את המוניטין שלו על פרוטוקול Chrome DevTools (CDP). כיום, הוא עובר לכיוון WebDriver BiDi, תקן תעשייתי חדש. זה בעצם אומר ש-Puppeteer עובד קרוב יותר עם גרסאות דפדפנים רגילות המסופקות על ידי היצרנים, מה שלעתים קרובות מתורגם ליציבות טובה יותר בטווח הארוך וסיכון נמוך יותר לתקריות שווא במהלך הבדיקה. אפשרויות שפת תכנות כלי שימושי הוא רק כמו תאימותו למומחיות הקיימת של הצוות שלך. לכן, כשמדובר בבחירת שפת תכנות, הבחירה בין Playwright ל-Puppeteer תלויה במבנה הטכנולוגי שלך. Playwright תוכנן בפילוסופיה רב-לשונית – הוא בנוי להיות נגיש כמעט לכל צוות פיתוח מודרני. בעוד שהמנוע הראשי כתוב ב-TypeScript/ , מיקרוסופט מספקת ותחזקת קשרי שפה באיכות גבוהה עבור JavaScript, TypeScript, Python, Java, ו-C#/.NET. יתרה מכך, מכיוון שאלה קשרים רשמיים, אתם מקבלים שוויון תכונות בכל השפות – תכונה ששוחררה עבור זמינה כמעט מיד עבור משתמשי Python או Java. Node.js Node.js Puppeteer, לעומת זאת, הוא אך ורק ספריית המיועדת ל-JavaScript ו-TypeScript. אם אתם עובדים בתוך האקו-סיסטם של JS, Puppeteer ירגיש כמו הרחבה טבעית של זרימת העבודה שלכם. אבל אם אתם מפתחי Python, אתם לגמרי חסרי מזל עם ספריית Puppeteer הרשמית. כן, ישנן גרסאות לא רשמיות כמו Pyppeteer עבור Python, אך אלה הם פרויקטים המופעלים על ידי הקהילה בלבד, שאינם מתוחזקים עוד. Node.js תהליך התקנה והגדרה כעת, בואו נבחן כיצד נוכל להשתמש גם ב-Playwright וגם ב-Puppeteer לביצוע משימת גירוד אתרים בסיסית. דרישות קדם כדי להתחיל, תצטרכו להתקין (מנהל חבילות Node) במחשב שלכם. תוכלו לעשות זאת על ידי מעקב אחר הזה. npm הקישור לאחר מכן, תוכלו לפתוח את הטרמינל ולהריץ פקודות אלו כדי ליצור תיקיה חדשה ולאתחל פרויקט Node חדש. זה בדרך כלל יוצר קובץ בתוך הספריה. package.json mkdir playwright-pupeteer cd playwright-pupeteer npm init -y התקנת הספריות כעת כשהפרויקט מוגדר, בואו נתקין גם את Playwright וגם את Puppeteer בפרויקט הנוכחי. תוכלו לעשות זאת על ידי הרצת הפקודות הבאות: npm install puppeteer npm install playwright npx playwright install כפי שאתם רואים, אנו צריכים להריץ פקודת נוספת בעת התקנת Playwright. זה קורה מכיוון ש-Playwright אינו כולל דפדפן ארוז כברירת מחדל. עליכם להריץ את הפקודה האחרונה המוצגת כדי להתקין את הדפדפנים ברירת המחדל שהוא מציע. npx playwright install Puppeteer, לעומת זאת, כולל Chrome ארוז כברירת מחדל; לכן, אין צורך בפקודה נוספת. גירוד אתר עם Playwright כעת כשההגדרה שלנו הושלמה, בואו נראה כיצד תוכלו להשתמש ב-Playwright כדי לגרד אתר. נשתמש ב- כאתר מטרה לגירוד לדוגמה זו. מכיוון שהארגז החול מדמה אתר מסחר אלקטרוני, נגרד את הכותרת ואת סטטוס המלאי של כל פריט בדף. Oxylabs Sandbox נתחיל ביצירת קובץ JavaScript בשם בתוך תיקיית הפרויקט שלכם. ברגע שיהיה לכם אותו, עליכם לייבא את תלות מחבילת Playwright. הנה איך זה אמור להיראות: playwright.js chromium import { chromium } from 'playwright'; לאחר מכן, בואו נבצע את השלבים הראשוניים של רוב יישומי Playwright: פתיחת הדפדפן וניווט לאתר. נוכל להתחיל בהגדרת כתובת ה-URL של ארגז החול לגירוד במשתנה כמו זה: const URL = 'https://sandbox.oxylabs.io/products'; כעת, בואו נתחיל דפדפן ונפתח דף חדש כמו זה: const browser = await chromium.launch(); const page = await browser.newPage(); ברגע שיש לנו את משתנה הדף מאותחל, נוכל להתחיל בתהליך הגירוד. הוסיפו את השורות הבאות כדי לנווט את הדף ל-URL שהוגדר קודם לכן: await page.goto(URL); await page.waitForLoadState('networkidle'); השורה השנייה מבטיחה שכל הרכיבים נטענו לפני שמתחילים בגירוד, כך שלא נפספס את הנתונים שאנו צריכים. כעת כשהנתונים נטענו, נוכל להשתמש בסלקטור CSS פשוט כדי לבחור כל מוצר מהאתר. לכל מוצר בארגז החול יש מחלקת CSS של , אז בואו נשתמש בה כסלקטור שלנו. .product-card כדי לעשות זאת, בואו ניצור פונקציה אנונימית עבור המתודה של אובייקט הדף, אשר בסופו של דבר תחזיר כל מוצר מהנתונים המגורדים. היא אמורה להיראות כך: evaluate const products = await page.evaluate(() => { }) בתוך הפונקציה האנונימית, בואו נחפש כל מוצר בדף כך: const products = await page.evaluate(() => { const productCards = document.querySelectorAll('.product-card'); }) לאחר מכן, עלינו לעבור על כל כרטיס מוצר ולמפות את הכותרת ואת סטטוס המלאי לאובייקט חדש. מכיוון שלסטטוס המלאי אין מחלקת CSS משותפת, נבחר את הטקסט ו- בנפרד ונשווה ביניהם כדי לקבוע איזה מהם קיים. הנה איך זה אמור להיראות: Out of Stock In Stock const products = await page.evaluate(() => { const productCards = document.querySelectorAll('.product-card'); return Array.from(productCards).map(card => { const inStock = card.querySelector('p.in-stock')?.innerText; const outOfStock = card.querySelector('p.out-of-stock')?.innerText; const title = card.querySelector('h4.title')?.innerText; return { title: title, stockStatus: inStock ? 'In Stock' : outOfStock ? 'Out of Stock' : '' }; }); }) לאחר מכן, נוכל להדפיס את המוצרים המוחזרים עם הצהרת הדפסה פשוטה, ולסגור את הדפדפן כך: console.log(products); await browser.close() אם תריצו את הקוד, אתם אמורים לראות משהו כזה בטרמינל שלכם: [ { title: 'The Legend of Zelda: Ocarina of Time', stockStatus: 'In Stock' }, { title: 'Super Mario Galaxy', stockStatus: 'Out of Stock' }, { title: 'Super Mario Galaxy 2', stockStatus: 'In Stock' }, { title: 'Metroid Prime', stockStatus: 'Out of Stock' }, { title: 'Super Mario Odyssey', stockStatus: 'In Stock' }, { title: 'Halo: Combat Evolved', stockStatus: 'Out of Stock' }, ... ] הנה מה שהסקריפט המלא אמור להיראות: import { chromium } from 'playwright'; const URL = 'https://sandbox.oxylabs.io/products'; const browser = await chromium.launch(); const page = await browser.newPage(); await page.goto(URL); await page.waitForLoadState('networkidle'); const products = await page.evaluate(() => { const productCards = document.querySelectorAll('.product-card'); return Array.from(productCards).map(card => { const inStock = card.querySelector('p.in-stock')?.innerText; const outOfStock = card.querySelector('p.out-of-stock')?.innerText; const title = card.querySelector('h4.title')?.innerText; return { title: title, stockStatus: inStock ? 'In Stock' : outOfStock ? 'Out of Stock' : '' }; }); }); console.log(products); await browser.close(); לאחר מכן, בואו נבחן כיצד נבצע את אותה המשימה באמצעות Puppeteer. גירוד אתר עם Puppeteer כדי להתחיל, בואו ניצור קובץ נוסף באותה ספרייה בשם . puppeteer.js ברגע שיהיה לכם אותו, תוכלו לפתוח אותו ולייבא את ספריית . כפי שהוזכר קודם לכן, Puppeteer כולל את Chrome, כך שאיננו צריכים לייבא תלות דפדפן נוספת. ייבוא כך מספיק: puppeteer puppeteer import puppeteer from "puppeteer"; שאר הסקריפט נשאר דומה לרוב לדוגמת Playwright, למעט הבדלים קטנים. כמו קודם, אנו מפעילים דפדפן, פותחים דף, מנווטים לכתובת ה-URL של ארגז החול לגירוד, ומגרדים את הנתונים. הנה איך זה אמור להיראות: import puppeteer from "puppeteer"; const URL = "https://sandbox.oxylabs.io/products"; const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto(URL); await page.waitForNetworkIdle(); const products = await page.evaluate(() => { const productCards = document.querySelectorAll(".product-card"); return Array.from(productCards).map((card) => { const inStock = card.querySelector("p.in-stock")?.innerText; const outOfStock = card.querySelector("p.out-of-stock")?.innerText; const title = card.querySelector("h4.title")?.innerText; return { title: title, stockStatus: inStock ? "In Stock" : outOfStock ? "Out of Stock" : "", }; }); }); console.log(products); await browser.close(); דמיון והבדלים ההבדל היחיד בין דוגמאות אלה הוא באופן שבו כל ספרייה מטפלת בהמתנה למצב הרשת להשתנות. ב-Playwright, עלינו לציין במפורש באיזה מצב רשת אנו ממתינים בארגומנט של הפונקציה, כך: await page.waitForLoadState("networkidle"); בעוד Puppeteer חושף פונקציה נפרדת להמתנה לרשת להיות פנויה, כך: await page.waitForNetworkIdle(); כמובן, הבדלים נוספים יתגלו כאשר תתמודדו עם שימושים מתקדמים יותר. עם זאת, דוגמה קטנה זו מראה ש, מעבר לכמה הבדלים פונקציונליים, גם Playwright וגם Puppeteer מבצעים את אותן משימות בסיסיות באותה דרך דומה. עיצוב API וקלות שימוש אם אי פעם כתבתם סקריפט דפדפן שעבד בצורה מושלמת במחשב שלכם אך נכשל באופן אקראי בענן, חוויתם "תנודתיות". הדרך שבה שתי הספריות הללו מטפלות בתזמון טעינת הדף היא הגורם הגדול ביותר לכמה מתסכל (או חלק) תהליך הפיתוח שלכם יהיה. Playwright נבנה כדי לפתור את בעיית התנודתיות, תוך הצגת שני מושגים: – ברוב כלי האוטומציה, אם אתם אומרים לסקריפט "לחץ על כפתור ההתחברות", הוא עשוי לנסות ללחוץ עליו לפני שהכפתור סיים להיטען, מה שיגרום לקריסת הסקריפט. Playwright מחכה אוטומטית שהאלמנט יהיה ניתן לפעולה – הוא בודק אם הכפתור גלוי, יציב, ומופעל – לפני שהוא מנסה ללחוץ. המתנה אוטומטית – locator הוא דרך לתאר כיצד למצוא אלמנט (למשל, "מצא את הכפתור שאומר שלח"). בניגוד לשיטות ישנות יותר שמוצאות אלמנט פעם אחת ואז מאבדות אותו אם הדף מתרענן, Playwright Locator נשאר פעיל ויאתר מחדש את האלמנט בכל פעם שתצטרכו אותו. Locators Puppeteer יותר "ידיים על" – הוא נותן לכם את הכלים ליצור אינטראקציה עם הדפדפן, אך הוא לא עושה כל כך הרבה עבודת הכבדה עבורכם. לדוגמה, ב-Puppeteer, עליכם לומר לסקריפט בדיוק מתי לחכות. זמן מה לאחר מכן, תמצאו את עצמכם כותבים משהו כמו לפני כמעט כל פעולה. אם תשכחו פקודת המתנה או שהאתר לוקח יותר מהרגיל לטעינה, הסקריפט שלכם כנראה ייכשל. אז, אתם עשויים לקבל יותר שליטה, אבל אתם גם צריכים לכתוב יותר שורות קוד כדי לטפל באותן משימות ש-Playwright מטפל בהן באופן אוטומטי. await page.waitForSelector('.login-btn') ביצועים ומהירות אין אפשרות אחת מוסכמת בינלאומית כשמדובר בספרייה המהירה ביותר, מכיוון שהיא תלויה לחלוטין בהיקף הפרויקט שלכם. עם זאת, שני הכלים בהחלט מהירים יותר ממסגרות ישנות יותר, כמו Selenium, אך יש להם פרופילי ביצועים שונים. Puppeteer אידיאלי לעתים קרובות עבור סקריפטים קצרים, חד-פעמיים או פרויקטים. מכיוון שהוא ספרייה קלת משקל עם חיבור ישיר, ברמה נמוכה, ל-Chromium, יש לו מעט מאוד תקורות. בהתחשב במהירות ההפעלה, Puppeteer יכול להפעיל דפדפן ולהריץ פקודה פשוטה (למשל, צילום מסך של דף יחיד) מהר יותר מ-Playwright במדדי ביצועים רבים. למה? מכיוון שאין לו את השכבות הנוספות ש-Playwright משתמש בהן כדי לתמוך בשפות ובסוגי דפדפנים מרובים. אז, אם המטרה שלכם היא להריץ אלפי משימות קטנות ועצמאיות, קשה לנצח את Puppeteer. לעומת זאת, Playwright יעיל הרבה יותר בתרחישים מורכבים, מרובי-דפים, הודות לתכונת ה-BrowserContexts שלו. בואו נשווה אותה ל-Puppeteer: ב-Puppeteer, אם אתם רוצים להריץ 10 סשנים שונים של גירוד עם בידוד מוחלט, עליכם להפעיל 10 תהליכי דפדפן נפרדים. תהליך זה נחשב כבד וצורך RAM משמעותי. מה ש-Playwright מאפשר לכם לעשות הוא להפעיל תהליך דפדפן אחד וליצור עשרות הקשרים מבודדים בתוכו – כל הקשר מתנהג כמו חלון דפדפן חדש לחלוטין, אך חולק את אותה זיכרון בסיסי. כתוצאה מכך, Playwright משתמש בפחות CPU וזיכרון באופן משמעותי מאשר Puppeteer בעת הגדלה בהיקפים גדולים. תיעוד ותמיכה קהילתית Puppeteer היה התקן התעשייתי במשך זמן רב, אך Playwright קבע במהירות רף חדש לאופן שבו יש לתעד כלי מפתחים. Puppeteer, הנחשב לוותיק בוגר, יש לו יתרון של מספר שנים, מה שעזר לו ליצור מאגר ידע עצום ברחבי האינטרנט. לדוגמה, אם אתם נתקלים בשגיאה מוזרה ב-Puppeteer, יש סיכוי טוב שמישהו אחר פתר אותה לפני שלוש שנים ב-Stack Overflow או GitHub. בנוסף, מכיוון ש-Puppeteer קיים כבר כל כך הרבה זמן, הקהילה בנתה כלים מיוחדים שאינם נתמכים רשמית. בסך הכל, התיעוד של Puppeteer פשוט – זו ספרייה, והתיעוד שלה משקף את הפשטות הזו. בעוד Playwright צעיר יותר, הוא נתמך על ידי המשאבים העצומים של מיקרוסופט. התיעוד שלו לא רק אומר לכם איך ללחוץ על כפתור – הוא מספק מדריכים מפורטים ומאוירים על אתגרים מודרניים. מכיוון ש-Playwright כולל כלים ראשוניים, פחות נדרשים פלאגינים קהילתיים. ניתן לומר בבטחה שכיום, Playwright עקף את Puppeteer באספקת רשת ביטחון למפתחים – בעוד של-Playwright עשויים להיות פחות פוסטים נישתיים ישנים, התיעוד הרשמי שלו כל כך מקיף עד שלעתים רחוקות תצטרכו לחפש במקום אחר. יכולות גירוד אתרים אתרי אינטרנט מודרניים הם כמעט אף פעם לא רק HTML סטטי יותר – הם יישומיים דינמיים שטעונים נתונים כאשר אתם גוללים או לוחצים. כדי לגרד אתרים אלה ביעילות, אתם זקוקים לכלי שיכול לחשוב ולפעול כמו דפדפן אנושי אמיתי. ובזמן שגם Playwright וגם Puppeteer מצוינים בחילוץ נתונים, הם מייצגים אסטרטגיות שונות. טיפול בתוכן דינמי שתי הספריות מטפלות היטב בתוכן עשיר ב-JavaScript, אך נבדלות באופן שבו הן מחכות לנתונים. בזכות ההמתנה האוטומטית המובנית שלו, Playwright עמיד בפני גירוד אתרים שטעונים נתונים במהירויות בלתי צפויות. הוא לא ינסה לגרד כותרת מוצר או תג מחיר עד שהם יעובדו במלואם ויהיו גלויים, מה שהופך את הגורדים שלכם לפחות צפויים להישבר במהלך עלייה איטית ברשת. Puppeteer נותן לכם שליטה. אם אתם צריכים ליירט בקשת רשת ספציפית ברגע שהיא מתרחשת, האינטגרציה של Puppeteer עם Chrome DevTools Protocol (CDP) מספקת את רמת השליטה שמפתחים מתקדמים דורשים.