ה-Grid הוא חלק מסוויטת המוצרים של Selenium שכוללת בין היתר גם את ה-WebDriver ,ה-IDE וה-Appium הוא בא לתת פתרון להרצות מקבילות וכיסויים נרחבים יותר על סביבות שונות, מבחינה הירארכית ניתן להסתכל על ה-Grid כשכבה מעל ה-WebDriver.
עם ה-Grid נוכל בלחיצת כפתור להריץ את אותם סטים של בדיקות בו זמנית על מערכות שנות כמו למשל Chrome/Win 7 , IE/Win XP , Safari/iOS , Firefox/Linux , Chrome/Android ועוד ועוד ועוד …
כך השימושים העיקריים של ה-Grid נעשים בעיקר בכיסוי רחב יותר של סביבות, חיסכון בזמן הכללי של הריצה וכן בדיקות עומסים.
הארכיטקטורה מבוססת על שרת לקוח או בשפה המקומית: Hub – Nodes, כך שהפעלת הטסטים יתבצעו על ה-Hub והרצתם בפועל תתבצע על כל ה-Nodes שהוגדרו במערכת, למשל Node 1 יותקן על סביבת לינוקס עם דפדפן FireFox , Node 2 יותקן על סביבת iOS עם דפדפן ספארי וכו'.
ניתן לראות את האכיטקטורה כך :
[מתוך האתר: grid.selenium.googlecode.com]
ל-Grid יש 2 גרסאות נכון להיום, אתמקד בגרסה השנייה המעודכנת יותר – Grid 2, ההבדלים ביניהם גדולים, בין היתר Grid 2:
- יכול לתמוך בעד 5 דפדפנים לכל Remote Control (Grid 1 – רק דפדפן אחד)
- תומך בטסטים הכתובים ב-WebDriver (Grid 1 – רק ב-RC)
- מכיל את ה-Selenium Server
שלב 1 – התקנת Java
וודאו כי על מחשבכם מותקן Java (כל מחשב שיריץ הן Hub והן Nodes), לבדיקה האם מותקן או לא, פתחו את ה-Command Line והקישו : Java -Version . במידה ולא מותקן, היכנסו לאתר של Oracle , הורידו והתקינו את ה-JDK (הגרסה האחרונה)
* שימו לב, גם אם אינכם עובדים עם JAVA , הפלטפורמה ומערך הבדיקות שלכם כתובים בטכנולוגיה אחרת אין זה אומר כי אתם יכולים לדלג על שלב זה, ללא התקנת JAVA לא תוכלו להתקין את ה-Grid.
שלב 2 – התקנת ה-Selenium Grid Server (Hub)
לשם כך עלינו תחילה להיכנס לדף ההורדות של פרוייקט Selenium (http://docs.seleniumhq.org/download) ומשם להוריד את ה- Selenium Serverשהוא למעשה קובץ jar.
פתחו את ה-Command Line והכניסו את הפקודה הבאה:
java -jar selenium-server-standalone-2.44.0.jar -role hub -port 4444 -nodeTimeout 600
מה עשינו פה ?
ביקשנו להתקין את קובץ ה-Jar שהורדנו (במקרה שלנו הגרסה היא 2.44.0), הגדרת ה-Role מבדילה בין התקנת Hub או Node , פה אנחנו מגדירים לו להתקין Hub , עם Port 4444 שהוא ה-Port ברירת המחדל (כשמפעילים את ה-Hub הוא מתחיל אוטומטית להאזין לPort זה. הגדרנו לו עוד שדה (רשות) של TimeOut ל-600 שניות (10 דקות).
* אופציה נוספת: את ה Hub אוכל להגדיר דרך קובץ חיצוני, (בד"כ JSON או YAML), כמו בדוגמא המתוארת בלינק הזה:
והקריאה להפעלת קובץ זה תהיה כך:
java -jar selenium-server-standalone-2.25.0.jar -role hub -hubConfig <File Name>.json
כעת ניתן להיכנס לדפדפן ולבדוק את הגדרת ה-Hub שלנו על ידי הכנסת הכתובת הבאה: http://localhost:4444/grid/console , הקלקה על View Config תציג לנו מידע מפורט יותר על ה-Server שהתקנו.
המסך שיופיע אמור להיראות כך:
שלב 3 – התקנת ה- Selenium Grid Nodes
* על כל סביבת הרצה בה נרצה לעבוד עם ה-Grid נצטרך לבצע את השלב הזה.
בשביל לחבר את ה-Node ל-Hub כאשר הNode יוגדר לוקאלית על המכונה (Node + Hub יושבים על אותה מכונה) נפתח את ה-Command Line ונכניס את הפקודה הבאה:
java -jar selenium-server-standalone-2.44.0.jar -role node –hub http://localhost:4444/grid/register
ואילו Node היושב במכונה מרוחקת יוגדר כך:
java -jar selenium-server-standalone-2.44.0.jar -role node -hub http:// <IP Address>:4444/grid/register
<IP Address> = כתובת ה-IP שבו יושב ה-Hub תוגדר פה
חיבור Node עם הגדרה ספציפית של פרמטרים:
java -jar selenium-server-standalone-2.44.0.jar -role node -hub http:// <IP Address>:4444/grid/register -browser browserName="internet explorer",version=11,maxInstances=4,platform=WINDOWS -port 5556
בדוגמא זו הראתי חיבור של Node מעל מכונה בעלת מערכת הפעלה Windows , בעלת דפדפן מסוג IE , גרסה 11 , ניתן להריץ עד 4 דפדפנים לחיבור זה שיושב על Port 5556 ומאזין לו.
* שימו לב כי ערך ה-Role בספרות יופיע פעם כ-Node , פעם כ- WebDriver ופעם כ-RemoteControl וזה למה ? סיבה היסטורית לתמיכה לאחור. כשיצא Grid 1 עבדו עם החיבור של RC בלבד , Grid 2 הביא איתו גם את התמיכה ב-WD ואילו ה-Node מכיל את שניהם. כך שאם אני משתמש ב-Grid 1 אוכל להשתמש ב -role remotecontrol או ב –role node ואם אני מריץ את Grid 2 אוכל להשתמש ב –role webdriver או –role node
* אופציה נוספת: גם את ה Nodes אוכל להגדיר דרך קובץ חיצוני, (בד"כ JSON או YAML).
והקריאה להפעלת קובץ זה תהיה כך:
java -jar selenium-server-standalone-2.25.0.jar -role node -nodeConfig <File Name>.json
בסיום הגדרת ה Nodes , ניכנס לדפדפן ונכניס את הכתובת: http://localhost:4444/grid/console
המסך שיופיע אמור להיראות כך:
שלב 4 – הרצת הטסטים אל מול ה-Grid
עכשיו, אחרי שהגדרנו את ה-Hub וה Nodes נותר לנו להריץ את הבדיקות, אך רגע לפני ההרצה, נצטרך להגדיר עוד 2 דברים: קובץ קונפיגורציה ומתודת Setup בקוד שלנו .
יצירת קובץ הקונפיגורציה:
הקובץ יוצג כ-XML והוא למעשה יכיל את הטסטים של ה Grid (לא הטסטים שלנו ב-QA) , שיורכבו מהגדרות של משתני סביבה בעיקר. פה נגדיר איפה נריץ בהרצה מקבילית בפרוייקט שלנו.
תחילה נגדיר את ה-Suite :
<suite name="Parallel Tests" verbose="1" thread-count="3" parallel="tests"> </suite>
(הגדרנו פה הרצה מקבילית על 3 Threads שונים)
ואח"כ את ה tests וה parameters שלהם:
<tests> <test name="Windows+IE11 Test"> <parameters> <parameter name="platform" value="Windows" /> <parameter name="browser" value="Internet Explorer" /> <parameter name="version" value="11" /> <parameter name="url" value="http://www.Google.com"/> </parameters> <classes> <class name="GridTest" /> </classes> </test> <test name="Adroid Test"> <parameters> <parameter name="platform" value=" Android " /> <parameter name="browser" value="Chrome" /> <parameter name="version" value="39.0.2171.71" /> <parameter name="url" value="http://www.google.com"/> </parameters> <classes> <class name="GridTest" /> </classes> </test> </tests>
בדוגמא זו ראינו הגדרת 2 סביבות , הראשונה על Windows עם IE 11 והשניה על Android עם Chrome, בשני המקרים אני מאתחל את הדפדפן עם אתר הבית של Google , שימו לב כי הגדרנו את שם הclass כ- GridTest (נחזור אליו אח"כ).
הוספת מתודת Setup:
הוספת המתודה הזו ל-Class שלנו תיתן לנו את היכולת להתממשק עם ה Grid (כתוב ב-C#):
public void SetupTest() { DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities = DesiredCapabilities.Firefox(); capabilities.SetCapability(CapabilityType.BrowserName, "firefox"); capabilities.SetCapability(CapabilityType.Platform, new Platform(PlatformType.Windows)); capabilities.SetCapability(CapabilityType.Version, "21.0"); driver = new RemoteWebDriver(new URL ("http://<Machine IP>:5556/wd/hub"), capabilities); //<Machine IP> belongs to the second machine IP Address //driver = new FirefoxDriver(); baseURL = "https://www.google.com"; verificationErrors = new StringBuilder(); }
* שימו לב – מכיוון שבקובץ הקונפיגורציה הגדרנו כי <class name="GridTest” /> , לכן את המתודה שלנו נכתוב תחת אותו שם class (או לחילופין נשנה את השם בקובץ הקונפיגורציה).
כתיבת הטסט:
זהו, כמעט סיימנו, כל מה שנותר הוא לכתוב את הטסט עצמו ב-Selenium , הנה דוגמא לכניסה למנוע החיפוש של גוגל וחיפוש המילה Test:
[Test] public void GoogleTest() { driver.Navigate().GoToUrl(baseURL + "/"); driver.FindElement(By.Id("gbqfq")).Clear(); driver.FindElement(By.Id("gbqfq")).SendKeys("Test"); driver.FindElement(By.Id("gbqfb")).Click(); }
* שימו לב כי ה- baseURL מוגדר אצלינו תחת ה- SetupTest()
עכשיו כאשר נריץ טסט זה הוא יורץ תחת כל אותם Nodes שהגדרנו בשלבים הקודמים .
תוספת:
* באה חברת Codoid , הגדילה לעשות ושיחררה כלי GUI להתקנה והגדרה של Selenium Grid , אז לאלו מכם שלא אוהבים את החלון השחור של ה Command Line, יש לכם אלטרנטיבה שנקראת VisGrid אותה ניתן להורידה כאן.
* ישנן כמה חברות מסחריות שמציעות את טכנולוגיית ה-Grid כשירות אצלם בענן, כך שאת כל נושא האינפלמנטציה הם מסדרים, אתם נחשפים מהם לדף dashboard configuration page , מגדירים את הנתונים שלכם ובלחיצת כפתור מתחיל להריץ. השירות אינו חינמי אך יכול לחסוך לכם זמן רב בהתעסקות עם תחזוקת השרתים, הגדרות והתקנות. הנה כמה מהן: