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

* אך לפני כן אני חייב לציין, כי זהו אמנם שיעור חשוב בכדיי לדעת בעיקר איך לעבוד עם טבלאות, אך עבודה עם XPath לטבלאות מורכבות ומסובכות יותר גם כאלו דינאמית, לא תתאים,  הפתרון האידיאלי שאני מצאתי זה עבודה עם API שנקרא: HTML Agility Pack ועליו אדבר בפוסט נפרד.

בואו ניקח טבלה לדוגמא שיצרתי, את הטבלה ניתן לראות כאן:

הכי טוב שנעבוד עליה בדף חדש

קוד המקור של הטבלה נראה כך:

<table id="myTableID">
  <tr> 
    <td>Name</td>
    <td >Age</td>
    <td>Country</td>
  </tr>
  <tr>
    <td>Leo Messi</td>
    <td>27</td>
    <td>Argentina</td>
  </tr>
  <tr>
    <td>Lady Gaga</td>
    <td>28</td>
    <td>USA</td>
  </tr>
  <tr>
    <td>Ehud Barak</td>
    <td>72</td>
    <td>Israel</td>
  </tr>
</table>

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

אם נפתח את הטבלה בעמוד נפרד, ונפעיל את ה-Dev Tool כמו שלמדנו בשיעור הקודם, נוכל לראות כי ה-XPath עבור הגיל של ליאו מסי לדוגמא הוא:

xpathtableSample

 

/html/body/div/table/tbody/tr[2]/td[2]

שימו לב כעת לחלק האחרון של הכתובת: tr במקום השני ו-td במקום השני , שזה אומר שהגיל שלו הוא בשורה השנייה (מלמעלה) ובעמודה השניה (משמאל). כך שאני כבר יכול לדעת כי אם ארצה לשלוף את התא שמכיל את המדינה של אהוד ברק מבלי בכלל לפתוח את ה-Dev Tool , הכתובת תהיה:

/html/body/div/table/tbody/tr[4]/td[3]

שורה : 4 (כולל הכותרת כמובן), עמודה : 3

אז לשליפת המידע נוכל להשתמש בפונקציית GetText:

driver.findElement(By.xpath("/html/body/div/table/tbody/tr[4]/td[3]")).getText();

 

כמובן שניתן להכניס את המטרות לזיהוי באופן דינאמי כך:

String strRow = "4";
String strCol = "3";

driver.findElement(By.xpath("/html/body/div/table/tbody/tr[" + strRow + "]/td[" + strCol + "]")).getText();

 

 

בואו נסבך טיפה יותר את העניינים, עד עכשיו דיברנו על XPath סטאטי (בדוגמא הראשונה) ודינאמי (בדוגמא השניה) כאשר הערכים שאני מספק לאותו XPath הם קבועים וידועים מראש, איך נבצע פעולה של שליפה עם ערכים דינאמיים ? איך למשל בדוגמא שלנו נשלוף את כל הגילאים של כל המתמודדים (השורות) כשיש ברשותינו רק את ה- string = Age ? בואו נראה:

String sColValue = "Age"; 
     for (int i=1;i<=3;i++)                        // לולאה שתרוץ על העמודות
     {
          String sValue = null;
          sValue = driver.findElement(By.xpath("/html/body/div/table/tbody/tr[1]/td[" + i + "]")).getText();   // חיפוש אחר העמודה של הערך בשורה הראשונה
          if(sValue.equalsIgnoreCase(sColValue))   // במידה ומצא הערך יוכנס ללולאה נוספת שתרוץ על השורות
          {    
               for (int j=1;j<=3;j++)              // לולאה שתרוץ על השורות
               {
                     String sRowValue= driver.findElement(By.xpath("/html/body/div/table/tbody/tr[" + j + "]/td[" + i + "]")).getText();
                     System.out.println(sRowValue);
               }
  	       break;
          }
    }

 

 

דרך נוספת להתמודד עם טבלאות היא עבודה עם רשימות (Lists), כמו שניתן לראות כאן:

WebElement Webtable=driver.findElement(By.id("TableID"));
List<WebElement> TableRow=Webtable.findElements(By.xpath("//*[@id='myTableID']/tbody/tr"));

הכנסנו פה לתוך רשימה את שורות הטבלה (זיהוי הטבלה נעשה באמצעות ה-Attribute =ID). לצורך הדוגמא, נוכל כעת להדפיס למסך את המספר הכולל של השורות בערת מתודת ה-size:

System.out.println("No. of Rows in the Table: "+ TableRow.size());;

ולאחר מכן נוכל גם לרוץ על תאי הטבלה באיטרציות

int iRowIndex = 1;
for(WebElement rowElement : TableRow)
{
   List<WebElement> TableCol = rowElement.findElements(By.xpath("td"));
   int iColIndex = 1;
   for(WebElement colElement:TableCol)
   {
      System.out.println("Row "+ iRowIndex + " Column " + iColIndex + " Data " + colElement.getText());
      iColIndex = iColIndex + 1;
   }
   iRowIndex = iRowIndex + 1;
}

 

 


arrowBack arrowMain arrowFor

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