سوییچ کردن میان Pop-up Windowها
بر خلاف Selenium IDE، ابزار WebDriver اجازه میدهد پنجرههای پاپ آپ مانند هشدارها(Alert) نمایش داده شوند. برای دسترسی به عناصر درون هشدار(مانند پیام حاوی آن)، ما باید از متد “()switchTo().alert” استفاده کنیم. در کد زیر ما از این متد برای دسترسی به جعبه هشدار(Alert Box) استفاده کردهایم و سپس پیام خود را با استفاده از متد “()getText” بازیابی مینماییم. پس از آن جعبه هشدار را با استفاده از “()switchTo().alert().accept” به صورت اتوماتیک میبندیم.
ابتدا به اینجا بروید و به صورت دستی روی دکمه “!Go” کلیک کرده و متن پیام خود را مشاهده کنید.
اجازه دهید WebDriver Code مربوطه را برای انجام این کار ببینیم:
package mypackage; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; public class myclass { public static void main(String[] args) { System.setProperty("webdriver.firefox.marionette","C:\\geckodriver.exe"); WebDriver driver = new FirefoxDriver(); String alertMessage = ""; driver.get("http://jsbin.com/usidix/1"); driver.findElement(By.cssSelector("input[value=\"Go!\"]")).click(); alertMessage = driver.switchTo().alert().getText(); driver.switchTo().alert().accept(); System.out.println(alertMessage); driver.quit(); } }
در کنسول Eclipse، به پیام هشدار چاپ شده دقت کنید:
Waitها
در اینجا دو نوع Wait وجود دارد.
- Wait ضمنی(Implicit): برای تنظیم زمان انتظار(Wait) پیشفرض در طول برنامه استفاده میشود.
- Wait صریح(Explicit): صرفا برای تنظیم زمان انتظار(Wait) برای یک نمونه خاص استفاده میشود.
Wait ضمنی
- برای کد کردن(کدنویسی) به نسبت Explicit Wait سادهتر است
- معمولا در قمست instantiation مربوط به کد، اعلام میشود
- فقط به Import کردن یک Package اضافی نیاز دارید
برای آغاز استفاده از Wait ضمنی، باید این Package را به کد خود Import کنید.
سپس در بخش Instantiation از کد خود، این را Add کنید:
Wait صریح
Waitهای صریح با استفاده از کلاسهای WebDriverWait و ExpectedCondition انجام میشوند. برای مثال زیر، ما باید برای عنصری که id آن “username” است به مدت ۱۰ ثانیه صبر کنیم تا قبل از ادامه حرکت به سمت فرمان بعدی، قابل مشاهده شود. در اینجا سه مرحله وجود دارد.
مرحله ۱
این دو Package را Import نمایید:
مرحله ۲
یک متغیر WebDriverWait اعلام نمایید. در این مثال، ما از “myWaitVar” به عنوان نام متغیر استفاده خواهیم کرد.
مرحله ۳
روی قسمتهایی که نیاز به Wait صریح دارید، از MyWaitVar با ExpectedConditions استفاده کنید. در این مورد، ما از Wait صریح روی ورودی “username” استفاده کردیم.
Conditionها
متدهای زیر در عملیاتهای مشروط(Conditional) و حلقوی(Looping) استفاده میشوند:
- ()isEnable زمانی استفاده میشود که شما میخواهید قبل از اجرای یک Command(دستور)، Verify کنید که آیا یک عنصر معین فعال است یا خیر.
- ()isDisplayed زمانی استفاده میشود که شما میخواهید قبل از اجرای یک Command(دستور)، Verify کنید که آیا یک عنصر معین نمایش داده شده است یا خیر.
- ()isSelected زمانی استفاده میشود که شما میخواهید Verify کنید که آیا یک چکباکس معین، رادیوباتن معین، یا آپشن موجود در یک دراپباکس انتخاب شده است یا خیر. این روی دیگر عناصر کار نمیکند.
استفاده از Expected Conditionها
کلاس ExpectedConditionها مجموعهای گستردهتر از Conditionها را فراهم میکند که میتوانید از آن در ترکیب با متد ()until در WebDriverWait استفاده نمایید.
در زیر برخی از رایجترین متدهای ExpectedConditions ارائه شدهاند.
- ()alertIsPresent: تا زمانیکه یک Alert Box نمایش داده شود منتظر میماند
- ()elementToBeClickable: تا زمانیکه یک عنصر مشاهدهپذیر، در همان زمان فعال شود، منتظر میماند. نمونه کد زیر، قبل از Assign کردن عنصری با “id=”username به عنوان متغیر WebElement با نام و مقدار “txtUserName”، تا زمانیکه عنصر مذبور مشاهدهپذیر شده و فعال شود صبر میکند.
- ()frameToBeAvailableAndSwitchToIt: تا زمانیکه Frame ارائه شده در دسترس باشد، منتظر مانده و سپس به طور خودکار به آن سوییچ میکند.
Catch کردن Exceptionها
هنگام استفاده از ()isEnabled()، isDisplayed و ()isSelected، ابزار WebDriver فرض را بر این میگیرد که عنصر از قبل در صفحه وجود دارد. در غیر این صورت، یک NoSuchElementException را Throw میکند. برای اجتناب از این موضوع، ما باید از یک بلوک Try-Catch استفاده کنیم تا برنامه دچار وقفه(Interrupt) نشود.
WebElement txtbox_username = driver.findElement(By.id("username")); try{ if(txtbox_username.isEnabled()){ txtbox_username.sendKeys("tutorial"); } } catch(NoSuchElementException nsee){ System.out.println(nsee.toString()); }
اگر از Explicit Wait استفاده کنید، نوع Exceptionای که باید Catch کنید، “TimeoutException” است.
خلاصه
- برای شروع استفاده از WebDriver API، باید حداقل این دو Package را Import کنید.
- *.org.openqa.selenium
- org.openqa.selenium.firefox.FirefoxDriver
- متد ()get با دستور “open” در Selenium IDE هم ارز است.
- موقعیتیابی عناصر در WebDriver بوسیله استفاده از متد ()findElement انجام میشود.
- موارد ذیل گزینههای موجود برای موقعیتیابی عناصر در WebDriver هستند:
- By.className
- By.cssSelector
- By.id
- By.linkText
- By.name
- By.partialLinkText
- By.tagName
- By.xpath
- ()By.cssSelector امکان “contains” را پشتیبانی نمیکند.
- شما میتوانید یک عنصر را بوسیله WebElement class ایجاد نمایید.
- کلیک روی یک عنصر با استفاده از متد ()click انجام میشود.
- WebDriver دستورات مفید get را فراهم کرده است، که در زیر لیستی از آنها را میبینیم:
- ()get
- ()getTitle
- ()getPageSource
- ()getCurrentUrl
- ()getText
- WebDriver دستورات مفید navigation را فراهم کرده است، که در زیر لیستی از آنها را میبینیم:
- ()navigate().forward
- ()navigate().back
- ()navigate().to
- ()navigate().refresh
- متدهای ()close و ()quit برای بستن پنجرههای مرورگر استفاده میشوند. ()close برای بستن یک پنجره منفرد استفاده میشود؛ در حالیکه ()quit برای بستن تمام پنجرههای مرتبط با پنجره والدی که WebDriver Object کنترل میکند به کار میآید.
- متدهای ()switchTo().frame و ()switchTo().alert برای هدایت تمرکز WebDriver به ترتیب بر یک Frame یا Alert استفاده میشوند.
- Waitهای ضمنی یا Implicit Waitها برای تنظیم زمان انتظار در طول برنامه استفاده میشوند، در حالی که Waitهای صریح یا Explicit Waitها فقط در بخشهای خاص به کار گرفته میشوند.
- شما میتوانید در هنگام Verify کردن وضعیت یک عنصر از ()isEnabled()، isDisplayed()،isSelected و ترکیبی از متدهای WebDriverWait و ExpectedConditions استفاده نمایید. با این حال، آنها عنصر موجود را Verify نمیکنند.
- زمانیکه ()isEnabled()، isDisplayed یا ()isSelected فراخوانی میشوند اگر عنصر موجود نباشد، WebDriver یک NoSuchElementException را Throw میکند.
- زمانیکه متدهای WebDriverWait و ExpectedConditions فراخوانی میشوند اگر عنصر موجود نباشد، WebDriver یک TimeoutException را Throw خواهد کرد.
نکته
- ()driver.get: این متد برای رفتن به وبسایتی خاص استفاده میشود، اما سابقه مرورگر و کوکیها را نگه نمیدارد، بنابراین ما نمیتوانیم از دکمه Forward و Backward استفاده کنیم، و اگر بر روی آن کلیک کنید، صفحه بارگذاری نمیشود.
- ()driver.navigate: این متد برای رفتن به به وبسایتی خاص استفاده میشود، اما تاریخچه مرورگر و کوکیها را نگه نمیدارد، بنابراین ما میتوانیم در خلال کد کردن Test Caseها، از دکمه Forward و Backward برای حرکت بین صفحات استفاده کنیم.
متن
این یک آموزش طولانی مدت است. بنابراین قسمتهای بعدی به محض آماده شدن علاوه بر اینکه در صفحه Home وبسایت اطلاعرسانی خواهد شد، به صورت دستهبندی شده از اینجا نیز در دسترس است.