วิธีจัดการตารางเว็บใน Selenium

⚡ สรุปอย่างชาญฉลาด

Selenium การจัดการตารางบนเว็บช่วยให้วิศวกร QA สามารถอ่านข้อมูลตารางจากแถวและคอลัมน์ HTML โดยใช้ XPath, CSS และอื่นๆ ได้ Selenium ตัวระบุตำแหน่งสัมพัทธ์ 4 แบบ บทความนี้จะอธิบายเกี่ยวกับตารางคงที่ ตารางซ้อน ตัวบ่งชี้คุณลักษณะ และเทคนิค AI สำหรับตารางแบบไดนามิก

  • 🧱 โครงสร้างของ XPath: ตัวระบุตำแหน่งตารางทุกตัวเริ่มต้นด้วย //table และเจาะลึกเข้าไปใน tbody, tr และ td โดยใช้เงื่อนไข (predicates)
  • 🔁 แถวแบบไดนามิก: findElements จะส่งคืน List ของ WebElements เพื่อให้ลูปสามารถนับแถวและอ่านเซลล์ในระหว่างการทำงานได้
  • 🪄 Selenium 4: ตัวระบุตำแหน่งสัมพัทธ์ เช่น ด้านบน ด้านล่าง และใกล้เคียง ช่วยให้การกำหนดเป้าหมายเซลล์รอบๆ องค์ประกอบหลักที่ทราบแล้วทำได้ง่ายขึ้น
  • 🧠 ระบบระบุตำแหน่งด้วย AI: เครื่องมือแก้ไขอัตโนมัติจะตรวจจับการเลื่อนของคอลัมน์และกู้คืนข้อมูลแถวโดยไม่ต้องแก้ไข XPath ด้วยตนเอง
  • 🛠️ ทางลัดการตรวจสอบ: เครื่องมือสำหรับนักพัฒนาเบราว์เซอร์จะคัดลอก XPath แบบเต็ม ซึ่งคุณสามารถตัดทอนให้เหลือเพียงตารางแรกเพื่อความน่าเชื่อถือได้

Selenium ตัวอย่าง XPath ของตารางเว็บ

Web Table คืออะไร Selenium?

A ตารางเว็บ in Selenium ตารางคือ WebElement ที่ใช้สำหรับแสดงข้อมูลหรือสารสนเทศในรูปแบบตาราง ข้อมูลที่แสดงอาจเป็นข้อมูลคงที่หรือข้อมูลเปลี่ยนแปลงได้ เซลล์และแถวของตารางเว็บสามารถเข้าถึงได้ผ่านเมธอดของ WebElement ร่วมกับตัวระบุตำแหน่ง ตัวอย่างทั่วไปคือตารางแสดงรายละเอียดสินค้าที่แสดงบนหน้าสินค้าในเว็บไซต์อีคอมเมิร์ซ

การอ่านตารางเว็บ HTML

หลายครั้งที่ผู้ทดสอบจำเป็นต้องเข้าถึงองค์ประกอบต่างๆ ซึ่งโดยปกติจะเป็นค่าข้อความ ที่อยู่ภายในตาราง HTML อย่างไรก็ตาม นักออกแบบเว็บมักไม่กำหนดแอตทริบิวต์ id หรือ name ให้กับเซลล์แต่ละเซลล์ ดังนั้น วิธีการต่างๆ เช่น By.id(), By.name() หรือ By.cssSelector() จึงไม่ค่อยได้ผล ในสถานการณ์เช่นนี้ ตัวเลือกที่น่าเชื่อถือที่สุดคือ By.xpath() เพราะมันจะสำรวจความสัมพันธ์ระหว่างองค์ประกอบหลักและองค์ประกอบย่อยภายในแท็กตาราง

วิธีจัดการตารางเว็บใน Selenium

พิจารณาโค้ด HTML ด้านล่างสำหรับจัดการตารางเว็บ Selenium.

วิธีเขียน XPath สำหรับ Table ใน Selenium

เราจะใช้ XPath เพื่อรับข้อความภายในของเซลล์ที่มีข้อความ "เซลล์ที่สี่"

วิธีเขียน XPath สำหรับ Table ใน Selenium

ขั้นตอนที่ 1 – ตั้งค่าองค์ประกอบหลัก (ตาราง)

ตัวระบุ XPath ใน WebDriver จะเริ่มต้นด้วยเครื่องหมายทับคู่ “//” ตามด้วยองค์ประกอบแม่เสมอ- เนื่องจากเรากำลังติดต่อกับตารางเว็บค่ะ Seleniumองค์ประกอบหลักควรเป็น the เสมอ แท็ก ส่วนแรกของเรา Selenium ดังนั้น ตัวระบุตำแหน่งตาราง XPath ต้องเริ่มต้นด้วย “//table”

Selenium ตัวอย่างตารางเว็บ

ขั้นตอนที่ 2 - เพิ่มองค์ประกอบลูก

องค์ประกอบที่อยู่ด้านล่างโดยตรง เป็น , ดังนั้น เป็นลูกของ ในทางกลับกัน เป็นผู้ปกครองของ องค์ประกอบย่อยทั้งหมดใน XPath จะถูกวางไว้ทางด้านขวาขององค์ประกอบหลัก โดยคั่นด้วยเครื่องหมายทับ “/” ดังแสดงด้านล่าง

Selenium ตัวอย่างตารางเว็บ

ขั้นตอนที่ 3 - เพิ่มภาคแสดง

เดอะ องค์ประกอบประกอบด้วยสอง แท็กสองอันนี้ แท็กเป็นลูกของ , ดังนั้น เป็นพ่อแม่ของทั้งสอง ทั้งสอง องค์ประกอบต่างๆ เป็นพี่น้องกัน พี่น้องคือส่วนประกอบของลูกที่เกิดจากพ่อแม่คนเดียวกัน.

เพื่อไปถึง ที่มี “เซลล์ที่สี่” เราต้องเข้าถึงก่อน ที่สอง ไม่ใช่ตัวแรก การเขียนเพียง “//table/tbody/tr” จะกำหนดเป้าหมายไปที่ตัวแรก แท็ก

แล้วเราจะเข้าถึงส่วนที่สองได้อย่างไร คำตอบคือการใช้ ภาคแสดง. ตัวบ่งชี้ (Predicates) คือตัวเลขหรือแอตทริบิวต์ HTML ที่อยู่ในวงเล็บเหลี่ยม “[ ]” ซึ่งใช้แยกความแตกต่างระหว่างองค์ประกอบย่อยกับองค์ประกอบพี่น้องเนื่องจากแถวที่เราต้องการคือแถวที่สอง เราจึงใช้ “[2]” เป็นเงื่อนไข

 Selenium ตัวอย่างตารางเว็บ

หากเราละเว้นเงื่อนไข XPath จะส่งคืนพี่น้องตัวแรก ดังนั้นโค้ด XPath ใดๆ ด้านล่างนี้ก็จะเข้าถึงพี่น้องตัวแรกได้เช่นกัน .

Selenium ตารางเว็บโดยใช้ Xpath

ขั้นตอนที่ 4 - เพิ่มองค์ประกอบลูกที่ประสบความสำเร็จโดยใช้ภาคแสดงที่เหมาะสม

องค์ประกอบถัดไปที่เราต้องการคือองค์ประกอบที่สอง เมื่อนำกฎจากขั้นตอนที่ 2 และ 3 มาใช้ เราจะได้ XPath ดังแสดงด้านล่าง

ตารางเว็บใน Selenium โดยใช้ Xpath

เมื่อเราได้ตัวระบุ XPath ที่ถูกต้องแล้ว เราก็สามารถเข้าถึงเซลล์และอ่านข้อความภายในเซลล์ได้โดยใช้โค้ดด้านล่างนี้ โดยสมมติว่าคุณได้บันทึกหน้า HTML เป็น “newhtml.html” ไว้ในไดรฟ์ C ของคุณแล้ว

ตารางเว็บใน Selenium โดยใช้ Xpath

public static void main(String[] args) {
    String baseUrl = "https://demo.guru99.com/test/write-xpath-table.html";
    WebDriver driver = new FirefoxDriver();

    driver.get(baseUrl);
    String innerText = driver.findElement(
        By.xpath("//table/tbody/tr[2]/td[2]")).getText();
    System.out.println(innerText);
    driver.quit();
}

ตารางเว็บใน Selenium โดยใช้ Xpath

การเข้าถึงตารางที่ซ้อนกัน

หลักการเดียวกันนี้สามารถนำไปใช้กับตารางซ้อนกันได้เช่นกัน ตารางซ้อนกัน คือ ตารางที่วางอยู่ภายในตารางอื่น- ตัวอย่างแสดงไว้ด้านล่าง

วิธีการเข้าถึงตารางที่ซ้อนกันใน Selenium

ในการเข้าถึงเซลล์ที่มีข้อความ “4-5-6” โดยใช้แนวคิดความสัมพันธ์ระหว่างผู้ปกครอง/ลูก และเงื่อนไขจากส่วนก่อนหน้า เราสามารถสร้าง XPath ได้ดังที่แสดงด้านล่าง

วิธีการเข้าถึงตารางที่ซ้อนกันใน Selenium

โค้ด WebDriver ด้านล่างนี้จะดึงข้อความภายในเซลล์เป้าหมาย

การเข้าถึงตารางที่ซ้อนกันใน Selenium

public static void main(String[] args) {
    String baseUrl = "https://demo.guru99.com/test/accessing-nested-table.html";
    WebDriver driver = new FirefoxDriver();

    driver.get(baseUrl);
    String innerText = driver.findElement(
        By.xpath("//table/tbody/tr[2]/td[2]/table/tbody/tr/td[2]")).getText();
    System.out.println(innerText);
    driver.quit();
}

ผลลัพธ์ด้านล่างยืนยันว่าเข้าถึงตารางด้านในได้สำเร็จ

การเข้าถึงตารางที่ซ้อนกันใน Selenium

การใช้แอตทริบิวต์เป็นภาคแสดง

หากองค์ประกอบนั้นอยู่ลึกเข้าไปในโครงสร้าง HTML จนการนับจำนวนองค์ประกอบพี่น้องกลายเป็นเรื่องยุ่งยาก เราสามารถใช้แอตทริบิวต์ `unique` ขององค์ประกอบนั้นแทนได้

ในตัวอย่างด้านล่าง เซลล์ "นิวยอร์กถึงชิคาโก" ถูกซ่อนอยู่ลึกเข้าไปข้างใน Mercury หน้าแรกของทัวร์

Selenium ตัวอย่างตารางเว็บโดยใช้แอตทริบิวต์เป็นเพรดิเคต

Selenium ตัวอย่างตารางเว็บโดยใช้แอตทริบิวต์เป็นเพรดิเคต

เราสามารถใช้คุณลักษณะเฉพาะของตาราง (width=”270″) เป็นเงื่อนไขได้ แอ็ตทริบิวต์ถูกใช้เป็นเพรดิเคตโดยนำหน้าด้วยสัญลักษณ์ @ในตัวอย่างข้างต้น เซลล์ "นิวยอร์กไปชิคาโก" ตั้งอยู่ในช่องแรก ของครั้งที่สี่ ดังนั้น XPath ของเราจึงควรมีลักษณะดังที่แสดงด้านล่าง

Selenium ตัวอย่างตารางเว็บที่มีแอตทริบิวต์เป็นเพรดิเคต

โปรดจำไว้ว่าเมื่อคุณใส่ XPath เข้าไปข้างใน Javaหลีกเลี่ยงเครื่องหมายอัญประกาศคู่รอบ “270” ด้วยเครื่องหมายแบ็กสแลช เพื่อไม่ให้สตริง By.xpath() ถูกตัดขาดก่อนกำหนด

Selenium ตัวอย่างตารางเว็บที่มีแอตทริบิวต์เป็นเพรดิเคต

ตอนนี้เราพร้อมที่จะเข้าถึงเซลล์นั้นโดยใช้โค้ดด้านล่างแล้ว

Selenium ตัวอย่างตารางเว็บที่มีแอตทริบิวต์เป็นเพรดิเคต

public static void main(String[] args) {
    String baseUrl = "https://demo.guru99.com/test/newtours/";
    WebDriver driver = new FirefoxDriver();

    driver.get(baseUrl);
    String innerText = driver.findElement(By
        .xpath("//table[@width=\"270\"]/tbody/tr[4]/td"))
        .getText();
    System.out.println(innerText);
    driver.quit();
}

Selenium ตัวอย่างตารางเว็บที่มีแอตทริบิวต์เป็นเพรดิเคต

ทางลัด: ใช้ Inspect Element เพื่อเข้าถึงตาราง Selenium

หากการหาดัชนีหรือแอตทริบิวต์ขององค์ประกอบทำได้ยาก วิธีที่เร็วที่สุดในการสร้าง XPath คือการใช้เครื่องมือตรวจสอบองค์ประกอบ (Inspect Element) ในเครื่องมือสำหรับนักพัฒนา (DevTools) ของเบราว์เซอร์รุ่นใหม่

พิจารณาตัวอย่างด้านล่างนี้จาก Mercury หน้าแรกของทัวร์

Selenium ตัวอย่างตารางเว็บที่มีแอตทริบิวต์เป็นเพรดิเคต

ขั้นตอนที่ 1

คลิกขวาที่เซลล์เป้าหมายแล้วเลือก Inspect เพื่อดูเส้นทาง DOM จากนั้นคัดลอก XPath ทั้งหมด

Selenium ตัวอย่างตารางเว็บที่มีแอตทริบิวต์เป็นเพรดิเคต

ขั้นตอนที่ 2

มองหาองค์ประกอบหลักของ "ตาราง" แรกและลบทุกอย่างทางด้านซ้ายของมัน

Selenium ตัวอย่างตารางเว็บที่มีแอตทริบิวต์เป็นเพรดิเคต

ขั้นตอนที่ 3

เพิ่มเครื่องหมายทับคู่ “//” หน้า XPath ที่เหลือ แล้วคัดลอกไปใส่ในโค้ด WebDriver ของคุณ

Selenium ตัวอย่างตารางเว็บพร้อมคุณสมบัติ

โค้ด WebDriver ด้านล่างนี้จะดึงข้อความภายในขององค์ประกอบที่มีการซ้อนกันหลายระดับ

Selenium ตัวอย่างตารางเว็บพร้อมคุณสมบัติ

public static void main(String[] args) {
    String baseUrl = "https://demo.guru99.com/test/newtours/";
    WebDriver driver = new FirefoxDriver();

    driver.get(baseUrl);
    String innerText = driver.findElement(By
        .xpath("//table/tbody/tr/td[2]"
        + "//table/tbody/tr[4]/td/"
        + "table/tbody/tr/td[2]/"
        + "table/tbody/tr[2]/td[1]/"
        + "table[2]/tbody/tr[3]/td[2]/font"))
        .getText();
    System.out.println(innerText);
    driver.quit();
}

วิธีนับจำนวนแถวและคอลัมน์ในตารางเว็บแบบไดนามิก

ตารางเว็บแบบไดนามิก เช่น แดชบอร์ดหรือผลการค้นหา จะแสดงจำนวนแถวที่แตกต่างกันในแต่ละครั้งที่โหลด เพื่อจัดการกับตารางเหล่านี้ ให้ใช้ findElements เพื่อดึงข้อมูลทุกอย่าง แปลงข้อมูลเป็นลิสต์ จากนั้นวนลูปเพื่ออ่านแต่ละเซลล์ โค้ดด้านล่างนี้จะนับจำนวนแถวและอ่านทุกเซลล์ในตารางที่มี id เป็น “customers”

List<WebElement> rows = driver.findElements(
    By.xpath("//table[@id='customers']//tr"));
System.out.println("Total rows: " + rows.size());

for (int i = 1; i <= rows.size(); i++) {
    List<WebElement> cells = driver.findElements(
        By.xpath("//table[@id='customers']//tr[" + i + "]/td"));
    for (WebElement cell : cells) {
        System.out.println(cell.getText());
    }
}

ห่ออุปกรณ์ระบุตำแหน่งด้วย WebDriverWait สีสดสวย visibilityOfAllElementsLocatedBy เมื่อตารางถูกโหลดด้วย AJAX วิธีนี้จะช่วยป้องกันการอ้างอิงองค์ประกอบที่ล้าสมัยในตารางที่มีการแสดงผลช้า

Selenium 4 ตัวระบุตำแหน่งสัมพัทธ์สำหรับตารางบนเว็บ

Selenium 4. มีการแนะนำตัวระบุตำแหน่งสัมพัทธ์ที่กำหนดเป้าหมายองค์ประกอบตามตำแหน่งภาพ ซึ่งมีประโยชน์เมื่อดัชนี XPath เสียหายเนื่องจากการจัดเรียงแถวใหม่ วิธีการเหล่านี้ above(), below(), toLeftOf(), toRightOf()และ near() ทั้งหมดรองรับ WebElement ที่มี anchor

import static org.openqa.selenium.support.locators.RelativeLocator.with;

WebElement emailHeader = driver.findElement(By.xpath("//th[text()='Email']"));
WebElement emailCell = driver.findElement(
    with(By.tagName("td")).below(emailHeader));
System.out.println(emailCell.getText());

ตัวระบุตำแหน่งสัมพัทธ์ยังคงอ่านง่ายแม้ลำดับคอลัมน์จะเปลี่ยนไป ควรใช้ร่วมกับการรอแบบระบุเจาะจงเพื่อให้ได้ผลลัพธ์ที่ดีที่สุดในหน้าเว็บที่ขับเคลื่อนด้วยข้อมูล

เครื่องมือ AI สำหรับจัดการตารางเว็บแบบไดนามิก

แพลตฟอร์มการทดสอบที่ใช้ AI ช่วยลดการบำรุงรักษาอุปกรณ์ระบุตำแหน่งบนโครงข่ายไฟฟ้าที่เปลี่ยนแปลงบ่อย เครื่องมือต่างๆ เช่น Testim, มาบลและ ทำหน้าที่ ใช้เทคโนโลยีคอมพิวเตอร์วิชั่นและโมเดล DOM ในการตรวจจับการเลื่อนของคอลัมน์และแก้ไขตำแหน่งโดยอัตโนมัติ โดยระบุแถวจากข้อความส่วนหัวและความคล้ายคลึงกันของเซลล์ แทนที่จะใช้ดัชนี XPath แบบตายตัว

เพื่อความบริสุทธิ์ Selenium โครงการต่างๆ ห้องสมุด เช่น ฮีเลเนียม ห่อหุ้ม WebDriver และเขียนตัวระบุตำแหน่งที่เสียหายใหม่ในขณะรันไทม์ ผสานรวมเครื่องมือเหล่านี้กับ WebDriverWait เพื่อรักษาเสถียรภาพของสคริปต์ตารางแบบไดนามิกโดยไม่ต้องเขียนตัวเลือกใหม่หลังจากทุกครั้งที่มีการเปลี่ยนแปลง UI

สรุป

  • การใช้ .xpath() เป็นวิธีที่น่าเชื่อถือที่สุดในการเข้าถึงเซลล์ของตารางบนเว็บ Selenium.
  • หากการนับพี่น้องทำได้ยาก ให้ใช้คุณลักษณะเฉพาะเป็นตัวบ่งชี้ โดยนำหน้าด้วยสัญลักษณ์ @
  • findElements ส่งคืน List ซึ่งรองรับการนับแถวในตารางแบบไดนามิก
  • Selenium ตัวระบุตำแหน่งสัมพัทธ์ 4 แบบ (ด้านบน ด้านล่าง ใกล้) ช่วยลดการพึ่งพา XPath แบบระบุตำแหน่ง
  • ฟังก์ชัน Inspect Element ใน DevTools ช่วยเร่งความเร็วในการสร้าง XPath สำหรับเซลล์ที่อยู่ลึกเข้าไปด้านใน
  • เครื่องมือ AI เช่น TestimMabl และ Healenium คือตัวระบุตำแหน่งแบบซ่อมแซมตัวเองสำหรับกริดที่เปลี่ยนแปลงไป

คำถามที่พบบ่อย

ตารางเว็บใน Selenium ตารางคือ WebElement ที่แสดงข้อมูลในรูปแบบตารางเป็นแถวและคอลัมน์ อาจเป็นแบบคงที่หรือแบบไดนามิก ผู้ทดสอบเข้าถึงเซลล์ของตารางผ่านเมธอดของ WebElement ร่วมกับ XPath หรือตัวระบุตำแหน่ง CSS เนื่องจากตารางมักไม่แสดง ID เฉพาะสำหรับแต่ละเซลล์

เซลล์ในตารางส่วนใหญ่ไม่มีแอตทริบิวต์ id หรือ name ดังนั้น By.id() และ By.name() จะใช้ไม่ได้ XPath จะสำรวจโครงสร้างแบบพ่อ-ลูกขององค์ประกอบ table, tbody, tr และ td ซึ่งทำให้เป็นตัวระบุตำแหน่งเซลล์ที่น่าเชื่อถือที่สุด

ใช้ driver.findElements(By.xpath(“//table[@id='tbl']//tr”)).size() เพื่อนับจำนวนแถว และ //table[@id='tbl']//tr[1]/td เพื่อนับจำนวนคอลัมน์ เมธอด findElements จะส่งคืนค่าเป็น List ซึ่งรองรับฟังก์ชัน size() สำหรับการคำนวณผลรวมแถวอย่างรวดเร็ว

Selenium 4. มีการแนะนำตัวระบุตำแหน่งสัมพัทธ์ เช่น above(), below(), toLeftOf(), toRightOf() และ near() ซึ่งช่วยในการกำหนดเป้าหมายเซลล์ที่อยู่รอบเซลล์หลักที่ทราบตำแหน่ง ซึ่งมีประโยชน์เมื่อดัชนี XPath เปลี่ยนแปลงในตารางแบบไดนามิก

วนลูปผ่านแถวต่างๆ ด้วย findElements จากนั้นอ่านค่าในแต่ละเซลล์ด้วย getText() สร้าง XPath แบบไดนามิกโดยใช้การต่อสตริง เช่น //tr[“+i+”]/td[“+j+”] รอให้ตารางโหลดเสร็จด้วย WebDriverWait ก่อนที่จะอ่านค่า

ใช่ เครื่องมือที่ขับเคลื่อนด้วย AI เช่น TestimMabl และ Functionize ใช้คอมพิวเตอร์วิชั่นและโมเดล DOM ในการตรวจจับขอบเขตของตาราง อนุมานส่วนหัว และแก้ไขตัวระบุตำแหน่งโดยอัตโนมัติเมื่อคอลัมน์เลื่อน ซึ่งช่วยลดการบำรุงรักษา XPath สำหรับแดชบอร์ดแบบไดนามิก

โมเดล AI เรียนรู้รูปแบบแถวจากการทำงานครั้งก่อนๆ และจับคู่เซลล์โดยใช้ความคล้ายคลึงของข้อความแทนที่จะใช้ดัชนีคงที่ เมื่อแถวเคลื่อนที่หรือคอลัมน์ถูกจัดเรียงใหม่ ตัวระบุตำแหน่ง AI ก็ยังคงค้นหาเป้าหมายได้โดยไม่ต้องเขียน XPath ใหม่

เมธอด findElement จะคืนค่า WebElement เพียงรายการเดียว และจะโยนข้อยกเว้น NoSuchElementException หากไม่พบ WebElement ส่วนเมธอด findElements จะคืนค่าเป็น List และส่งคืนรายการว่างหากไม่พบการจับคู่ ใช้ findElements เมื่อค้นหาping เหนือแถวหรือคอลัมน์ของตาราง

สรุปโพสต์นี้ด้วย: