את הפוסט הנוכחי החלטתי לכתוב מכיוון שכבר כמה תלמידים שלי נתקלו בבאותה שאלה שנשאלת בראיונות עבודה , זוהי השאלה המעידה על הבנה ב- Page Objects Pattern והיא הולכת כך:

מהו ההבדל בין אנוטציית ה-FindAll לבין אנוטציית ה-FindBys ב-Page Objects  ?

 

קורסים דיגיטליים - עתיד האוטומציה
קורסי הדיגיטלי של עתיד האוטומציה

 

אז כל מי שאי פעם התעסק עם Page Objects באוטומציה, לבטח יכיר את אנוטציית ה-FindBy הפופולרית עימה אנו נזהה אלמנטים על ה-DOM, כפי שמוצג בדוגמא הנ"ל:

@FindBy(how = How.ID, using = "123")
private WebElement testElement

או בצורת הכתיבה המקוצרת:

@FindBy(id = "123")
private WebElement testElement

שזה אומר, תמצא לי אלמנט בדף עם id שבו הערך: 123

האנוטציות FindAll ו-FindBys הן הרבה פחות פופולריות מהקודמת ועליהן ארחיב כעת.

אז קודם כל בואו נציץ בדוקומנטציה הרישמית של Selenium WebDriver, תחילה על FindAll:

וכעת על FindBys:

 

אנו רואים כי שתי האנוטציות הללו ממומשות תחת ספריית:  org.openqa.selenium.support אך ישנם הבדלים.

 

אנוטציית ה-FindBys היא למעשה Container של אנוטציות, שזה אומר שבתוכה נוכל לכתוב כמה אנוטציות (אחת או יותר) של FindBy, כאשר בתוך כל FindBy נגדיר קריטריון חיפוש כלשהו, ה-FindBys תחזיר רשימה של האלמנטים שעונים על כל הקריטריונים ב-FindBy, בואו נציג את המשפט הקצת מבלבל הזה על ידי דוגמא, זהו ה-HTML ממנו נרצה למצוא אלמנטים:

 

כעת נשתמש באנוטציית ה-FindBys :

@FindBys({
        @FindBy(css = "li[key='android']"),
        @FindBy(css = "li[key='ios']")
})
private WebElement exampleFindBys;

 

אנו רואים כאן זיהוי של אלמנטים עם key=android ועם-key=ios, במקרה הזה הרשימה שלנו תהיה ריקה, למה ? כי אין לנו ב- HTML DOM אלמנטים שעונים על קריטריון החיפוש: "תמצא לי אלמנטים שיש להם גם key=android וגם key=ios"

 

בואו נשתמש כעת באנוטציית ה-FindAll:

@FindAll({
        @FindBy(css = "li[key='android']"),
        @FindBy(css = "li[key='ios']")
})
private WebElement exampleFindAll;

 

במקרה זה, הרשימה שלנו תכיל איבר מסויים ספציפי, קירטריון החיפוש הינו: "תמצא לי אלמנט עם key=ios שקיים בתוך אלמנט עם key=android"

במילים אחרות ניתן להגיד שה-FindBys עובד עם אופרטור ה-AND ואילו ה-FindAll עובד עם Inside

 

נוספה תגובה 1

  1. נראה לי נכון יותר להגדיר ש@FindBys הוא אלמנט שעונה על מגוון תנאים (ז"א אם ישנם כמה אלמנטים דומים בDOM ורוצים לבחור את הספציפי) , ולעומתו @FindAll הוא בדומה לשימוש הרגיל בFindAll כל האלמנטים העונים על אחד מהתנאים המופיעים .

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