מדריך | אוטומציה באמצעות Selenium | חלק 1 - מבוא

לאחר שהבנו את יתרונות פיתוח האוטומציה ופיתחנו בדיקת אוטומציה ראשונה באמצעות NUnit הגיע הזמן שנגיע לתכלס..

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

מה זה Selenium?

סלניום היא תשתית האוטומציה לדפדפנים הגדולה בעולם כיום.

עולם הWeb מצעיד את עולם פיתוח התוכנה (יחד עם עולם המובייל), וכך גם עולם בדיקות ה Web.


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

תשתית Selenium, מגיעה על מנת לתת פתרון פשוט, נוח, וקל לתפעול לשליטה על דפדפנים (סביבת העבודה של עולם הWeb).

באמצעות השליטה הנ"ל, ניתן יהיו לבצע תרחישי בדיקה אוטומטיים אשר יבטיחו את איכות המוצר אותו אנו בודקים.

איך כותבים אוטומציה באמצעות Selenium?

במדריך אציג בדיקה אוטומטית פשוטה בשפת C#, כמובן על בסיס תשתית הבדיקה NUnit.

*המלצה - קריאת הפוסט הזה, תקל עליך מאוד.

הקמת סט-אפ הבדיקה

תחילה נפתח Visual Studio וניצור פרויקט חדש מסוג Class Library (לחיצה על ctrl+shift+N תעשה את העבודה).



כעת נתקין את ה-NuGetים הנדרשים על מנת לעבוד עם Selenium ו NUnit.






לאחר שהתקנו את כל החבילות הנדרשות, נעתיק את הקוד הבא לפרויקט שלנו. (ההסבר יבוא מיד כמובן)





הסבר על הקוד:

using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
using System;
שימוש בספריות הנחוצות לצורך הרצת התכנית

namespace FirstSelenium
{
    [TestFixture]
הגדרת המחלקה כמחלקה המכילה פעולות בדיקה (ניתן לקרוא עוד כאן)
    public class FirstSelenium
    {
        private IWebDriver driver;
הגדרת אובייקט הדרייבר - יציין עבורנו את הדפדפן ודרכו נשלוט עליו
        private WebDriverWait wait;
הגדרת אובייקט Wait אשר דרכו נוכל לוודא שכאשר אנחנו מבצעים פעולה, אנחנו לא ממשיכים כל עוד לא קיבלנו את הפלט הרצוי.
        [OneTimeSetUp]
הגדרת הפעולה כפעולת הInit שתרוץ על פעם שתטען המחלקה.
בפעולה זו נבצע קונפיגורציה אשר נכונה לכל פעולות הבדיקה שירוצו מהמחלקה.
        public void LoadDriver()
        {
            ChromeOptions options = new ChromeOptions();

            options.AddArgument("--start-maximized");
            options.AddExcludedArgument("ignore-certificate-errors");
הגדרת הקונפיגורציה של הדפדפן

            driver = new ChromeDriver();
אתחול ChromeDriver חדש ב driver
            wait = new WebDriverWait(driver, new TimeSpan(0, 0, 30));
אתחול אובייקט הwait כך שיחכה לפעולה עד 30 שניות

            
            Console.WriteLine("SetUp Finished Successfully");
הדפסה לLog שהבדיקה הסתיימה
        }

        [OneTimeTearDown]
הגדרת הפעולה כפעולת הCleanup שתרוץ על פעם שתנוקה המחלקה.
בפעולה זו נגדיר קונפיגורציה אשר תחול על כל פעולות הבדיקה שירוצו במחלקה.
        public void UnloadDriver()
        {
            driver.Quit();
סגירת הדפדפן
            Console.WriteLine("TearDown Finished Successfully");
כתיבה לLog
        }

        [TestCase]
הגדרת הפעולה כפעולת בדיקה
        public void LaunchAutomatziaComViaGoogle()
        {
            //Launch google
            driver.Navigate().GoToUrl("http://www.google.com");
פתיחת הדפדפן שלנו וגלישה לגוגל

            //wait until google is up
            wait.Until(d => d.FindElement(By.Id("gsr")));
האזור הזה מעט טריקי - כעת נעצור את התכנית ונחכה עד אשר האלמנט עם מזהה בשם "gsr" יעלה.
אבל איך הגענו דווקא ל-gsr?

מבחינתנו כל אלמנט בדף שיטען פחות או יותר יהווה עבורנו אינדיקציה שגוגל אכן עלה.
ניקח לצורך הדוגמה את ה id של אלמנט <body>

כל מה שנשאר לעשות זה לבצע בדיקה על אחד הרכיבים בממשק המשתמש של גוגל באופן הבא:

ניכנס לאתר גוגל ונלחץ על המקש הימני בעכבר, ואז על inspect/בדוק

לאחר לחיצה על "בדוק" יפתח לנו מסך אשר יכיל את כל האלמנטים בדף ה HTML

נלחץ על ctrl+F בכדי לחפש בין האלמנטים ונכתוב בשורת החיפוש body (המחרוזת body יכולה להופיע יותר מפעם אחת בקוד המקור - שים לב שבחרת בתגית body)
ושם נוכל לראות את הid של האלמנט לו אנחנו רוצים לחכות "gsr"

            //find the search bar and enter the text
            IWebElement searchBarElement = driver.FindElement(By.Id("lst-ib"));
ניצור אובייקט מסוג WebElement אשר יתן לנו ממשק עבודה אל מול האלמנט הנדרש (שורת החיפוש)

את הid של שורת החיפוש נמצא על ידי לחיצת מקש ימני על על שורת החיפוש ולחיצה אל inspect/בדוק.
ממש כמו בדוגמה הקודמת.

            searchBarElement.SendKeys("המקום לפיתוח תוכנה ואוטומציה");
נכניס לשורת החיפוש את הטקסט אותו אנו מעוניינים לחפש
            searchBarElement.SendKeys(Keys.Enter);
נשלח Enter על מנת להתחיל את החיפוש
            //wait until searching will end
            wait.Until(d => d.FindElement(By.Id("gsr")));
נחכה בכדי לראות שהחיפוש הסתיים

            //Find result by LinkText and click
            IWebElement ResultElement = driver.FindElement(By.LinkText("המקום לפיתוח תוכנה ואוטומציה - המקום לפיתוח אוטומציה"));
            ResultElement.Click();
נבצע לחיצה על הקישור אליו אנו רוצים להיכנס

            string expectedPageTitle = "המקום לפיתוח תוכנה ואוטומציה";
            string actualPageTitle = driver.Title;
אתחול שתי מחרוזות עליהן תתבצע הבדיקה - אחת מכילה את התוצאה הרצויה של כותרת הדף והשנייה את הכותרת בפועל.

            //validate got to the right page
            Assert.AreEqual(expectedPageTitle, actualPageTitle, "Title results are not equal");
בדיקה שהתוצאות אכן שוות, זריקת Exception עם הודעה מתאימה במידה ואינן שוות
        }
    }
}

כל מה שנשאר לעשות עכשיו זה רק להריץ

1. נקמפל את הקוד (ctrl+shift+B) על מנת שNunit יכיר את תרחישי הבדיקה שלנו
2. נפתח את Test Explorer באופן הבא
3. נריץ את תרחיש הבדיקה

ויש לנו בדיקת Web אוטומטית!

סיכום

היום עשינו היכרות עם תשתית האוטומציה המדהימה - Selenium,
למדנו איך להרים תרחיש אוטומטי עבור אפליקציית Web מאפס, והבנו כמה גמישה וקלה לתפעול התשתית.

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

בינתיים, פתחו לכם פרויקט C# קטן, ובצעו בדיקה אוטומטית דומה לאתר שתבחרו - הדרך הטובה ביותר ללמוד היא לעשות!

נתראה בקרוב :)

תגובות

  1. Excellent! By the way, you forgot to add the code block. it would be easier to copy and paste to the class

    השבמחק
  2. זה המקום שמסביר הכי טוב וברור על אוטומציה!
    תודה!

    השבמחק
  3. For VS2022: Assert.AreEqual --> ClassicAssert.AreEqual

    השבמחק

הוסף רשומת תגובה

פוסטים פופולריים מהבלוג הזה

קודמתי לדרגת סיניור במיקרוסופט - מה למדתי בדרך

מהם קבצי DLL ואיך להשתמש בהם?

מדריך C# | שימוש ב LINQ