بهروز
بهروز
خواندن ۳ دقیقه·۵ سال پیش

مرورگرهای بی کله!

تاریخ انتشار نسخه اصلی نوامبر 5, 2016
در پست قبل راجع به ابزارهای اتوماسیون تست برای برنامه های تحت وب نوشتم و اشاره کردم که webdriver از درایورهای مخصوص برای مرورگرهای متفاوت استفاده میکند. حالا دراین پست میخواهم درباره مرورگرهای headless و نقش آنها در Web automation توضیح بدهم. تفاوت مرورگر headless با سایر مرورگرها تنها نداشتن رابط کاربری گرافیکی یا GUI است که استفاده از آن توسط کاربر غیرحرفه ای را غیرممکن میکند. اما تمامی کارهای یک مرورگر گرافیکی مثل render کردن HTML به DOM (مهمترین اصل برای اتوماسیون وب) و تفسیر کدهای JavaScript را انجام میدهد. علاوه بر اتوماسیون وب این مرورگرها استفاده های دیگری مثل تست کارایی شبکه  یا حمله های DDoS دارند که همگی درواقع برپایه تکرار ارسال درخواست http و render پاسخ هاست.

اما وقتی راجع به اتوماسیون تست وب صحبت میکنیم، این مرورگرها چه کمکی میکنند؟ مهمترین و شاید تنها مزیت آنها سرعتشان است. در این مورد مقایسه ای میان درایور PhanjomJS (یعنی GhostDriver) و درایورهای Firefox و Chrome انجام شده که نشان میدهد با اجرای تستی مشابه برروی سخت افزار واحد سرعتها به این صورت است:

  • Firefoxdriver: 5.3s
  • Chromedriver: 2.9.s
  • Ghostdriver: 0.5s

سرعت اجرا در تست زمانی اهمیت پیدا میکند که Continuous Integration برای release ها و بازخوردهای سریع تنظیم شده باشد که در آینده درباره اش بیشتر مینویسم. خب، با وجود چنین مزیتی پس چرا سهم این مرورگرها در اتوماسیون مانند سایر درایورها زیاد نیست. مهمترین علل را میشود به این صورت دسته بندی کرد:

  • نوشتن تست: برای نوشتن تست نیاز است که برنامه نویس متناوباً از Inspect element یا ابزارهای دیگر برای شناسایی DOM در مرورگرها استفاده کند و headless ها فاقد آن هستند. این موضوع زمانی اهمیت بیشتری پیدا میکند که کسی که تست را مینویسد، برنامه نویس کد برنامه نباشد.
  • تفسیر کدهای JavaScript: امروزه با پراستفاده شدن JavaScript در برنامه نویسی وب مثل استفاده از Bootstrap، مهم است که driver مورد استفاده در اتوماسیون از چه مفسر (interpreter) استفاده میکند و اگر مفسر مرورگر با آنچه در مرورگرهای مشهور استفاده میشود متفاوت باشد، ممکن است کد تست در زمان اجرا دچار خطا شود.
  • ویژگیهای خاص مرورگر: اگر تست شامل استفاده از مثلا افزونه های مختص به یک مرورگر محبوب یا ویژگی منحصربفرد دیگری باشد، باز هم استفاده از مرورگر headless را که توسط کاربر عادی استفاده نمیشود، محدود میکند
  • نگهداری و عیب یابی تست: تست را یک بار مینوسند و باید سالها از آن نگهداری کرد. در صورتی که تست به هرعلت دچار خطا شود، روند عیب یابی بدون رابط گرافیکی برای برنامه نویس بسیار دشوار خواهد بود.

تمامی موارد بالا میتواند بکارگیری مرورگرهای headless را که توسط کاربر غیر حرفه ای استفاده نمیشود را محدود میکند.  در بسیاری از سناریو ها ما میخواهیم که تجربه واقعی استفاده از برنامه تحت وب نوشته شده را در تست شبیه سازی کنیم. نگاهی به بازار نشان میدهد که Chrome، FireFox و بیشترین سهم را دارند. در نتیجه کسانی که به دنبال شبیه سازی تجربه کاربر هستند به chromedriver یا  Firefoxdriver روی میاورند. ولی به هر صورت همیشه هم این نگاه در تست وجود ندارد.

در دنیای مرورگرها، headless های فراوانی وجود دارند که تنوع آنها بیشتر به دو نکته باز میگردد: 1) زبان برنامه نویسی مورد حمایت و 2) تکنولوژی rendering  کد HTML و تفسیر JavaScript. در اینجا دو مرورگر را به اختصار توضیح میدهم

  • درمورد HtmlUnit میشه گفت اولین مرورگر headless است. با جاوا نوشته شده و عمدتاً در کد جاوا استفاده میشود. درایور آن  یعنی HtmlUnitdriver توسط webdriver مورد استفاده قرار میگیرد. مشکل اصلی اش محدودیت آن در تفسیرکدهای جاواست.
  • فانتوم PhantomJS هم مرورگری است که با ++ C نوشته شود. تقریباً از تمامی زبانهای پرکاربرد استفاده پشتیبانی میکند و برخلاف HtmlUnit میانه خوبی هم با JavaScript دارد. درایور آن  توسط webdriver مورد استفاده قرار میگیرد. از آنجایی که بر اساس WebKit نوشته شده برای اتوماسیون Safari و پلاترمهای Apple مناسب تر است.

من شخصا از آنجایی که  تا بحال نزدیکی به تجربه کاربر نهایی سیستم و نگهداری و عیب یابی تست برایم اهمیت داشته و خوشبختانه سرعت اجرای تست در محیط کارم مشکل ساز نشده است، سعی کردم از chromedriver و IEdriver استفاده کنم ولی اگر روزی لازم شد حتماً از PhantomJS استفاده میکنم ? در این ویدئو میتوانید با نحوه استفاده از آن در Python آشنا شوید.

اتوماسیون وبphantomjshtmlunitتست نرم افزار
مهندس تست و امنیت نرم افزار https://www.linkedin.com/in/behroozaghakhanian
شاید از این پست‌ها خوشتان بیاید