לסלניום Webdriver יש מגבלות. הוא אינו יודע להתמודד עם נושאים מסויימים, זה ידוע למשל שהוא מוגבל לעבודה בתוך תחומי הדפדפן, ומה גם שבתוך הדפדפן יש לו בעיות גם להתמודד עם אלמנטים גרפיים למשל.

לשמחתנו הרבה ישנן פתרונות לכל (טוב נו, לרוב) המגבלות הקיימות בסלניום , כך למשל ניתן להריץ מתוך קוד הסלניום שלנו קובץ Exe ובכך להפעיל סקריפט מקומפל של AutoIT , או למשל ניתן להתממשק ל- Robot Class מה שיביא לנו יכולות נוספות של שליטה (או יותר נכון סימולציה) על המקלדת והעכבר.

בפוסט זה נלמד על דרך נוספת בה ניתן להתגבר על מכשלה שקיימת ב-Selenium Webdriver והיא זיהוי אלמנטים גרפיים, אלמנטים אשר לא ניתן לזהות ב-Spy.

myLogoPublish_Sikuli

 

נסו להיכנס למפות גוגל, לפתוח את ה-Dev Tools של הדפדפן ולנסות לדלות איזשהו שבב של מידע על האלמנטים הקיימים בתוך ה-Container של המפה. לא ניתן.

נסו לזהות איזשהו אלמנט על משחק און-ליין שמוגדר בתוך <canvas> , גם לא ניתן.

onlinegame

 

מהו Sikuli ?

Sikuli זהו כלי הנותן לנו לבצע פעולות אוטומטיות ובדיקות של GUI בעזרת תמונות (images / screen shots). כלי זה למעשה נותן לנו את היכולת לאטמט כל דבר שאנו רואים על המסך, בין אם זה אלמנט בתוך Canvas , בתוך Form או כתמונה בפני עצמה, מבחינת Sikuli כל זה לא משנה, הוא משתמש במנוע זיהוי תמונה (Image Recognition) בכדיי לזהות ולשלוט על קומפוננטות GUI-יות

Sikuli מגיע ממשפחת ה-Open Source , והוא החל את דרכו בקבוצת User Interface Design Group במכון המחקר MIT.

 

שימו לב – ככל אצבע, שימוש בכלים המושתתים על Image Recognition יהיה השימוש הכמעט אחרון עימו נרצה לעבוד, אני נותן פה פתרון נוסף לעבודה עם סלניום, פיתרון שיש לקחת אותו בעדיפות נמוכה יחסית לעבודה , אלא אם כן אתם יודעים כי האפליקציה אותה אתם בודקים חסינה לשינויי ממשק המשתמש.

 



 

עם Sikuli ניתן לעבוד בשני אופנים:

1. עבודה מול ה-Sikuli IDE , ניתן בסביבתו להגדיר ולכתוב את הבדיקות בעזרת שימוש בסקריפט ייחודי, כמו שרואים בדוגמא הבאה:

sikuli1

לפרטים נוספים לגביי עבודה עם ה-Sikuli IDE , היכנסו לפרוייקט SikuliX

 

2. עבודה עם Selenium Webdriver תוך התממשקות אל ה-API של Sikuli , האופן הזה נקרא גם : Sikuli Webdriver.

 

התקנה:

בכדיי להתקין את הספריות של Sikuli , תחילה יש להוריד אותן מהאתר הרישמי: https://launchpad.net/sikuli/+download

מתוך ה-Command Line , הריצו את הקובץ sikuli-setup.jar , זה מה שאתם אמורים לראות לאחר הריצה של הקובץ:

sikuli2

לאחר מכן , ייפתח לכם חלון חדש, ביחרו את האופציות הבאות:

sikuli3

אשרו את ההורדה:

sikuli4

 

ובשלב הבא יש לשייך את קובץ ה-JAR אל הפרוייקט שלנו:

sikuli5

 

להלן כמה מהמתודות הנתמכות ב-API :

// Creating Object for Screen Class
Screen screen = new Screen();

// Click On An Element
screen.click(“<<image name>>”);

//Right Click On An Element
screen.rightClick(“<<image name>>”);

//find An Element
screen.find(“<<image name>>”);

//Double Click on An Element
screen.doubleClick(“<<image name>>”);

//Check whether an Element present on the Screen
screen.exists(“<<image name>>”);

//Type a string on a Textbox
screen.type(“<<image name>>”,”String to be typed”);

 

להלן דוגמא של ביצוע כמה פעולות אוטומטיות בעזרת Sikuli :

כניסה לטריילר החדש של הסרט מהיר ועצבני 7 (https://youtu.be/Skpu5HaVkOc) , שינוי הגדרת הצפייה לרזולוציה הגבוהה ביותר (1080p) , פתיחת הסרט לצפייה במסך מלא , סגירת הדפדפן עם סיום הסרט.

sikuli_youtube

 

package Sikuli;

import org.openqa.selenium.chrome.ChromeDriver;
import org.sikuli.script.FindFailed;
import org.sikuli.script.Screen;

public class sikuliYouTube
{
	public static int clipDuarion = 162000; // => 2:42 minutes
	public static void main(String[] args) throws FindFailed, InterruptedException
	{
		System.setProperty("webdriver.chrome.driver", "D://chromedriver.exe");
		ChromeDriver driver = new ChromeDriver();
		driver.manage().window().maximize();
		driver.get("https://youtu.be/Skpu5HaVkOc");

		Screen s=new Screen();
		s.find("D:\\Sikuli\youTube\youtube_pause.png");
		s.click("D:\\Sikuli\youTube\youtube_pause.png"); 
		System.out.println("pause button clicked");
		
		s.click("D:\\Sikuli\youTube\youtube_settings.png"); 
        System.out.println("settings button clicked");

		s.click("D:\\Sikuli\youTube\youtube_480p.png");
        System.out.println("480p button clicked");

		s.click("D:\\Sikuli\youTube\youtube_1080p.png");
        System.out.println("1080p button clicked");

		s.click("D:\\Sikuli\youTube\youtube_play.png"); 
        System.out.println("play button clicked");

		s.click("D:\\Sikuli\youTube\youtube_fullscreen.png");
        System.out.println("full screen button clicked");

		s.click("D:\\Sikuli\youTube\youtube_allow.png");
        System.out.println("allow viewing full screen button clicked");

		Thread.sleep(clipDuarion); // wait until trailer is finished
		
		driver.quit();
	}
}

 

קבצי התמונות השמורים , אותם ה-Sikuli לוקח ומשווה על המסך:

youtube_settings

youtube_play

youtube_pause

youtube_fullscreen

youtube_allow

youtube_1080p

youtube_480p

 

טיפ: ככל שתצלמו את האלמנט בצורה הרחבה ביותר (תכניסו יותר פרטים לתמונה) , כך הסיכוי של מנוע ההשוואה הגרפי של Sikuli יהיה גבוה יותר למצוא את התמונה על המסך, קחו לדוגמא את התמונה של ה-1080p ועומת 480p , שימו לב שבגלל שלתמונת ה-480 אין מספיק מידע כמו ה-1080 (שיש לו את הסימן HD בצד) , ה-sikuli לא הצליח לזהות אותו כהלכה , לכן הכנסתי יותר פרטים למסך, כמו הפרט – Quality.

הסיבה לעדיפות נמוכה בעבודה עם Sikuli היא אוסף התמונות שאנו אמורים לשמור בתוך ה-Repository שלנו , במידה וה-GUI של YouTube (במקרה הזה) ישתנה, כך נצטרך לעבור תמונה תמונה ולעדכן את השינויים בהתאם , פשוט התחזוקה של ה-repository גבוהה מידי ומצריכה זמן רב.

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