img

استفاده از Selenium در زمان‌های انتظار در نرم‌افزارهای تحت وب…

/
/
/

زمانی که برای مهیا شدنِ یک صفحه‌ی وب صرف می شود، در تجربه‌ی کاربران هنگامِ استفاه از آن وب سایت تاثیر مهمی می گذارد .

اغلب یک صفحه‌ی وب از المان‎های بسیاری تشکیل شده، که برای بارگذاری شدن نیاز به زمان دارند، که این زمان گاهی بیش از حد طولانی می شود، تا جایی که حوصله‌ی بازدید کننده را سر برده، آنها را ترغیب می کند تا به وب سایت‌های دیگر بروند، که ثمره‌ی این پیش آمد، از دست رفتنِ فرصت‌های ارزشمندی برای صاحبان وب‌سایت مذبور می باشد.
تمرکزِ مقاله‌ی پیشِ رو، مرتفع کردنِ چنین تاخیر‌هایی در نرم‌افزارهای تحت وب، با استفاده از selenium می باشد، تا نتیجه‌ای دقیق حاصل گردد.
اکثر نرم‌افزارهای تحت وبی که در اختیار ما هستند، به وسیله‌ی Ajax و JavaScript توسعه یافته‌اند. در این موارد، هنگامی که صفحه، توسطِ مرورگر بارگذارده می شود، المان‌های سازنده‌ی صفحه برای به نمایش درآمدن زمانی را صرف می کنند، که میزانِ این زمان در هر نوبت بارگذاری می تواند مقداری متفاوت باشد.
این موضوع باعثِ پدید آمدنِ استثنائاتی می گردد، که سبب می شود نرم‌افزار تحت وب، حتی زمانی هم که بدرستی کار می کند، نتایج غلطی را برگرداند.

 

رسیدگی به تاخیرها همراه با دقت
زمانی که تاخیری در نمایان گشتنِ المانی بصری-کاربردی مشاهده می شود، مثلا فرض کنید از Thread.sleep() برای رفع کردنِ آن استفاده کنیم. دفعه‎‌ی بعدی که ما آزمایشِ خود را تکرار کنیم، المانِ مذبور، بی درنگ نمایان خواهد گشت. اما تکلیفِ Thread.sleep() که در کد خود جای دادیم چیست؟ این کد سبب ایجاد مانع در اجرای برنامه شده، بنابراین انتظار مضاعفی را با وجود غیرضروری بودن سبب می گردد. و مخلص کلام اینکه، زمان اجرای کلیه‌ی مراحل آزمایشِ ما بدون تغییر باقی خواهد ماند، و از آن کاسته نخواهد شد.
البته نتایج به دست آمده صحیح و قابل اتکا هستند، اما در شرایط واقعی، وقتی یک دقیقه زمان به طول انجامیده در آزمایش مداخله‌ی دستی را با زمان سه دقیقه‌ای اسکریپت اتوماتیک شده‌‌ی خودمان مقایسه کنیم، استفاده از sleep اصلا معقول به نظر نمی‌رسد.
پس برای بهبود بخشیدن به عمل خودکار سازی، به علاوه‌ی هماهنگ کردنِ ابزار آزمایشمان با نرم‌افزار تحت آزمون برای حلِ معضلِ این تاخیرها به شکلی پویا، ما از انتظارها(waits)، که امکانی مهیا شده توسطِ Selenium هستند، استفاده می کنیم.

 

انواعِ انتظارها
* Implicit wait: زمانی که یکی از المان‌هایِ سازنده‌‌ی صفحه، به صورت فوری در دسترس نباشد، Implicit wait به WebDriver فرمان می دهد تا برای DOM تا زمانی که اعلام آمادگی نماید، تا مدت معینی صبر کند(poll)، تا المانِ مذبور پیدا شود. تنظیم پیش فرض نیز ۰ می باشد. Implicit wait به اندازه‌ی عمرِ نمونه‌ای از WebDriver به طول می انجامد.

 

تعریف:

driver.manage().timeouts().implicitlyWait(10, TimeUnit, SECONDS);

زمانِ استفاده: چندان توصیه نمی‌شود، اما باز از Thread.sleep() بهتر است.

* +PageLoadTimeout wait : این نوع انتظار بر روی زمانی که صفحه‌ی وب برای بارگذاری بدان محتاج است تمرکز دارد. این انتظار زمانِ اختصاص یافته به صفحه توسطِ اسکریپت را محدود می کند. ناگفته نماند، بعد از اتمام این زمان، اسکریپت به انجام سایر عملیاتِ حاضر در صفحه می پردازد. اگر چنانچه صفحه در بازه‌ی تعریف شده بارگذاری نشود، اسکریپت توسطِ TimeoutEception متوقف خواهد شد.

تعریف:

driver.manage().timeouts().pageLoadTimeout(50, TimeUnit.SECONDS);

مواردِ استفاده: هر وقت که می خواهید از بارگذاریِ صفحه‌ در بازه‌ی زمانیِ مناسبی اطمیان داشته باشید، و سپس باقیِ عملیات بر روی المان‌های وب صورت پذیرد، از این نوع انتظار استفاده کنید.

* SetScriptTimeout: این نوع انتظار، تنها برای JavascriptExecutor کاربردی است، که فراهم آورنده‌ی دو متود برای اجرای اسکریپت می باشد، یعنی executeScript و executeAsyncScript. متودِ executeScript اجرای خط بعدی از کد را تا زمان اجرای خودش مسدود کرده، و سپس به سوی خط بعد از کد حرکت می نماید. متود executeAsyncScript اجرای خط بعدی از کد را مانند متود قبلی مسدود نمی‌کند، به همین دلیل ما از

timeouts().setScriptTimeout(5,SECONDS)

جهتِ اختصاصِ زمان به یک اسکرپیت ناهمگام(asynchronous) برای اتمام عملیات قبل از بروز دادن یک خطا استفاده می کنیم.

تعریف:

driver.manage().timeouts().setScriptTimeout(5, TimeUnit.SECONDS);

مواردِ استفاده: تخصیصِ زمانی محدود به یک اسکریپتِ ناهمگام برای تمام کردنِ اجرا، و در غیرِ این صورت اسکریپت هر چقدر که بخواهد برای تمام کردن اجرا زمان صرف کرده، و ممکن است خطا یا باگی ناشناخته باقی بماند.
* FluentWait: هر نمونه از FluentWait، حداکثر زمان انتظار برای یک موقعیت، و تناوب چک شدنِ آن را تعیین می کند. کاربر می تواند انتظار را به گونه‌ای تنظیم کند، که بروزِ برخی از انواعِ استثناء‌ها، در زمان انتظار نادیده گرفته شوند. مثلا نادیده گرفتنِ NoSuchElementException،هنگام جست‌وجو برای یافتن یک المان در صفحه، که در صورتِ فقدان آن المان بروز خواهد کرد. و اینگونه اجرای اسکریپت ادامه خواهد یافت.

 

تعریف:

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, TimeUnit.SECONDS).pollingEvery(5,
TimeUnit.SECONDS).ignoring(NoSuchElementException.class);
WebElement clickseleniumlink = wait.until(new Function<WebDriv
er, WebElement>() {public WebElement
apply(WebDriver driver) {
return driver.fndElement(By.xpath(“//*[@id=’loginbutton’]”));
}
});

مواردِ استفاده: زمانی که المانِ مورد نظر در هر بار انجام تست، زمانِ متفاوتی را صرف کند.
* Explicit wait: این انتظار به کاربر اجازه می دهد تا درایور را به منظور انتظار برای موقعیت هایی خاص جهت دهی کند، قبل از آنکه پیشروی در ادامه‌ی خط‌های کد صورت پذیرد. WebDriverWait به صورت پیش فرض هر ۵۰۰ هزارم ثانیه ExpectedCondition را فرا می خواند، تا بالاخره این متود با موفقیت بازگردانی شود.

 

تعریف:

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.elementToBeClickable(By.
xpath(“//*[@id=’login- button’]”))).click();

مواردِ استفاده: هنگامی که المانی زمان زیادی را برای بارگذاری صرف می کند، و همچنین وقتی که مشخه‌ی یک المان بایستی مورد بررسی قرار گیرد.(به عنوان مثال کلیک پذیریِ المان)

 

بهره‌گیری از انتظارها در شرایطِ واقعی
با بکارگیریِ ترکیبی از pageLoadTimeout + SetScriptTimeout و ExplicitWait در چارچوب(framework) خود، از مهیا شدن صفحه در زمان مناسب، و از اجرای اسکریپت‌های ناهمگام در مدتِ تعیین شده اطمینان حاصل کنید. ExplicitWait به بررسیِ مشخصه‌های گوناگونی از المان‌های متفاوت، بر مبنای عملیاتی که باید انجام شوند، کمک می کند. اگر هر اشتباهی صورت پذیرد، ریشه‌یابیِ آن ساده خواهد بود. با استفاده از این ترکیب از انتظارها در چارچوبِ خود، از بدست آمدن نتایجی دقیق، در مدت زمانی بهینه، اطمینان حاصل کنید.

نظر بدهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *