אחד היתרונות הגדולים באוטומציה הוא גם אחת מהנקודות הכואבות – המהירות. כולנו מסכימים שביצוע פעולות אוטומטיות בקצב מהיר זה טוב ויפה, אז איפה יכולה להיות בעיה ?

במקרים בהם המערכת הנבדקת – System Under test איטית למשל בתעבורת הרשת (נגיד בין הקליינט לסרבר), או כשהיא מגיבה לאט, תוכל להיווצר לנו בעיה – חוסר סינכרון. זמן ריצת התוכנית שלנו לא תמיד רצה במקביל לקצב תגובות המערכת הנבדקת.

יש לנו דרכים לפתור נקודה זו למשל על ידי שימוש בפקודות ה-Wait השונים (במקרה הטוב) או ב-Sleep (במקרה הפחות טוב), אלו הם פתרונות שעובדים ומקובלים לעבודה. אך מה שאני רוצה להציע פה בפוסט זה הוא דרך עבודה שבאה להקל עלינו את החיים במקרה זה של טעינת דפים והמתנה.

 

LoadableComponent2

מחלקת – LoadableComponent באה לענות לנו על צורך זה.  מחלקה זו היא מחלקת בסיס, ממנה ניתן לרשת בתוכנית שלנו.

שימוש במחלקה זו היא דרך טובה יותר לנהל את הניווט בין הדפים השונים , בעיקר דפי נחיתה , Login וכו' כשהמטרה היא להפחית את שורות הקוד וליצור קריאות ברורה יותר בתוכנית.

נשתמש בעיקר בטכניקה זו בעבודה עם Page Objects , כך שלדוגמא , אם קיימת לנו מחלקת login , כעת נגרום למחלקה זו לרשת מ- LoadableComponent (עם שימוש ב-Generics) כך:

public class loginPage extends LoadableComponent<loginPage>

למחלקה זו קיימות שתי מתודות אבסטרקטיות , אותן נצטרך לממש על ידי – Override@ , הראשונה היא מתודת – load:

@Override
    protected void load()
    {
        driver.get("http://www.yoniflenner.net/demo");
    }

המתודה השנייה היא – isLoaded:

@Override
    protected void isLoaded() throws Error
    {
        String url = driver.getCurrentUrl();
        Assert.assertTrue("Not on the right page.", url.contains("DemoSite"));
    }

* ניתן להעמיס כמה Asserts שנרצה בשביל להגיע לתוצאה הרצויה שלנו.

אז אם אני רוצה לממש את ה-PageObjects של דף ה-Login אעשה זאת כך:

import org.junit.Assert;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.ui.LoadableComponent;
 
public class loginPage extends LoadableComponent
{
 
    private final WebDriver driver;
     
    @FindBy(name = "username")
    WebElement UserName;
     
    @FindBy(name = "password")
    WebElement Password;
     
    @FindBy(id = "submit")
    WebElement Submit;
     
    public loginPage(WebDriver driver)
    {
        this.driver = driver;         
        PageFactory.initElements(driver, this);
    }
     
    @Override
    protected void isLoaded() throws Error
    {
        String urlPage = driver.getCurrentUrl();
        Assert.assertTrue("Not on the right page.", urlPage.contains("DemoSite"));
    }
 
    @Override
    protected void load()
    {
        driver.get("http://yoniflenner.net/demo");
    }
     
    public void loginAction(String user , String pass)
    {
        UserName.sendKeys(user);
        Password.sendKeys(pass);
        Submit.click();
    }         
}

 

וכך יראה ה-Test Case שלי:

@Test
    public void testLoginPage()
    {
        WebDriver driver = new FireFoxDriver();
        loginPage login = new loginPage(driver);
        login.get();
        login.loginAction("selenium", "webdriver");
    }

 

כפי שניתן לראות , הפונקציה get אינה מקבלת שום ערך מהתוכנית הראשית, את פונקציה זו מימשתי הרי באחת מהמתודות של ה-LoadableComponent , באותה הזדמנות מופעלת מאחורי הקלעים גם הפונקציה השנייה שמימשתי – isLoaded ובודקת שבאמת הדף נטען כמו שצריך (דרך ה-Assert שנכתב לו). שוב, הכל קורה באופן אוטומטי מבלי שאצטרך לדאוג , וזה נכון לכל דף שאקרא לו על ידי הפונקציה get.

ניתן כמובן לשפצר את התוכנית שלנו ולהכניס את ה-login אל תוך פונקציית ה-loaded שלנו (לא תמיד נרצה לעשות זאת, זה תלוי במערכת הנבדקת ובאיך אנחנו מתכוונים לבדוק) , כך:

public class loginPage extends LoadableComponent
{
 
    private final WebDriver driver;
    private String username;
    private String password;
     
    public LoginPage(WebDriver driver, LoadableComponent<?>, String username, String password)
    {
        this.driver = driver;
        this.username = username;
        this.password = password;
         
        PageFactory.initElements(driver, this);
    }

@Override
    protected void load()
    {
        driver.get("http://www.yoniflenner.net/demo");
        driver.findElement(By.name("username")).sendKeys(username);
        driver.findElement(By.name("password")).sendKeys(password);
        driver.findElement(By.id("submit")).click();
    }

 

 

השאר הערה\הודעה