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

במקרים בהם המערכת הנבדקת – System Under test איטית למשל בתעבורת הרשת (נגיד בין הקליינט לסרבר), או כשהיא מגיבה לאט, תוכל להיווצר לנו בעיה. פקודת ה-FindElement שלנו עלולה שלא למצוא את האלמנט הרצוי על המסך כי זה עדיין לא הספיק להגיע (מהסרבר למשל) כך שבמקרה זה הטסט שלנו יפול.

אז מה עושים ? אפשר לפתור זאת בדרך פרימיטיבית ולהשתמש בפקודת Sleep – פקודה אשר משהה את פעולות ה-Driver לפרק זמן מוגדר (שמתקבל ע"י פרמטר). דרך זו אינה מומלצת בגלל חוסר יציבותה של ה-SUT, היום מהירות התעבורה ב-SUT מהירה, כך שמספיקה שנייה אחת עד שנראה את האלמנט (נשתול Sleep=1000 ms בקוד), אך מחר מהירות התעבורה תרד והשנייה ששתלנו ב-Sleep לא תספיק, הטסט יפול עד שלא נעדכן אותו בקוד (תלוי בנו) או עוד שהמהירות תחזור כפי שהייתה בפעם שעברה (לא תלוי בנו).

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

האופציה השניה לעבודה עם זמני תגובה, היא פונקציות ה-Wait השונות, אותן נכיר כאן בשיעור זה.

* הסינטקס בין #C לבין Java טיפה שונה בפונקציות ה-Wait לכן אתן את שתי האופציות.

 

פונקצית ה-Implicit Wait:

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

במידה והאלמנט לא הופיע בפרק הזמן הנתון, ייזרק NoSuchElementException.

דוגמא ב-#C:
WebDriver driver = new FirefoxDriver();
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
driver.Url = "http://blog.YoniFlenner.Net/LoadingPage";
IWebElement myDynamicElement = driver.FindElement(By.Id("SomeElement"));

 

דוגמא ב-Java:
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://blog.YoniFlenner.Net/LoadingPage");
WebElement myDynamicElement = driver.findElement(By.id("SomeElement"));

 

פונקצית ה-Explicit Wait:

תיאור: פונקציה זו תמתין לתנאי מסויים שיתקיים לפני שתמשיך בקוד. פונקציית ה-Sleep היא למעשה מקרה פרטי של פונקציית ה-Explicit כאשר הזמן הוא התנאי במקרה הזה. כמובן שפה נרצה להשתמש במשהו חכם יותר, כך שנוכל להגדיר לו להמתין לאלמנט מסויים עם חסם עליון, ההבדל בין פונקציה זו ל-Implicit הוא שכאן תתבצע המתנה עד לפרק זמן המוגדר מראש עם דגימה של הפונקציה ל-DOM (להופעת האלמנט) כל חצי שניה (500ms) .

גם כאן, במידה והאלמנט לא הופיע בפרק הזמן הנתון, ייזרק NoSuchElementException

דוגמא ב-#C:
WebDriver driver = new FirefoxDriver();
driver.Url = "http://somedomain/url_that_delays_loading";
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
WebElement myDynamicElement = wait.Until((d) =>
    {
        return d.FindElement(By.Id("someDynamicElement"));
    });

 

דוגמא ב-Java:
WebDriver driver = new FirefoxDriver();
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
  .until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));

 

פונקצית ה-Fluent Wait:

תיאור: הפונקציה הקונפיגורבילית מכולן, גם ניתן להגדיר לה חסם עליון, וגם ניתן להגדיר לה את פרק זמן הדגימה להופעת האלמנט (כזכור ל-implicit ול-explicit יש דגימה קבועה של 500ms). בנוסף לכך המשתמש יוכל להגדיר בפונקציה זו גם התעלמות מסוגים שונים של Exceptions שיכולים להיזרק, לדוגמא: NoSuchElementExceptions. למה זה טוב ? במקרים בהם קיים האלמנט ב-DOM אך הוא מוגדר כ-Not Visible.

* פונקציה זו אינה נתמכת ב-#C (אין לה קלאס ב-API של NET.)

דוגמא ב-Java:
   Wait wait = new FluentWait(driver)
       .withTimeout(30, SECONDS)                        // חסם עליון של 30 שניות
       .pollingEvery(5, SECONDS)                        // דגימת העמוד כל 5 שניות
       .ignoring(NoSuchElementException.class);

   WebElement myDynamicElement = wait.until(new Function<WebDriver, WebElement>() {
     public WebElement apply(WebDriver driver) {
       return driver.findElement(By.id("SomeID"));
     }
   });

 

פונקציית ה-pageLoadTimeout:

תיאור: בפונקציה זו ניתן להגדיר כמות זמן מקסימלית עד שעמוד יעלה במלואו לפני שייזרק Exception. במידה ונשלח ערך שלילי לפונקציה, כמות הזמן המקסימלית תהיה אינסופית.

דוגמא ב-#C:
WebDriver driver = new FirefoxDriver();
driver.Manage().Timeouts.SetPageLoadTimeout(TimeSpan.FromSeconds(10));

 

דוגמא ב-Java:
driver.manage().timeouts().pageLoadTimeout(10, SECONDS);

 

פונקציית ה-setScriptTimeout:

תיאור: פונקציה זו קובעת את זמן ההמתנה עד סיום פעולת סקריפט אסינכרוני לפני שייזרק Exception. במידה ונשלח ערך שלילי לפונקציה, כמות הזמן המקסימלית תהיה אינסופית.

דוגמא:
driver.manage().timeouts().setScriptTimeout(10,SECONDS);

 

פונקציית ה-Sleep:

תיאור: נאמר כבר הכל. פונקציה פרימיטיבית, מקרה ספציפי של ה-explicit כך שהתנאי שלה הוא זמן. לא מרבים להשתמש בה. היחידות בה הן מילי שניות.

דוגמא:
thread.sleep(1000);

 

 


arrowBackarrowMainarrowFor

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