

گرفتن اسکرینشات یکی از مهارتهای پایه در وب اسکریپینگ و تست خودکار است. اسکرینشاتها برای دیباگ، گزارشدهی، بررسی رگرسیون بصری و ثبت حالت صفحه در زمان مشخص کاربرد دارند. در این مقاله عملی برای توسعهدهندههای پایتون/جاوااسکریپت سطح متوسط توضیح میدهیم چگونه با Playwright اسکرینشات بگیرید، تنظیمات مهم را کنترل کنید، خطاهای رایج را رفع کنید و چند الگوی عملی برای پروژههای وب اسکریپینگ ارائه میکنیم.
متد page.screenshot() چند گزینه کلیدی دارد که رفتار تصویر خروجی را تعیین میکنند. اینجا مشخصات اصلی را با توضیح فنی میبینید:
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch(); // یا { headless: true }
const page = await browser.newPage();
await page.goto('https://quotes.toscrape.com');
// خروجی: فایل example.png در فولدر جاری
await page.screenshot({ path: 'example.png' });
await browser.close();
})();
توضیح خطبهخط:
await page.screenshot({ path: 'full-page.png', fullPage: true });
وقتی صفحه طولانی است و میخواهید تمام محتوا را بدون اسکرول دستی ذخیره کنید، از fullPage: true استفاده کنید. توجه داشته باشید که در بعضی صفحات با محتوای داینامیک ممکن است قبل از گرفتن تصویر لازم باشد منتظر بارگذاری کامل منابع بمانید.
برای ضبط تصویر با رزولوشن دلخواه یا گرفتن ناحیه خاص از صفحه:
// مشخص کردن اندازه پنجره (رزولوشن تصویر خروجی)
await page.setViewportSize({ width: 1920, height: 1080 });
// یا برش یک ناحیه مشخص
await page.screenshot({
path: 'clip.png',
clip: { x: 0, y: 0, width: 1200, height: 400 }
});
نکات مهم:
const element = page.locator('div.quote:nth-child(1)');
await element.screenshot({ path: 'element.png' });
در این حالت page.locator() یک سلکتور را نشان میدهد و متد screenshot() روی همان المنت اجرا میشود.
const urls = [
'https://www.google.com',
'https://www.bing.com',
'https://quotes.toscrape.com'
];
let id = 1;
for (const url of urls) {
await page.goto(url, { waitUntil: 'networkidle' });
await page.screenshot({ path: `screenshots/IMG_${id++}.png` });
}
نکات عملی:
// کیفیت فقط برای jpeg معتبر است
await page.screenshot({ path: 'screenshot.jpg', type: 'jpeg', quality: 50 });
نکته: فرمت PNG فشردهسازی بدون افت را ارائه میدهد و گزینه quality روی PNG تاثیری ندارد.
رزولوشن خروجی با اندازه viewport تعیین میشود. برای گرفتن تصاویر با رزولوشن بالاتر اندازه viewport را بزرگتر کنید یا از مقیاسهای CSS/zoom استفاده کنید:
await page.setViewportSize({ width: 2560, height: 1440 });
await page.screenshot({ path: 'highres.png' });
هشدار: افزایش رزولوشن حافظه و زمان پردازش را افزایش میدهد؛ برای اسکریپهای بزرگ، مصرف منابع را مانیتور کنید.
const buffer = await page.screenshot();
// ارسال به سرویس مقایسه پیکسل، آپلود یا تبدیل به base64
console.log(buffer.toString('base64'));
این الگو مناسب زمانی است که نمیخواهید فایل روی دیسک ذخیره شود و قصد دارید تصویر را مستقیماً به سرویس دیگری ارسال یا در حافظه پردازش کنید.
await page.goto('https://quotes.toscrape.com', { waitUntil: 'networkidle' });
await page.pdf({ path: 'file.pdf', format: 'A4' });
وقتی متن انتخابشدنی، چند صفحه یا فرمت چاپ اهمیت دارد، PDF گزینه مناسبتری است. page.pdf() تنظیماتی برای حاشیهها، قالب صفحه و غیره دارد.
await page.goto(url, { timeout: 15000, waitUntil: 'networkidle' });await page.waitForSelector('img', { visible: true }) یا منتظر شدن برای یک ایونت خاص استفاده کنید تا محتوای لازم رندر شود.async function safeScreenshot(page, options = {}, attempts = 3) {
for (let i = 0; i < attempts; i++) {
try {
return await page.screenshot(options);
} catch (err) {
if (i === attempts - 1) throw err;
await new Promise(r => setTimeout(r, 1000 * (i + 1))); // backoff ساده
}
}
}
این الگو به ویژه هنگام مواجهه با خطاهای موقتی شبکه یا منابع کمک میکند.
Playwright ابزار قدرتمندی برای گرفتن اسکرینشات در وب اسکریپینگ و تست است. با کنترل گزینههایی مثل fullPage، clip، quality و viewport میتوانید خروجیهای متناسب با نیازتان تهیه کنید. همیشه از wait مناسب برای محتوای داینامیک استفاده کنید، خطاها را با الگوهایی مانند retry مدیریت کنید و در صورت نیاز خروجی را به صورت Buffer دریافت کنید تا برای مقایسه بصری یا آپلود آماده باشد.
اگر دنبال بهبود پایداری و مقیاسپذیری هستید، کانتکستها را مدیریت کنید، از محدودیت همزمانی استفاده کنید و مسیرهای ذخیرهسازی را مستحکم کنید.


