اول از همه بیایید ببینیم وقتی میگیم «مرورگر» دقیقا منظورمون چیه. شما وقتی میخواید یه سایتی مثل گوگل یا اینستاگرام رو باز کنید، برنامه کروم، فایرفاکس یا هر مرورگر دیگهای رو باز میکنید. یه پنجره خوشگل جلوتون باز میشه که یه نوار آدرس داره، دکمههای «عقب» و «جلو» داره، میتونید توش اسکرول کنید، روی لینکها کلیک کنید و خلاصه کلی کار گرافیکی انجام بدید. به کل این ظاهر و پوستهای که شما میبینید و باهاش کار میکنید، میگن رابط کاربری گرافیکی یا به اختصار GUI. این رابط کاربری مثل صورت و بدن یه آدمه که باعث میشه بتونیم باهاش ارتباط برقرار کنیم.
حالا تصور کنید ما بیایم و کل این ظاهر گرافیکی رو از مرورگر حذف کنیم. یعنی دیگه هیچ پنجرهای نباشه، هیچ دکمهای، هیچ نوار آدرسی که دیده بشه. انگار که جسم مرورگر رو گرفتیم و فقط روحش باقی مونده. چیزی که به دست میاد دقیقا یک مرورگر بیسر یا Headless Browser هست. این مرورگر دیگه ظاهر نداره، اما مغزش هنوز سر جاشه. یعنی چی؟ یعنی هنوزم میتونه یه صفحه وب رو به طور کامل بارگذاری کنه، کدهای HTML رو بخونه و بفهمه، استایلها و رنگبندی صفحه (همون کدهای CSS) رو درک کنه و حتی کدهای پیچیده جاوا اسکریپت و Ajax رو اجرا کنه. در واقع، همه کارهایی که یه مرورگر معمولی انجام میده رو انجام میده، فقط ما نتیجه رو به صورت گرافیکی نمیبینیم.
پس چجوری کنترلش میکنیم؟ به جای کلیک کردن و تایپ کردن توی یه پنجره، ما از طریق خط فرمان (Command-Line) یا از طریق ارتباط شبکهای بهش دستور میدیم. انگار داریم پشت تلفن باهاش حرف میزنیم و بهش میگیم: «برو به سایت فلان، روی اون دکمه کلیک کن، توی اون کادر فلان چیز رو بنویس و بعد یه عکس از صفحه بگیر و برای من بفرست». همه این کارها رو در پشت صحنه انجام میده، بدون اینکه حتی یک پیکسل روی مانیتور شما نمایش داده بشه. این ویژگی باعث میشه مرورگرهای بیسر فوقالعاده سریع و سبک باشن، چون دیگه لازم نیست انرژی و منابع سیستم رو صرف کشیدن و نقاشی کردن ظاهر صفحه کنن.
این قابلیت که مرورگرهای بیسر میتونن HTML رو دقیقا مثل یه مرورگر معمولی درک کنن، خیلی مهمه. یعنی میتونن بفهمن چیدمان صفحه چجوریه، رنگها چی هستن، فونتها چطور انتخاب شدن و از همه مهمتر، جاوا اسکریپت و Ajax رو اجرا کنن. خیلی از روشهای تست دیگه، این قابلیت اجرای جاوا اسکریپت رو ندارن و اینجاست که مرورگرهای بیسر یه مزیت بزرگ پیدا میکنن.
جالبه بدونید که این ایده اونقدر مهم و کاربردی شد که مرورگرهای بزرگ هم به فکر افتادن. گوگل کروم از نسخه ۵۹ به بعد و موزیلا فایرفاکس از نسخه ۵۶ به بعد، این قابلیت رو به صورت داخلی و بومی توی خودشون قرار دادن. این یعنی دیگه لازم نیست برای داشتن یه مرورگر بیسر، حتما یه نرمافزار جدا نصب کنیم. میتونیم به خود کروم یا فایرفاکس دستور بدیم که در حالت بیسر اجرا بشن. این حرکت باعث شد که خیلی از ابزارهای قدیمیتر که برای همین کار ساخته شده بودن، مثل PhantomJS، تقریبا بازنشسته بشن و کنار برن، چون دیگه خود غولهای بزرگ این کار رو راحت کرده بودن.
خب، این مرورگر نامرئی به چه دردی میخوره؟
شاید الان با خودتون بگید خیلی خب، فهمیدیم چیه، ولی چرا باید کسی بخواد از یه مرورگر بدون صفحه نمایش استفاده کنه؟ کاربردش چیه؟ اتفاقا کاربردهای خیلی مهم و زیادی داره که در ادامه با هم چندتا از اصلیترینهاشون رو بررسی میکنیم.
۱. اتوماسیون تست در اپلیکیشنهای وب (Web Testing)
این یکی از بزرگترین و مهمترین کاربردهای مرورگرهای بیسر هست. تصور کنید شما یه تیم برنامهنویسی هستید که یه سایت فروشگاهی بزرگ طراحی کردید. توی این سایت هزاران دکمه، فرم ثبتنام، فرم ورود، مراحل خرید و کلی چیز دیگه وجود داره. حالا شما میخواید مطمئن بشید که همه اینها درست کار میکنن. مثلا اگه کاربر روی دکمه «افزودن به سبد خرید» کلیک کرد، واقعا محصول به سبد خرید اضافه میشه؟ اگه فرم ثبتنام رو پر کرد، اطلاعاتش درست توی سیستم ثبت میشه؟
یه راهش اینه که یه نفر آدم بشینه و دونه دونه این کارها رو دستی انجام بده. روی همه دکمهها کلیک کنه، همه فرمها رو پر کنه و ببینه چی میشه. این کار فوقالعاده وقتگیر، خستهکننده و پر از خطای انسانیه. حالا فرض کنید شما هر روز یه تغییر کوچیک توی سایت میدید. باید هر روز دوباره کل این مراحل رو تست کنید؟ معلومه که نه!
اینجاست که مرورگرهای بیسر وارد میشن. توسعهدهندهها اسکریپتها یا برنامههای کوچیکی مینویسن که به مرورگر بیسر دستور میده به صورت خودکار این کارها رو انجام بده. مثلا یه اسکریپت مینویسن که:
- صفحه ثبتنام رو باز کن.
- توی کادر نام کاربری، بنویس «تست».
- توی کادر رمز عبور، بنویس «۱۲۳۴۵۶».
- روی دکمه ثبتنام کلیک کن.
- ببین آیا پیام «ثبتنام با موفقیت انجام شد» نمایش داده میشه یا نه.
این تستها میتونن در عرض چند ثانیه هزاران بار اجرا بشن. اینجوری تیم توسعه مطمئن میشه که حتی با کوچیکترین تغییرات، عملکرد اصلی سایت خراب نشده. چون مرورگر بیسر هیچ رابط گرافیکی نداره، این تستها خیلی سریعتر و با مصرف منابع کمتری انجام میشن. این موضوع به خصوص در محیطهای CI/CD (یکپارچهسازی و تحویل مداوم) که سرعت اجرای تستها خیلی مهمه، یه مزیت بزرگ به حساب میاد.
توی این زمینه ابزارهای مختلفی وجود دارن که از مرورگرهای بیسر برای تست استفاده میکنن:
- Capybara: این ابزار از مرورگر بیسر (چه WebKit چه کروم بیسر) استفاده میکنه تا رفتار کاربر رو توی پروتکلهای تست خودش شبیهسازی کنه.
- Jasmine: این فریمورک به طور پیشفرض از ابزاری به نام Selenium استفاده میکنه، اما میتونه از WebKit یا کروم بیسر هم برای اجرای تستهای مرورگر کمک بگیره.
- Cypress: یک فریمورک خیلی محبوب برای تست کردن بخش فرانتاند یا همون ظاهر سایتها.
- QF-Test: ابزاری برای تست خودکار برنامهها از طریق رابط کاربری گرافیکی که میتونه از مرورگر بیسر هم برای تست کردن استفاده کنه.
- Testsigma: یک پلتفرم اتوماسیون تست مبتنی بر هوش مصنوعی و ابری که از تست با مرورگر بیسر پشتیبانی میکنه.
۲. گرفتن اسکرینشات از صفحات وب
یکی دیگه از کاربردهای خیلی ساده و مفید مرورگرهای بیسر، گرفتن عکس از صفحات وبه. فرض کنید شما میخواید ببینید ظاهر سایتتون روی دستگاههای مختلف با اندازههای صفحه نمایش متفاوت چجوری دیده میشه. یا مثلا میخواید یه سرویسی درست کنید که هر روز از صفحه اول سایتهای خبری عکس بگیره و آرشیو کنه.
با یه دستور ساده به مرورگر بیسر، میتونید بهش بگید که یه سایت خاص رو باز کنه و از کل صفحه یا یه قسمت مشخص از اون، یه عکس با کیفیت بگیره و ذخیره کنه. این کار برای تست چیدمان (Layout) صفحه خیلی کاربردیه. توسعهدهندهها میتونن به صورت خودکار از صفحات مختلف اسکرینشات بگیرن و اونها رو با هم مقایسه کنن تا مطمئن بشن که تغییرات جدید، ظاهر سایت رو به هم نریخته. این کار کمک میکنه تا اجرای تست در محیطهای مختلف آسونتر بشه و مقایسه بین حالتهای مختلف رابط کاربری راحتتر انجام بگیره.
۳. اجرای تستهای خودکار برای کتابخانههای جاوا اسکریپت
دنیای وب مدرن پر از کتابخانههای جاوا اسکریپته. این کتابخانهها کدهای از پیش نوشته شدهای هستن که به توسعهدهندهها کمک میکنن کارهای پیچیده رو راحتتر انجام بدن. مثلا یه کتابخونه برای ساختن نمودارهای خوشگل، یا یه کتابخونه برای مدیریت انیمیشنها.
سازندههای این کتابخانهها باید مطمئن بشن که کدشون توی مرورگرهای مختلف درست کار میکنه. اونها هم از مرورگرهای بیسر استفاده میکنن تا تستهای خودکار رو برای کتابخونههاشون اجرا کنن. این تستها توی محیط مرورگر بیسر خیلی سریعتر و بهینهتر اجرا میشن، چون دیگه اون سربار مربوط به رابط کاربری وجود نداره.
۴. اتوماسیون تعامل با صفحات وب
این مورد یه کم شبیه به تست خودکاره، اما هدفش فقط تست کردن نیست. گاهی وقتا ما میخوایم یه سری کارهای تکراری رو توی یه سایت به صورت خودکار انجام بدیم. مثلا فرض کنید شما میخواید یه ربات برای اینستاگرام بنویسید که به صورت خودکار وارد اکانت شما بشه، چندتا عکس رو لایک کنه و یه کامنت بذاره.
این کار دقیقا با مرورگر بیسر انجام میشه. شما یه اسکریپت مینویسید که به مرورگر دستور میده صفحه لاگین اینستاگرام رو باز کنه، نام کاربری و رمز عبور شما رو وارد کنه، دکمه ورود رو بزنه و بعدش کارهای دیگهای که ازش خواستید رو انجام بده. در واقع هر کاری که یه آدم میتونه توی مرورگر انجام بده (کلیک کردن، تایپ کردن، اسکرول کردن و…)، یه مرورگر بیسر هم میتونه به صورت برنامهریزی شده انجام بده. این کارها میتونه شامل پر کردن فرمها، کلیک روی دکمهها و لینکها و شبیهسازی ورودیهای کیبورد باشه. هر چیزی که بشه خودکارش کرد تا در زمان و تلاش صرفهجویی بشه، با مرورگر بیسر ممکنه.
۵. استخراج داده یا وب اسکرپینگ (Web Scraping)
یکی دیگه از کاربردهای فوقالعاده مهم مرورگرهای بیسر، جمعآوری اطلاعات از وبسایتهاست که بهش میگن وب اسکرپینگ. تصور کنید شما میخواید قیمت یه محصول خاص رو از ۱۰ تا سایت فروشگاهی مختلف جمعآوری کنید و با هم مقایسه کنید. به جای اینکه دستی به هر ۱۰ تا سایت سر بزنید، میتونید یه برنامه بنویسید که با استفاده از مرورگر بیسر، به صورت خودکار به این سایتها بره، صفحه محصول رو باز کنه و قیمت رو از توی کد HTML صفحه استخراج کنه.
این کار برای جمعآوری دادههای عمومی از اینترنت خیلی مفیده. مثلا جمعآوری اطلاعات آب و هوا، نتایج ورزشی، قیمت سهام یا هر اطلاعات دیگهای که به صورت عمومی روی وبسایتها موجوده. خوبی استفاده از مرورگر بیسر برای این کار اینه که میتونه با سایتهای مدرن که از جاوا اسکریپت برای نمایش محتوا استفاده میکنن هم کار کنه. خیلی از سایتها وقتی شما بازشون میکنید، اول یه صفحه خالی نشون میدن و بعد با جاوا اسکریپت اطلاعات رو از سرور میگیرن و توی صفحه قرار میدن. ابزارهای اسکرپینگ ساده نمیتونن این اطلاعات رو ببینن، اما چون مرورگر بیسر جاوا اسکریپت رو اجرا میکنه، صبر میکنه تا صفحه کامل لود بشه و بعد اطلاعات رو استخراج میکنه.
جالبه بدونید که حتی گوگل هم به این موضوع توجه داشته. در سال ۲۰۰۹، گوگل اعلام کرد که استفاده از یه مرورگر بیسر میتونه به موتور جستجوش کمک کنه تا محتوای سایتهایی که از Ajax استفاده میکنن رو بهتر ایندکس کنه. Ajax یه تکنولوژی بود که به صفحات وب اجازه میداد بدون رفرش شدن کامل، اطلاعات جدید رو بارگذاری کنن. این برای رباتهای جستجوگر قدیمی یه چالش بود، اما مرورگرهای بیسر این مشکل رو حل کردن.
بعضی سرویسها مثل Web Scraper API و Web Unblocker از شرکت Oxylabs، یه قابلیتی به نام Headless Browser دارن که به کاربرها اجازه میده دادههای عمومی رو از سایتهای پیچیده جمعآوری کنن. با این قابلیت میشه:
- دستورالعملهای مرورگر رو برای خودکارسازی تعاملات کاربر تنظیم کرد.
- رفتار مرورگر رو برای شبیهسازی یه کاربر واقعی، شخصیسازی کرد.
- جاوا اسکریپت رو اجرا کرد و دادههای بیشتری رو توی صفحه بارگذاری کرد.
اینجوری عملیات اسکرپینگ شما برای مدیریت تعاملات مختلف صفحه و چالشها، مجهزتر میشه و دیگه نیازی به ابزارهای خارجی نیست.
آیا از مرورگرهای بیسر استفاده نادرست هم میشه؟
مثل هر تکنولوژی دیگهای، از مرورگرهای بیسر هم میشه برای کارهای نادرست و مخرب استفاده کرد. بیایید چند نمونه از این سوءاستفادهها رو ببینیم، اما حواستون باشه که در نهایت به یه نتیجهگیری جالب میرسیم.
- انجام حملات DDoS: حمله DDoS یا «محرومسازی از سرویس توزیعشده» یعنی اینکه تعداد خیلی خیلی زیادی درخواست به سمت یه سرور سایت فرستاده بشه تا سرور نتونه جواب بده و از دسترس خارج بشه. هکرها میتونن از ارتشی از مرورگرهای بیسر استفاده کنن تا این درخواستها رو به صورت خودکار به سمت سایت هدف بفرستن. یه گزارش در سال ۲۰۱۳ به یه باتنت (شبکهای از کامپیوترهای آلوده) اشاره کرد که از مرورگر بیسر برای یه حمله DDoS به مدت ۱۵۰ ساعت استفاده کرده بود.
- افزایش غیرواقعی بازدید تبلیغات (Ad Fraud): بعضی از تبلیغات آنلاین بر اساس تعداد بازدید پول پرداخت میکنن. افراد سودجو میتونن با استفاده از مرورگرهای بیسر، به صورت خودکار و در مقیاس بزرگ، صفحاتی که تبلیغشون توش هست رو باز کنن تا اینجوری آمار بازدید رو به صورت تقلبی بالا ببرن و پول بیشتری به جیب بزنن. در سال ۲۰۱۴، مقالهای به این موضوع اشاره کرد که ترافیک وب بیسر، اقتصاد اینترنت رو تهدید میکنه.
- خودکارسازی سایتها به روشهای ناخواسته: گاهی وقتا از این ابزارها برای دور زدن قوانین یه سایت استفاده میشه. مثلا برای Credential Stuffing. این یعنی هکرها یه لیست بزرگ از نامهای کاربری و رمزهای عبوری که از جاهای دیگه لو رفته رو برمیدارن و با مرورگر بیسر سعی میکنن به صورت خودکار با اونها وارد اکانتهای کاربری یه سایت دیگه بشن. چون خیلی از آدما از یه رمز عبور برای چندتا سایت استفاده میکنن، این روش متاسفانه گاهی وقتا جواب میده.
اما یه نکته خیلی مهم! با وجود همه این نگرانیها، یه تحقیق جالبی در سال ۲۰۱۸ انجام شد. این تحقیق ترافیک مرورگرها رو بررسی کرد و به این نتیجه رسید که هیچ ترجیحی از طرف افراد خرابکار برای استفاده از مرورگرهای بیسر وجود نداره. یعنی هیچ نشانهای وجود نداره که بگیم مرورگرهای بیسر بیشتر از مرورگرهای معمولی برای کارهای مخرب مثل حملات DDoS، تزریق SQL یا حملات Cross-site scripting استفاده میشن. پس با اینکه پتانسیل سوءاستفاده وجود داره، در عمل به نظر نمیرسه که این ابزارها انتخاب اول هکرها باشن.
ابزارهای کنترل این ارواح نامرئی: چطور با مرورگر بیسر کار کنیم؟
همونطور که گفتیم، مرورگرهای بزرگی مثل کروم و فایرفاکس الان حالت بیسر داخلی دارن. این کار از طریق API ها یا رابطهای برنامهنویسی انجام میشه که به توسعهدهندهها اجازه میده از طریق کد، مرورگر رو کنترل کنن. برای اینکه این کار راحتتر بشه، یه سری نرمافزارها و کتابخانهها به وجود اومدن که یه رابط یکپارچه برای اتوماسیون مرورگرها فراهم میکنن. بیایید با چندتا از معروفترینهاشون آشنا بشیم.
۱. Selenium WebDriver
سلنیوم شاید قدیمیترین و معروفترین ابزار تو این حوزه باشه. این یه پروژه خیلی بزرگه که به شما اجازه میده مرورگرهای مختلف (نه فقط کروم و فایرفاکس) رو به صورت خودکار کنترل کنید. نکته مهم در مورد سلنیوم اینه که یه پیادهسازی سازگار با استاندارد W3C از WebDriver هست. W3C کنسرسیوم وب جهانیه که استانداردهای وب رو تعیین میکنه. اینکه سلنیوم با این استانداردها سازگاره یعنی یه ابزار قابل اعتماد و استاندارده.
۲. Playwright
پلیرایت یه کتابخونه نسبتا جدیده که توسط مایکروسافت توسعه داده شده. این یه کتابخونه برای Node.js هست (Node.js به شما اجازه میده جاوا اسکریپت رو خارج از مرورگر و روی سرور اجرا کنید). با پلیرایت میتونید سه تا از مهمترین موتورهای مرورگر دنیا رو کنترل کنید: Chromium (موتور کروم و اج)، Firefox و WebKit (موتور سافاری). این یعنی با یه ابزار میتونید سایتتون رو روی سه تا مرورگر اصلی تست کنید.
۳. Puppeteer
پاپیتیر هم یه کتابخونه Node.js دیگه است که این یکی توسط تیم گوگل کروم توسعه داده شده. همونطور که از اسم سازندهاش مشخصه، پاپیتیر به طور تخصصی برای کنترل مرورگر کروم (یا کرومیوم) طراحی شده. این ابزار خیلی قدرتمنده و به شما کنترل سطح بالایی روی مرورگر میده. خیلی از مثالهایی که در مورد اتوماسیون میزنیم، مثل همون ربات اینستاگرام، به راحتی با پاپیتیر قابل پیادهسازیه.
بیایید یه نگاه عمیقتر به یه مثال واقعی با پاپیتیر بندازیم. یه توسعهدهنده میخواست یه ربات اینستاگرام بسازه که با Azure Functions (یه سرویس بدون سرور از مایکروسافت) کار کنه. اون از Browserless استفاده کرده بود که در واقع پاپیتیر در حال اجرا توی یه کانتینر داکره. کدش برای لاگین کردن به اینستاگرام یه چیزی شبیه این بود:
const browser = await puppeteer.connect({
browserWSEndpoint: process.env.WS_ENDPOINT
});
تو این تیکه کد، به جای اینکه یه مرورگر جدید باز کنه، داره به یه مرورگری که از قبل در حال اجراست (همون Browserless) وصل میشه. آدرس اون مرورگر توی یه متغیر محیطی به اسم WS_ENDPOINT ذخیره شده. این کار کمک میکنه تا منابع بهینهتر مصرف بشن. بعدش با دستوراتی مثل page.type() و page.click()، فرم لاگین رو پر میکنه و وارد سایت میشه. این یه نمونه عالی از قدرت پاپیتیر برای اتوماسیون کارهای واقعیه.
رویکردهای جایگزین: شبیهسازی مرورگر بدون مرورگر واقعی
یه راه دیگه هم برای تست و اتوماسیون وجود داره که یه کم متفاوته. به جای استفاده از یه مرورگر کامل (حتی به صورت بیسر)، از نرمافزارهایی استفاده میکنیم که فقط API های مرورگر رو شبیهسازی میکنن. این ابزارها معمولا کدهای HTML رو تجزیه میکنن (HTML parsing)، کوکیها رو مدیریت میکنن، درخواستهای XHR (که برای Ajax استفاده میشه) رو انجام میدن و تا حدی جاوا اسکریپت رو هم پشتیبانی میکنن.
اما تفاوت بزرگشون اینه که اونها DOM رو رندر نمیکنن. DOM یا Document Object Model یه مدل درختی از تمام عناصر یه صفحه وبه. مرورگرهای واقعی این مدل رو میسازن و بعد بر اساس اون صفحه رو نقاشی میکنن. این ابزارهای شبیهساز، مرحله نقاشی رو ندارن و پشتیبانیشون از رویدادهای DOM (مثل کلیک کردن، حرکت موس و …) هم محدوده.
مزیت بزرگشون چیه؟ سرعت فوقالعاده بالا. چون خیلی از کارهای سنگین یه مرورگر واقعی رو انجام نمیدن، معمولا خیلی سریعتر از مرورگرهای کامل عمل میکنن.
عیبشون چیه؟ نمیتونن خیلی از سایتهای محبوب و پیچیده امروزی رو به درستی تفسیر کنن. چون خیلی از سایتها به شدت به جاوا اسکریپت و تعاملات پیچیده DOM وابستهان.
چندتا از این ابزارها عبارتند از:
- jsdom: این معروفترین و کاملترین ابزار برای شبیهسازی مرورگر در محیط Node.js هست.
- Deno: این یه محیط اجرایی جدیده برای جاوا اسکریپت (یه جورایی رقیب Node.js) که API های مرورگر رو به عنوان بخشی از طراحی اصلی خودش ارائه میده.
- HtmlUnit: این یه مرورگر بیسر نوشته شده به زبان جاواست. HtmlUnit از موتور Rhino برای پشتیبانی از جاوا اسکریپت و Ajax استفاده میکنه و حتی تا حدی قابلیت رندر کردن هم داره. این ابزار به خصوص برای تست سایتهای تجارت الکترونیک محبوبه، چون برای تست کردن فرمها، ریدایرکتهای سایت و احراز هویت HTTP خیلی خوب عمل میکنه.
- envjs: این یه تلاش قدیمیتر بود که در سال ۲۰۰۸ توسط جان رسیگ (خالق jQuery) معرفی شد. envjs هم یه محیط شبیهسازی شده مرورگر بود که به زبان جاوا اسکریپت برای موتور Rhino نوشته شده بود.
جعبه ابزار مرورگرهای بیسر: نگاهی به چند نرمافزار خاص
علاوه بر ابزارهای کنترل مرورگر و شبیهسازها، یه سری نرمافزارهای مستقل هم وجود دارن که API های مرورگر بیسر رو ارائه میدن. هر کدوم از اینها ویژگیهای خاص خودشون رو دارن.
- Splash: این یه مرورگر وب بیسر هست که به زبان پایتون و با استفاده از موتور چیدمان WebKit (از طریق Qt) نوشته شده. Splash یه API از نوع HTTP داره، از اسکریپتنویسی با زبان Lua پشتیبانی میکنه و حتی یه محیط توسعه داخلی مبتنی بر IPython (Jupyter) هم داره. توسعه این ابزار در سال ۲۰۱۳ در شرکت ScrapingHub شروع شد و جالبه بدونید که بخشی از بودجهاش توسط دارپا (DARPA)، آژانس پروژههای تحقیقاتی پیشرفته دفاعی آمریکا، تامین شده.
- Zombie.js: همونطور که قبلا اشاره کردیم، این یه محیط مرورگر شبیهسازی شده برای Node.js هست که خیلی سبکه و برای تستهای سریع استفاده میشه.
- SimpleBrowser: این یه مرورگر وب بیسر هست که به زبان C# نوشته شده و از NET Standard 2.0. پشتیبانی میکنه. این ابزار برای توسعهدهندههایی که در اکوسیستم داتنت کار میکنن مناسبه.
- DotNetBrowser: این هم یه کتابخونه تجاری و غیر رایگان مبتنی بر کرومیوم برای داتنته. این کتابخونه یه حالت رندر خارج از صفحه (off-screen) ارائه میده و میشه بدون جاسازی یا نمایش هیچ پنجرهای ازش استفاده کرد.
دوران جدید: وقتی هوش مصنوعی با مرورگر بیسر وبگردی میکنه!
خب بچهها، تا اینجا با مفهوم و کاربردهای کلاسیک مرورگر بیسر آشنا شدیم. اما داستان اینجا تموم نمیشه. اخیرا با ظهور هوش مصنوعی و به خصوص «عاملهای هوشمند» (AI Agents)، مرورگرهای بیسر دوباره به شدت مورد توجه قرار گرفتن و یه نقش جدید و خیلی جالب پیدا کردن.
قبلا مرورگرهای بیسر بیشتر ابزار دست توسعهدهندهها برای تست و مهندسهای سئو برای تحلیل سایتها بودن. اما الان، مرورگرهای جدیدی که با هوش مصنوعی کار میکنن، مثل Comet از شرکت Perplexity و Dia از شرکت Browser Company of New York، دارن به این مفهوم یه معنی کاملا جدید میدن. این شرکتها از مرورگرهای بیسر استفاده میکنن تا به عاملهای هوشمندشون قدرت بدن که مثل یه انسان واقعی توی وبسایتها بگردن، کلیک کنن، اسکرول کنن و با صفحات تعامل داشته باشن تا اطلاعات مورد نیازشون رو به دست بیارن.
بیایید ببینیم این یعنی چی و چه فرقی با روشهای قدیمی داره.
روش قدیمی رباتهای هوش مصنوعی
تا همین چند وقت پیش، وقتی شما از یه هوش مصنوعی مثل ChatGPT یه سوال میپرسیدید، دو حالت داشت: یا از دانش از پیش آموزش دیدهاش جواب میداد، یا برای گرفتن اطلاعات جدید، به وبسایتها درخواست میفرستاد (به این روش میگن Retrieval-Augmented Generation یا RAG). وقتی این رباتها به یه سایت سر میزدن، خودشون رو معرفی میکردن. یعنی توی درخواستشون یه چیزی به نام «رشته عامل کاربر» (User-Agent String) وجود داشت که مشخص میکرد این یه رباته. مثلا ChatGPT-User یا PerplexityBot. اینجوری مدیران سایتها میفهمیدن که این بازدیدکننده یه رباته و میتونستن تصمیم بگیرن که بهش اجازه دسترسی بدن یا نه.
روش جدید با مرورگر بیسر
اما این موج جدید رابطهای هوش مصنوعی، مثل عاملهای خودکار و مرورگرهای هوش مصنوعی، یه جور دیگه کار میکنن. اونها به جای اینکه یه درخواست ساده برای گرفتن اطلاعات بفرستن و بگن «من ربات هستم»، از یه مرورگر بیسر استفاده میکنن تا واقعا سایت رو مثل یه آدم باز کنن. اونها کلیک میکنن، صفحات رو اسکرول میکنن و صبر میکنن تا همه چیز لود بشه.
نکته مهم و حساس ماجرا اینجاست: این بازدیدها اغلب خودشون رو به عنوان یه بازدیدکننده استاندارد معرفی میکنن. مثلا از رشته عامل کاربر Chromium (موتور متنباز گوگل کروم) استفاده میکنن. نتیجهاش چیه؟ برای صاحب سایت خیلی خیلی سخت میشه که تشخیص بده این بازدیدکننده یه انسان واقعیه یا یه عامل هوش مصنوعی که داره وبگردی میکنه.
این موضوع یه سری سوالات و نگرانیهای جدی برای شرکتهای رسانهای و ناشران محتوا ایجاد کرده:
- چقدر از ترافیک سایت ما واقعیه و چقدرش خودکاره؟
- پلتفرمهای تحلیل ترافیک چجوری باید این بازدیدهای عاملمحور رو حساب کنن؟
- برای تبلیغدهندهها، آیا این جلسات هوش مصنوعی آمار و ارقام رو خراب نمیکنه و راه جدیدی برای تقلب باز نمیکنه؟
بر اساس یه گزارش جدید از شرکت Tollbit، مرورگرهای بیسر هوش مصنوعی میتونن روشهای معمول مسدود کردن رباتها رو دور بزنن. حتی بعضی از این سرویسها مثل Browserless ادعا میکنن که میتونن ابزارهای تشخیص ربات رو فریب بدن و حتی کپچاها (CAPTCHA) رو هم حل کنن (همون سوالهای تصویری که برای تشخیص انسان از ربات استفاده میشه).
گزارش Tollbit یه نکته جالب دیگه رو هم فاش کرده: «در مورد Perplexity Comet، به نظر میرسه که این عامل از کامپیوتر دسکتاپ خود کاربر برای درخواست صفحات وب استفاده میکنه. این باعث میشه درخواستها از یه آدرس IP خانگی (Residential IP) بیان که میتونه شرکتهای ارائه دهنده خدمات تحویل محتوا (CDN) رو گیج کنه و اونها فکر کنن این یه ترافیک قانونی و واقعیه».
این مشکل چقدر جدیه؟
هنوز اول راهیم، اما مدیران رسانهها معتقدن که این مرورگرهای بیسر هوش مصنوعی یه تهدید برای کسبوکارشون محسوب میشن. استفاده از این مرورگرها روز به روز بیشتر میشه. مثلا همین چند وقت پیش، به میلیونها کاربر PayPal و Venmo دسترسی رایگان به مرورگر Comet داده شد. تازه شایعه شده که OpenAI و گوگل هم دارن روی مرورگرهای هوش مصنوعی خودشون کار میکنن.
این موضوع میتونه مرحله بعدی جنگ بین ناشران و رباتهای هوش مصنوعی باشه. ناشران همین الان هم دارن تلاش میکنن تا جلوی رباتهایی که محتواشون رو بدون اجازه کپی میکنن (Scraping) بگیرن. مرورگرهای بیسر هوش مصنوعی میتونن تمام این تلاشها رو دور بزنن.
بر اساس دادههای Tollbit، ترافیک انسانی به سمت سایتهای ناشران داره کم میشه، در حالی که ترافیک رباتها در حال افزایشه. این گزارش نشون میده که تعداد بازدیدکنندگان انسانی بین سه ماهه اول و دوم سال ۲۰۲۵، ۹.۴ درصد کاهش داشته. در همین حال، نسبت بازدید رباتهای هوش مصنوعی به بازدیدکنندگان انسانی از ۱ به ۲۰۰ در سه ماهه اول، به ۱ به ۵۰ در سه ماهه دوم رسیده.
یه نگرانی بزرگ دیگه اینه که تبلیغات سایتها به جای انسانها، به این عاملهای هوش مصنوعی نمایش داده میشه. به گفته مدیرعامل Tollbit، این اتفاق در حالت عامل هوشمند ChatGPT هم میفته. این موضوع میتونه به یه تقلب تبلیغاتی در مقیاس غیرقابل باور تبدیل بشه و ارزش تبلیغات (CPM) رو به شدت پایین بیاره.
جسی دوایر، مدیر ارتباطات در Perplexity، در جواب به این نگرانیها گفته که هزینهها برای خود Perplexity خیلی بیشتره: «وقتی یه کاربر، دستیار Comet خودش رو به یه سایت میفرسته، هزینه این کار برای Perplexity بین ۳۵۰ تا ۲۳۰۰ برابر بیشتر از هزینه ناشر برای نمایش یه صفحه به اون کاربره».
چجوری میشه این ترافیک رو تشخیص داد؟
تشخیص این نوع ترافیک خیلی سخته، اما غیرممکن نیست. چندتا سیگنال وجود داره که ناشران میتونن دنبالشون بگردن:
- اگر درخواستی جاوا اسکریپت رو رندر نکنه، به احتمال زیاد از طرف انسان نیست، چون اکثر مرورگرهای امروزی جاوا اسکریپت رو فعال دارن.
- اگر آدرس IP از یه مرکز داده (Data Center) بیاد، این هم میتونه یه نشونه باشه. مشکل اینجاست که خیلی از این درخواستها، همونطور که گفتیم، از IP های خانگی میان.
در حال حاضر، هیچ پرچم یا نشانهای از طرف این مرورگرها به وبسایت فرستاده نمیشه که بگه «این مرورگر توسط هوش مصنوعی کنترل میشه» یا «این مرورگر توسط انسان کنترل میشه». این بزرگترین چالش فعلی برای ناشرانه.
محدودیتها و چالشهای کار با مرورگرهای بیسر
با همه خوبیها و کاربردهای هیجانانگیزی که از مرورگرهای بیسر گفتیم، این تکنولوژی محدودیتهای خودشم داره. مهمه که این محدودیتها رو هم بشناسیم تا بدونیم کی و کجا نباید ازشون استفاده کنیم.
۱. تمرکز روی باگهای اشتباه
یکی از مشکلات اینه که اجرای تستها با مرورگرهای بیسر ممکنه باعث بشه توجه توسعهدهندهها به سمت رفع باگهایی بره که فقط در محیط بیسر اتفاق میفتن. اما باید یادمون باشه که کاربرهای نهایی هیچوقت با یه مرورگر بیسر به سایت ما سر نمیزنن. پس اولویت باید همیشه با رفع مشکلاتی باشه که توی یه مرورگر کامل و گرافیکی دیده میشن. این باگهای خاص محیط بیسر ممکنه به خاطر نحوه بارگذاری فایلها یا مدیریت چیدمان صفحه در حالت بیسر باشه و باید در کنار اهداف کلی تست، ارزیابی بشن.
۲. چالشهای دیباگ کردن (Debugging)
گاهی وقتا توی تستهای بیسر، بعضی صفحات خیلی سریع لود میشن. این سرعت بالا باعث میشه پیدا کردن و رفع کردن خطاهای ناپایدار (inconsistent failures) سخت بشه. مثلا ممکنه یه تست از هر ده بار اجرا، یک بار شکست بخوره چون نتونسته یه دکمه رو پیدا کنه، چون صفحه اونقدر سریع لود شده که اسکریپت تست ازش جا مونده. این نوع تست محدود ممکنه رفتارهای واقعی کاربر رو پنهان کنه و ما رو مجبور کنه که برای پیدا کردن مشکل، به تستهای دستی یا مبتنی بر GUI برگردیم.
یکی از راهحلهای این مشکل، تست بین-مرورگری (Cross-browser testing) هست. یعنی اجرای تستها روی نسخههای مختلف مرورگرها تا از پوشش قویتر بعد از تغییرات بزرگ در کد، اطمینان حاصل بشه.
۳. چالشهای فنی در عمل
کار کردن با مرورگرهای بیسر همیشه هم راحت نیست. مثلا یه کاربری در ردیت گزارش داده بود که دستورات خط فرمان کروم بیسر روی ویندوز براش کار نمیکنه. دستوراتی مثل --headless --disable-gpu --dump-dom که باید کد HTML صفحه رو چاپ کنه، یا دستور --screenshot که باید یه عکس از صفحه بگیره، هیچ خروجی تولید نمیکردن. بعدا مشخص شد که در نسخههای اولیه، مثلا کروم ۵۹، حالت بیسر فقط روی مک و لینوکس در دسترس بوده و پشتیبانی از ویندوز در کروم ۶۰ اضافه شده. این نشون میده که همیشه باید به جزئیات فنی و سازگاری پلتفرمها دقت کرد.
یا مثلا یه توسعهدهنده اندروید در Stack Overflow میخواست از WebView (کامپوننتی برای نمایش صفحات وب در اپهای اندروید) به عنوان یه مرورگر بیسر برای اسکرپینگ یه سایت رستورانیاب استفاده کنه. اون میخواست به صورت خودکار فرم جستجو رو پر کنه و دکمه رو بزنه. کد جاوا اسکریپتی که برای این کار نوشته بود کار نمیکرد. این نشون میده که اتوماسیون در محیطهای خاص مثل موبایل میتونه چالشهای منحصر به فرد خودش رو داشته باشه.
یکی از بزرگترین چالشها در اتوماسیون، لاگین کردن و مدیریت کپچاهاست. یه کاربری در فروم Latenode مشکلش این بود که میخواست یه سری وظایف فیسبوک رو خودکار کنه. اون میتونست با SDK فیسبوک کاربر رو لاگین کنه و لینکها رو جمعآوری کنه، اما وقتی میخواست این لینکها رو با مرورگر بیسر باز کنه، مرورگر بیسر به عنوان اون کاربر لاگین نبود. این یه مشکل رایجه که چجوری جلسه (session) لاگین یه کاربر رو به یه مرورگر بیسر منتقل کنیم.
مشکل کپچا هم خیلی جدیه. یه کاربر دیگه میگفت وقتی با مرورگر بیسر یه سایت رو اسکرپ میکنه، بعد از چند بار باز کردن صفحه، سایت شروع میکنه به نشون دادن کپچا. اون به این فکر افتاده بود که آیا میشه OCR (تشخیص نوری کاراکترها) رو با مرورگر بیسر ترکیب کرد تا کپچاها رو به صورت خودکار حل کنه. اینها همه نمونههایی از مشکلات واقعی هستن که نشون میدن کار با این ابزارها همیشه هم یه مسیر صاف و ساده نیست.
پرسش و پاسخ
سوال: پس به طور خلاصه، مرورگر بیسر دقیقا چیه؟
جواب: مرورگر بیسر یه مرورگر وب معمولیه، فقط بدون اون قسمت گرافیکی و پنجرهای که شما میبینید. اون در پشت صحنه اجرا میشه، صفحات وب رو مثل یه مرورگر استاندارد بارگذاری و درک میکنه، اما شما چیزی روی صفحه نمایش نمیبینید. این ویژگی اون رو برای کارهایی مثل تست خودکار، جمعآوری داده (اسکرپینگ) و نظارت بر سایتها ایدهآل میکنه. چون نیازی به رندر کردن تصاویر نداره، سرعتش خیلی بیشتره و منابع کمتری مصرف میکنه.
سوال: چه فرقی بین یه مرورگر بیسر و یه مرورگر معمولی وجود داره؟
جواب: هر دوتاشون میتونن HTML رو رندر کنن، CSS رو بارگذاری کنن و جاوا اسکریپت رو اجرا کنن. تفاوت اصلی اینه که مرورگر معمولی یه رابط کاربری گرافیکی داره که شما باهاش تعامل میکنید و برای وبگردی روزمره و تستهای دستی مناسبه. اما مرورگر بیسر اون رابط گرافیکی رو حذف کرده و برای کارهای خودکار و اسکریپتنویسی بهینه شده. اون سریعتره و برای محیطهایی که منابع محدودی دارن (مثل سرورها) عالیه. البته برای تستهای بصری و چک کردن ظاهر سایت، هنوز هم به مرورگر معمولی نیاز داریم.
سوال: آیا کروم بیسر (Headless Chrome) میتونه جاوا اسکریپت رو اجرا کنه؟
جواب: بله، قطعا! این یکی از بزرگترین نقاط قوتشه. کروم بیسر به طور کامل از اجرای جاوا اسکریپت پشتیبانی میکنه. این یعنی میتونه محتوای داینامیک و پویای وبسایتهای مدرن رو رندر کنه. این قابلیت برای کارهایی مثل اسکرپ کردن سایتهایی که به شدت به جاوا اسکریپت وابستهان یا شبیهسازی رفتار کاربر مثل کلیک کردن، تایپ کردن و جابجا شدن بین صفحات، حیاتی و ضروریه.
سوال: تست بیسر (Headless Testing) یعنی چی؟
جواب: تست بیسر یعنی انجام دادن تستهای مرورگر بدون اینکه رابط کاربری یا GUI مرورگر باز بشه. این روش به تیمهای توسعه اجازه میده حجم زیادی از تستها رو با حداقل سربار و هزینه اجرا کنن. این کار فرایند تست رو سریعتر میکنه و به راحتی با چرخههای توسعه نرمافزار (مثل CI/CD) یکپارچه میشه. در مقابل، تست دستی کندتره، مستعد خطای انسانیه و مقیاسپذیر نیست. تستهای بیسر میتونن خیلی سریع مشکلات رو بعد از تغییرات در کد یا روی نسخههای مختلف مرورگر پیدا کنن.
سوال: آیا وبسایتها میتونن تشخیص بدن که یه مرورگر بیسر داره بهشون سر میزنه؟
جواب: بله، گاهی وقتا میتونن. بعضی سایتها از اسکریپتهایی استفاده میکنن که نبود رابط کاربری، زمانبندی غیرعادی در تعاملات کاربر، یا تفاوت در رفتار جاوا اسکریپت رو چک میکنن. مثلا ممکنه رفتار حرکت موس رو شبیهسازی کنن یا ببینن آیا بعضی ویژگیهای مرورگرهای استاندارد وجود داره یا نه. اما مرورگرهای بیسر مدرن مثل کروم و فایرفاکس خیلی پیچیدهتر شدن و سعی میکنن رفتار یه کاربر واقعی رو تقلید کنن. توسعهدهندهها هم میتونن تنظیمات رو طوری تغییر بدن که شبیهسازی بهتری انجام بشه و ریسک تشخیص کمتر بشه. با این حال، تشخیص دادن هنوزم یه بازی موش و گربه است.
سوال: آیا مرورگرهای بیسر برای تست عملکرد (Performance Testing) خوبن؟
جواب: بله، خیلی هم خوبن. اونها میتونن جریانهای کاری کاربر رو شبیهسازی کنن و زمان بارگذاری صفحه، رفتار رندر شدن و اجرای جاوا اسکریپت رو بدون اون سربار رابط کاربری، اندازهگیری کنن. این به توسعهدهندهها کمک میکنه تا تاثیر تغییرات کد روی عملکرد سایت رو ارزیابی کنن، به خصوص وقتی میخوان تاخیرهای رندر شدن رو تحلیل کنن یا پاسخگویی رابط کاربری رو بهینه کنن. تست عملکرد بیسر، یه روش برای تست کردن عملکرد سایت در یه محیط سبک و سریعتره.
منابع
- [2] Automated Facebook login for server-side headless browsing – Other Questions / Headless Browser – Latenode Official Community
- [4] 6 Popular Headless Browsers for Web Testing – KeyCDN
- [6] Automated captcha solving for headless browsing – Other Questions / Headless Browser – Latenode Official Community
- [8] Use Nightmare.js to Automate Headless Browsing | Linode Docs
- [10] Headless Browsing with Puppeteer & Playwright on Pipedream
- [12] Headless Browsers and How They Relate to Click Fraud | CHEQ
- [14] It is possible to detect and block Chrome headless | Hacker News
- [16] What are the remaining gaps in the elixir ecosystem? – Chat / Discussions – Elixir Programming Language Forum
- [18] Headless Chrome Javascript API/headless_shell questions
- [1] Headless browser – Wikipedia
- [3] Any way to do headless browsing w/ RSelenium & Firefox? : r/RStudio
- [5] What Is a Headless Browser and Where Is It Used?
- [7] Headless Browsing Chrome CLI On Windows Not Working : r/chrome
- [9] Is server‑side headless browsing supported within Retool workflows? – 💬 Workflows – Retool Forum
- [11] Web Automation & Headless browsing using Puppeteer. | by Tohju Domo | Another DIY Javascript Experiment | Medium
- [13] Has anyone found a way to record the UI with headless browsing? – Archive – The Club: Software Testing & Quality Engineering Community Forum | Ministry of Testing
- [15] javascript – Android Headless Browsing through WebView? – Stack Overflow
- [17] WTF is headless browsing, and how are AI agents fueling it? – Digiday
