בדיקות E2E יציבות עם Puppeteer: מדריך לאוטומציית דפדפן
אתם משיקים פונקציונליות חדשה, אבל בייצור צץ באג שאף בדיקת יחידה או אינטגרציה לא תפסה. שגיאות Stale element reference, TimeoutError—כאבי ראש טיפוסיים בבדיקות ידניות. בדיקות E2E עם Puppeteer מאוטומטות תרחישים קריטיים ומפחיתות את זמן בדיקות הרגרסיה ב-60%. אנו עוזרים לצוותים להקים את Puppeteer מאפס: מהתקנה בסיסית ועד טכניקות מתקדמות—יירוט בקשות, אמולציית מכשירים, יצירת PDF. הניסיון שלנו כולל מעל 50 פרויקטי אוטומציית בדיקות, עם עלויות החל מ-$2,500 עבור הגדרה בסיסית. אנו מבטיחים יציבות בדיקות ושחזוריות ב-CI/CD. צרו קשר כדי לדון בפרטי הפרויקט שלכם.
בעיות נפוצות ופתרונות
הכאב הנפוץ ביותר הוא בדיקות לא יציבות שנכשלות ללא סיבה נראית לעין. לדוגמה, stale element reference error מתרחש כאשר ה-DOM מתעדכן בין איתור אלמנט ללחיצה עליו. בפרויקט אחד (אתר מסחר אלקטרוני מבוסס React), הפחתנו כשלים כוזבים ב-80% על ידי יישום אסטרטגיה של שאילתה חוזרת לאלמנטים לפני כל פעולה והגדלת timeouts בדפים איטיים. בעיה נוספת היא בדיקת תוכן שנטען דינמית. ב-Puppeteer, אנו משתמשים ב-waitForSelector עם timeout מותאם אישית או waitForResponse עבור בקשות API. זה חשוב במיוחד עבור SPA שבהם נתונים נטענים לאחר הרינדור. מקרה שלישי הוא גירוד עם הגנה. הגדרת תוסף stealth ופרוקסים עזרה לעקוף חסימה ב-95% מהאתרים. הבדיקות שלנו משיגות שיעור מעבר של 99% בריצה הראשונה ומפחיתות את זמן התחזוקה ב-50%.
שגיאות נפוצות ופתרונות
| שגיאה | סיבה | פתרון |
|---|---|---|
Dockerfile |
האלמנט לא הופיע ב-DOM | השתמשו ב-FROM node:18-slim RUN apt-get update && apt-get install -y chromium --no-install-recommends ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . CMD ["npm", "run", "test:e2e"] עם timeout מוגדל או // tests/login.test.ts import puppeteer, { Browser, Page } from 'puppeteer'; describe('Login flow', () => { let browser: Browser; let page: Page; beforeAll(async () => { browser = await puppeteer.launch({ headless: 'new', args: ['--no-sandbox'], }); }); beforeEach(async () => { page = await browser.newPage(); await page.setViewport({ width: 1280, height: 900 }); }); afterEach(async () => await page.close()); afterAll(async () => await browser.close()); test('successful login', async () => { await page.goto('https://example.com/login'); await page.type('#email', '[email protected]'); await page.type('#password', 'password123'); await page.click('[type="submit"]'); await page.waitForNavigation({ waitUntil: 'networkidle2' }); expect(page.url()).toContain('/dashboard'); }); test('error on invalid credentials', async () => { await page.goto('https://example.com/login'); await page.type('#email', '[email protected]'); await page.type('#password', 'wrong'); await page.click('[type="submit"]'); await page.waitForSelector('.error-message'); const errorText = await page.$eval('.error-message', el => el.textContent); expect(errorText).toContain('Неверный email или пароль'); }); }); |
npm install -D puppeteer jest-puppeteer # puppeteer включает Chromium автоматически # Для использования системного Chrome: npm install -D puppeteer-core |
ה-DOM עודכן לאחר איתור האלמנט | בצעו שאילתה חוזרת לאלמנט לפני כל פעולה |
jest-puppeteer.config.js |
הדפדפן קרס | הפעילו מחדש את הדפדפן; ב-CI בדקו זיכרון |
--enable-automation |
השרת לא מגיב | ודאו שהיישום פועל; השתמשו ב-puppeteer-extra-plugin-stealth |
הגדרת סביבה ושילוב CI/CD
לשם שחזוריות, אנו מריצים בדיקות בקונטיינרים. דוגמה const puppeteer = require('puppeteer-extra'); const StealthPlugin = require('puppeteer-extra-plugin-stealth'); puppeteer.use(StealthPlugin()); const browser = await puppeteer.launch({ headless: 'new', args: ['--no-sandbox', '--disable-blink-features=AutomationControlled'] }); :
FROM node:18-slim
RUN apt-get update && apt-get install -y chromium --no-install-recommends
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
CMD ["npm", "run", "test:e2e"]סביבה זו מבטיחה תוצאות עקביות במחשב מקומי, ב-CI ובשרת. אנו גם מגדירים healthcheck עבור היישום—הבדיקות מתחילות רק לאחר שהשרת מגיב לבקשה. לביצוע בדיקות רציף, אנו מגדירים pipelines ב-GitLab CI או GitHub Actions. התצורה כוללת התקנת תלויות והרצת בדיקות עם דגלי await page.setRequestInterception(true); page.on('request', request => { if (request.url().includes('/api/products')) { request.respond({ status: 200, contentType: 'application/json', body: JSON.stringify([{ id: 1, name: 'MacBook' }]), }); } else { request.continue(); } }); ו---ci. קבצי ארטיפקט (צילומי מסך, לוגים) נשמרים לניתוח. דוגמה לתצורת GitLab CI:
// tests/login.test.ts
import puppeteer, { Browser, Page } from 'puppeteer';
describe('Login flow', () => {
let browser: Browser;
let page: Page;
beforeAll(async () => {
browser = await puppeteer.launch({
headless: 'new',
args: ['--no-sandbox'],
});
});
beforeEach(async () => {
page = await browser.newPage();
await page.setViewport({ width: 1280, height: 900 });
});
afterEach(async () => await page.close());
afterAll(async () => await browser.close());
test('successful login', async () => {
await page.goto('https://example.com/login');
await page.type('#email', '[email protected]');
await page.type('#password', 'password123');
await page.click('[type="submit"]');
await page.waitForNavigation({ waitUntil: 'networkidle2' });
expect(page.url()).toContain('/dashboard');
});
test('error on invalid credentials', async () => {
await page.goto('https://example.com/login');
await page.type('#email', '[email protected]');
await page.type('#password', 'wrong');
await page.click('[type="submit"]');
await page.waitForSelector('.error-message');
const errorText = await page.$eval('.error-message', el => el.textContent);
expect(errorText).toContain('Неверный email или пароль');
});
});
דוגמת בדיקת E2E להתחברות
npm install -D puppeteer jest-puppeteer # puppeteer включает Chromium автоматически
# Для использования системного Chrome: npm install -D puppeteer-coreהתקנה ותצורה בסיסית:
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
const browser = await puppeteer.launch({ headless: 'new', args: ['--no-sandbox', '--disable-blink-features=AutomationControlled'] });
הגדרת jest-puppeteer: צרו --reporter עם presets.
למה לבחור ב-Puppeteer?
Puppeteer אינו מסגרת בדיקות מלאה, אך הוא חיוני למשימות הדורשות שליטה מלאה בדפדפן. בניגוד ל-Playwright, Puppeteer עובד רק עם Chromium, אך מספק גישה ישירה ל-Chrome DevTools Protocol. זה מאפשר אמולציה של תנאי רשת, יצירת PDF וצילומי מסך—דברים שדורשים מניפולציה נוספת ב-Playwright. בהשוואה ישירה, Puppeteer מהיר פי 2 מ-Playwright למשימות גירוד (לפי ה-benchmarks שלנו). Playwright תומך ב-Chrome, Firefox ו-Safari עם API ברמה גבוהה יותר ו-auto-waits, בעוד ל-Puppeteer יש קהילה גדולה יותר ויותר תוספים לגירוד. אם ה-stack שלכם הוא Chromium ו-Node.js, Puppeteer מהיר יותר להקמה וקל יותר לשילוב.
טכניקות Puppeteer מתקדמות
אוטומציית הגנה מפני גירוד: בעת גירוד, אתרים חוסמים לעיתים קרובות בוטים. אנו משתמשים באמולציה מתקדמת: זיוף user-agent, viewport, navigator.webdriver, הוספת עיכובים אקראיים, ושימוש בפרוקסים. ב-Puppeteer, ניתן להשבית את הדגל stages: - test e2e: stage: test image: node:18 before_script: - npm ci script: - npm run test:e2e -- --ci --reporter=json artifacts: paths: - screenshots/ reports: junit: test-results/junit.xml ולהחיל את התוסף TimeoutError: waiting for selector. דוגמת השקה:
await page.setRequestInterception(true);
page.on('request', request => {
if (request.url().includes('/api/products')) {
request.respond({
status: 200,
contentType: 'application/json',
body: JSON.stringify([{ id: 1, name: 'MacBook' }]),
});
} else {
request.continue();
}
});יירוט בקשות ו-mocking של API:
---
stages:
- test
e2e:
stage: test
image: node:18
before_script:
- npm ci
script:
- npm run test:e2e -- --ci --reporter=json
artifacts:
paths:
- screenshots/
reports:
junit: test-results/junit.xml
מה כלול ביישום שלנו
- ניתוח תרחישי משתמש קריטיים (בדרך כלל 20–30 למהדורה הראשונה).
- כתיבת בדיקות E2E עם מחשבה על יציבות: timeouts מותאמים אישית, שאילתות חוזרות, טיפול בשגיאות רשת.
- הגדרת סביבת Docker ו-pipeline של CI/CD (GitLab CI / GitHub Actions).
- מתן תיעוד להרצה ותחזוקה של הבדיקות.
- הדרכת הצוות: כיצד להוסיף בדיקות חדשות ולתקן בדיקות שבורות.
- תמיכה לחודש אחד לאחר היישום.
- תוצרים: מאגר קוד בדיקות, קבצי תצורת CI/CD, תמונת Docker, דוחות בדיקות, וסרטון הדרכה.
לוח זמנים ומחירים
הגדרה בסיסית וכתיבת 20–30 תרחישים קריטיים אורכת בין 3 ל-5 ימי עסקים. המחיר מתחיל ב-$2,500 עבור אפליקציה אחת עם עד 30 תרחישים. תרחישים נוספים מתומחרים לפי תרחיש. קבלו הצעה מסחרית עם הערכה מדויקת—צרו קשר.
מקור: תיעוד Puppeteer







