בפוסט זה אנו נסקור מעטפת מעניינת שכתבו מעל ספריות הסלניום, גבירותיי ורבותיי, הכירו את ה-Coypu.
את ה-Coypu בטבע ניתן לראות באגמון החולה שבצפון הארץ למשל, בשפה העברית אנו קוראים לה נוטריה והשם בא כאיזה ספין אוף לפריימוורק אחר – Capybara (בשפת הרובי) שה-Coypu נכתב בהשראתו, רק לשפת #C
ה-Coypu (מבטאים זאת: קוואי-פו) הוא למעשה Wrapper שנכתב כקוד פתוח והוא יושב מעל ספריות הסלניום הגנריות (ב-#C) ונותן לנו ממשק API נוח יותר לעבודה, המעטפת הזו עובדת בסגנון ה-DSL (קיצור של Domain Specific Language) , שזוהי למעשה צורת כתיבה יותר אנושית, כך שאנשים פחות טכניים, פחות מביני שפות תכנות – יוכלו להתחבר אליה בקלות.
מעבר לכך, מי שימצא את המעטפת הזו יעילה אלו מפתחי אוטומציה על ה-Web שכותבים ב-NET. ומשתמשים ב-Sleeps , Retries וביטויי XPATH ו-CSS ארוכים ומורכבים.
בואו נכיר את ה-API של Coypu
תחילה נראה דוגמאות להבדלים בין הסינקטס של סלניום ולבין זה של Coypu:
כפי שאתם שמים לב בטבלה, העבודה עם Coypu מתבצעת בשפה יותר אנושית, יותר ברורה.
ישנם מקרים בהם פעולת ה-Click בסלניום היא זו שאמורה להפוך את הכפתור מ-Check ל-Uncheck , רגע, ואם אנחנו רוצים ללחוץ עליו רק במידה והוא Check ? את המקרה הזה אנו נצטרך לממש בסלניום, ואילו ב-Coypu כבר מימשו לנו ויצר 2 פעולות: Check ו-Uncheck. נוח, ברור, קליל.
אז מה יש ל-Coypu API להציע ? הנה כמה דוגמאות:
browser.ClickButton("MyButton"); // Click on a Button browser.ClickLink("MyLink"); // Click on a Link browser.Select("OptionA").From("Menu"); // selects from DropDown list browser.FillIn("textField").With("Hello World"); // Updates a Text Field browser.FillIn("Photo").With(@"c:\photos\yoni.jpg") // Upload External File browser.Choose("Gender"); // Choose from Radio Button browser.Check("AutomationDeveloper"); // Check Box browser.Uncheck("AutomationDeveloper"); // UnCheck Box browser.FindCss("input[type=checkbox].AutomationDeveloper"); // Find Element with CSS browser.ClickButton("Close", new Options{Match = Match.First}); // Click on the First Close button it finds browser.FindWindow("Pop Up Window"); // Switch to PopUp Window browser.FindXPath("//ul[@class = 'menu']/li").Exists(); // Returns true (if found) or false (if not found) browser.FindField("amount").HasValue("100"); // Returns true (if 100 value is in amount field) or false (if 100 value is NOT in amount field) browser.FindCss("table#myData").OuterHTML; // Returns the Outer HTML browser.FindCss("table#myData").InnerHTML; // Returns the Inner HTML browser.HasDialog("Are you sure ?"); // Returns true (if Dialog Box appear) or false (if Dialog Box Does not appear) browser.AcceptDialog(); // Click on OK button on Dialog Box browser.CancelDialog(); // Click on Cancel button on Dialog Box browser.SaveScreenshot(@"c:\screenshots\image_01.jpg"); // Take Screen Shot browser.FindWindow("Popup Window").SaveScreenshot(@"c:\screenshots\image_02.jpg"); // Take Screen Shot on new Window browser.ClickButton("Search", new Options { WaitBeforeClick = TimeSpan.FromMilliseconds(0.5) } ) // Setting Wait Timeout
אז איך מתחילים לעבוד עם Coypu ?
תחילה ניצור פרוייקט חדש ב-Visual Studio , נפתח את ה-Nuget Package Manager ונתקין 2 חבילות:
- Coypu
- Coypu.NUnit
כעת נתחיל לכתוב את המחלקה שלנו, אז קודם כל, נגדיר את האיתחול של הדפדפן וזה ע"י יצירת אובייקט מ- SessionConfiguration:
var sessionConfiguration = new SessionConfiguration() { Browser = Browser.Chrome, AppHost = "ebay.com" };
* מקרה הבדיקה שלנו להפעם הוא להיכנס לאתר של ebay עם דפדפן הכרום , להיכנס לעמוד הדילים , לחפש את הערך: "Samsung Galaxy" ולוודא כי קיים שם ה-Note 9
נגדיר כעת אובייקט חדש בשם browser אותו נאתחל ל-sessionConfiguration:
var browser = new BrowserSession(sessionConfiguration);
כעת אובייקט ה-browser יכיל בתוכו מגוון רחב של מאפיינים ופעולות אשר מומשו לנו בתוך ה-Coypu (בדיוק באותו האופן שמימשו לנו את ה-driver מסוג ה-IWebDriver בסלניום הטהור):
זוהי דוגמא לתוכנית קטנה ב-Coypu שמבצעת את הבדיקה הנ"ל:
namespace coypuProj { [TestFixture] public class UnitTest1 { [Test] public void TestMethod1() { var sessionConfiguration = new SessionConfiguration() { Browser = Browser.Chrome, AppHost = "ebay.com" }; var browser = new BrowserSession(sessionConfiguration); browser.Visit("/globaldeals"); browser.FillIn("gh-ac").With("Samsung Galaxy"); browser.ClickButton("gh-btn"); var elem = browser.FindLink("Galaxy"); Assert.That(elem, Shows.Content("Samsung Galaxy Note 9")); browser.Dispose(); } } }
שימו לב כי בתוכנית שלנו אנחנו עדיין עובדים אם אוסף החוקים של NUnit , שזה אומר עבודה נכונה של ה-Test עם ה-Fixtures הנוספים בהם נאתחל את אובייקט ה-browser ונסגור אותו, זה אמנם לא מופיע בדוגמא הנ"ל, אבל בפירוש יש להתנהג במקרה כזה בדיוק באותו האופן שהיינו כותבים עם סלניום ו-Nunit.