במהלך עבודתי בפיתוח אוטומציה, יוצא לי לעבוד לא מעט על טבלאות. עם הזמן ניסיתי כל מיני דרכים לשכלל וליעל את עבודתי, אז בין ה-TR ל-TD התחלתי לכתוב לולאות ורשימות, עבדתי עם APIs שונים כמו ה-HTMLAgilityPack וה-jSoup (שהוא מעולה אך לא מספיק אינטואטיבי לטעמי), ובסופו של דבר החלטתי לכתוב API משל עצמי, אחד כזה שיהיה ברור, קל ונוח לעבוד איתו.
אז נתחיל מהתחלה, בשביל להתחיל עבוד עם סלניום על טבלאות, צריך קודם להכיר איך מבנה טבלאי נראה ב-HTML , עם tr ו-td
כפי שניתן לראות, מכיוון שלתאים בטבלה אין מזהה ייחודי, אנו נאלצים לזהות אותם בעזרת xpath – מה שיכול להיות די מעיק. במיוחד למראה קוד כזה:
String firstHeader = driver.findElement(By.xpath("/html/body/div/div[3]/div[2]/div/div[4]/form/table/thead/tr[0]/td[0]/strong")).getText(); String lastColomn = driver.findElement(By.xpath("/html/body/div/div[3]/div[2]/div/div[4]/form/table/tfoot/tr[0]/td[8]/strong")).getText();
כשאנו עובדים עם MyTable API , אין לנו צורך כלל להשתמש בפונקציה findElement , היא כבר ממומשת בתוך ה-JAR , כמו כן זיהוי האלמנטים זונח את תצורת ה-xpath הארוכה והמייגעת ובמקומו אנו נעבוד עם פונקציות כמו ()getRow ו-()getCell , כאשר לתוך הסוגריים אנו נכניס את הערך האינדקסי של האיבר בטבלה.
אז איך ניתן להתחיל לעבוד עם MyTable API ?
1. מורידים את קובץ ה-JAR אל המחשב ומשייכים אותו לפרוייקט שלכם. להורדת הקובץ, הקישו כאן
2. משייכים את התוכנית שלנו אל ספריית MyTable בקובץ ה-JAR :
import webdriver.utils.table.MyTable;
3. ניצור WebElement שיגדיר את הטבלה:
WebElement TableElement = driver.findElement(By.xpath("//table"));
4. ניצור אובייקט table מסוג MyTable אשר יקבל את אלמנט הטבלה:
MyTable table = WebTable.getTable(TableElement);
5. כעת אנחנו יכולים לעבוד מול כל תא ותא בטבלה. בואו ונראה דוגמא לטבלה עליה נעבוד:
[קישור ישיר לעמוד הטבלה: https://atidcollege.co.il/Xamples/Samples/Tables/tableCountries.html]
דוגמא: הדפסת מספר שורות הטבלה (לא כולל השורה הראשונה והאחרונה שמוגדרות כ-Headrer ו-Footer):
System.out.println("Number of Rows: " + table.getTBody().getRowCount());
דוגמא: הדפסת אוכלוסיית קנדה:
System.out.println("Population of Canada: " + table.getTBody().getRow(4).getCell(3).getText());
דוגמא: הדפסת כל הכותרות של הטבלה:
System.out.println("Table Titles: " + table.getRowElement(0).getText());
דוגמא: הדפסת הערך השני של ה-Header של הטבלה (Continent):
System.out.println("Header Value: " + table.getTHead().getRow(0).getHeaderCell(1).getText());
שימו לב כי לא נעשה כאן שום שימוש ב-findElements או בתצורה כזו או אחרת של XPath. הכל כבר ממומש בתוך ספריית ה-API (קובץ ה-JAR)
לתיעוד מלא של ה-API היכנסו לדף: https://atidcollege.co.il/Xamples/api/mytable/doc