วิธีค้นหาลิงค์ที่ใช้งานไม่ได้ใน Selenium

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

การค้นหาลิงก์เสียใน Selenium WebDriver เกี่ยวข้องกับการรวบรวมแท็ก anchor ทุกแท็ก และส่งคำขอ HTTP HEAD ไปยังแต่ละแท็ก URLและอ่านรหัสการตอบกลับ ลิงก์ที่ส่งคืนรหัส 400 หรือสูงกว่าจะถูกระบุว่าเสีย ในขณะที่ลิงก์ที่ถูกต้องจะส่งคืนรหัส 2xx

  • 🔗 ความหมาย: ลิงก์เสียคือ URL ซึ่งไม่สามารถเข้าถึงได้ โดยปกติจะแสดงข้อผิดพลาด 4xx หรือ 5xx
  • 🧭 ทำไมมันเรื่อง: ลิงก์เสียส่งผลเสียต่อประสบการณ์ผู้ใช้และ SEO ดังนั้นการตรวจสอบอัตโนมัติจึงเข้ามาแทนที่การตรวจสอบด้วยตนเองที่ช้ากว่า
  • 📥 รวบรวมลิงก์: ใช้ findElements ร่วมกับ By.tagName(“a”) เพื่อรวบรวมองค์ประกอบ anchor ทุกตัวบนหน้าเว็บลงในรายการ
  • 📡 ส่งคำขอ HEAD: เปิด HttpURLเมื่อเชื่อมต่อแล้ว ให้ตั้งค่าวิธีการเป็น HEAD และอ่านรหัสการตอบกลับตามแต่ละครั้ง URL.
  • สถานะการตรวจสอบ: หากรหัสตอบกลับ 400 ขึ้นไป ถือว่าลิงก์เสีย และหากรหัส 2xx ขึ้นไป ถือว่าลิงก์ใช้งานได้

วิธีค้นหาลิงค์ที่ใช้งานไม่ได้ใน Selenium

ลิงค์เสียคืออะไร?

ลิงก์เสียคือลิงก์หรือ URLเว็บไซต์ที่ไม่สามารถเข้าถึงได้ อาจเป็นเพราะเซิร์ฟเวอร์ปิดตัวลงหรือใช้งานไม่ได้เนื่องจากข้อผิดพลาดของเซิร์ฟเวอร์

A URL สถานะการร้องขอที่ถูกต้องมักจะเป็น 2xx เสมอ รหัสสถานะ HTTP ต่างๆ มีวัตถุประสงค์ที่แตกต่างกัน สำหรับการร้องขอที่ไม่ถูกต้อง สถานะ HTTP จะเป็น 4xx และ 5xx

รหัสสถานะประเภท 4xx ส่วนใหญ่ใช้สำหรับข้อผิดพลาดฝั่งไคลเอ็นต์ และรหัสสถานะประเภท 5xx ส่วนใหญ่ใช้สำหรับข้อผิดพลาดในการตอบสนองของเซิร์ฟเวอร์

เรามักจะไม่สามารถยืนยันได้ว่าลิงก์นั้นใช้งานได้หรือไม่จนกว่าเราจะคลิกและยืนยัน

เหตุใดคุณจึงควรตรวจสอบลิงก์ที่ใช้งานไม่ได้

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

ข้อผิดพลาดเกิดขึ้นหากกฎไม่ได้รับการอัปเดตอย่างถูกต้อง หรือทรัพยากรที่ร้องขอไม่มีอยู่ที่เซิร์ฟเวอร์

การตรวจสอบลิงก์ด้วยตนเองเป็นงานที่น่าเบื่อ เพราะแต่ละหน้าเว็บอาจมีลิงก์จำนวนมาก และต้องทำซ้ำกระบวนการนี้กับทุกหน้า

สคริปต์อัตโนมัติที่ใช้ Selenium ซึ่งจะทำให้กระบวนการเป็นอัตโนมัติเป็นวิธีแก้ปัญหาที่เหมาะสมกว่า

วิธีตรวจสอบลิงค์เสียและรูปภาพใน Selenium

เพื่อตรวจสอบลิงก์ที่เสียหายคุณจะต้องดำเนินการตามขั้นตอนต่อไปนี้

  1. รวบรวมลิงก์ทั้งหมดในหน้าเว็บโดยใช้ แท็ก ที่กำหนด
  2. ส่งคำขอ HTTP ไปยังลิงก์และอ่านรหัสตอบกลับ HTTP
  3. ตรวจสอบว่าลิงก์นั้นใช้งานได้หรือเสียโดยพิจารณาจากรหัสการตอบสนอง HTTP
  4. ทำซ้ำขั้นตอนนี้กับลิงก์ทั้งหมดที่บันทึกไว้

Code เพื่อค้นหาลิงก์เสียบนหน้าเว็บ

ด้านล่างนี้คือโค้ดไดรเวอร์เว็บซึ่งจะทดสอบกรณีการใช้งานของเรา:

package automationPractice;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;
import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class BrokenLinks {

    private static WebDriver driver = null;

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        String homePage = "http://www.zlti.com";
        String url = "";
        HttpURLConnection huc = null;
        int respCode = 200;

        driver = new ChromeDriver();

        driver.manage().window().maximize();

        driver.get(homePage);

        List<WebElement> links = driver.findElements(By.tagName("a"));

        Iterator<WebElement> it = links.iterator();

        while(it.hasNext()){

            url = it.next().getAttribute("href");

            System.out.println(url);

            if(url == null || url.isEmpty()){
                System.out.println("URL is either not configured for anchor tag or it is empty");
                continue;
            }

            if(!url.startsWith(homePage)){
                System.out.println("URL belongs to another domain, skipping it.");
                continue;
            }

            try {
                huc = (HttpURLConnection)(new URL(url).openConnection());

                huc.setRequestMethod("HEAD");

                huc.connect();

                respCode = huc.getResponseCode();

                if(respCode >= 400){
                    System.out.println(url+" is a broken link");
                }
                else{
                    System.out.println(url+" is a valid link");
                }

            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        driver.quit();

    }
}

อธิบายโค้ดของ Broken Links

ขั้นตอนที่ 1: นำเข้าแพ็คเกจ

นำเข้าแพ็กเกจต่อไปนี้เพิ่มเติมจากแพ็กเกจเริ่มต้น:

import java.net.HttpURLConnection;

เมื่อใช้วิธีการในแพ็คเกจนี้ เราสามารถส่งคำขอ HTTP และจับรหัสตอบกลับ HTTP จากการตอบกลับได้

ขั้นตอนที่ 2: รวบรวมลิงก์ทั้งหมดในหน้าเว็บ

ระบุลิงก์ทั้งหมดในหน้าเว็บและจัดเก็บไว้ในรายการ

List<WebElement> links = driver.findElements(By.tagName("a"));

รับ Iterator เพื่อใช้ในการวนลูปผ่าน List

Iterator<WebElement> it = links.iterator();

ขั้นตอนที่ 3: การระบุและการตรวจสอบความถูกต้อง URL

ในส่วนนี้ เราจะตรวจสอบว่า URL เป็นโดเมนของบุคคลที่สามหรือไม่ หรือว่า URL ว่างเปล่า/ค่าว่าง

ดึงค่า href ของแท็ก anchor แล้วเก็บไว้ในตัวแปร url

url = it.next().getAttribute("href");

ตรวจสอบว่า URL หากค่าเป็น null หรือว่างเปล่า ให้ข้ามขั้นตอนที่เหลือหากตรงตามเงื่อนไข

if(url == null || url.isEmpty()){
              System.out.println("URL is either not configured for anchor tag or it is empty");
              continue;
     }

ตรวจสอบว่าไฟล์ URL เป็นของโดเมนหลักหรือโดเมนของบุคคลที่สาม หากเป็นของโดเมนของบุคคลที่สาม ให้ข้ามขั้นตอนที่เหลือ

 if(!url.startsWith(homePage)){
           System.out.println("URL belongs to another domain, skipping it.");
           continue;
   }

ขั้นตอนที่ 4: ส่งคำขอ HTTP

ลิงก์URLคลาส Connection มีเมธอดสำหรับส่งคำขอ HTTP และรับรหัสตอบกลับ HTTP ดังนั้น ผลลัพธ์ของเมธอด openConnection() (URLการเชื่อมต่อ (Connection) จะถูกแปลงประเภทเป็น HttpURLการเชื่อมต่อ

huc = (HttpURLConnection)(new URL(url).openConnection());

เราสามารถตั้งค่าประเภทคำขอเป็น “HEAD” แทน “GET” เพื่อให้ระบบส่งคืนเฉพาะส่วนหัวของคำขอเท่านั้น ไม่ใช่ส่วนเนื้อหาของเอกสาร

huc.setRequestMethod("HEAD");

เมื่อเรียกใช้เมธอด connect() ระบบจะสร้างการเชื่อมต่อกับ URL และส่งคำขอไป

huc.connect();

ขั้นตอนที่ 5: ตรวจสอบความถูกต้องของลิงก์

การใช้ getResponseCodeเมธอด () เราสามารถรับรหัสตอบกลับสำหรับคำขอได้

respCode = huc.getResponseCode();

เราจะตรวจสอบสถานะการเชื่อมต่อโดยพิจารณาจากรหัสตอบกลับ

if(respCode >= 400){
        System.out.println(url+" is a broken link");
}
else{
        System.out.println(url+" is a valid link");
}

ดังนั้น เราจึงสามารถดึงลิงก์ทั้งหมดจากหน้าเว็บและพิมพ์ออกมาได้ว่าลิงก์เหล่านั้นใช้งานได้หรือเสีย

วิธีรับลิงค์ทั้งหมดของเว็บเพจ

หนึ่งในขั้นตอนทั่วไปในเว็บ การทดสอบ คือการทดสอบว่าลิงก์ทั้งหมดที่อยู่ในหน้าใช้งานได้หรือไม่ ซึ่งสามารถทำได้สะดวกโดยใช้การผสมผสานของ Java สำหรับแต่ละวง, ค้นหาองค์ประกอบ() & By.tagName("ก") วิธี

เมธอด findElements() จะส่งคืนรายการของ Web Element ที่มีแท็ก a โดยใช้ลูป for-each ในการเข้าถึงแต่ละ Element

รับลิงค์ทั้งหมดของเว็บเพจ

รหัส WebDriver ด้านล่างจะตรวจสอบแต่ละลิงก์จาก Mercury หน้าแรกของทัวร์เพื่อพิจารณาว่าที่กำลังทำงานอยู่และที่ยังอยู่ระหว่างการก่อสร้าง

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.*;

public class P1 {

    public static void main(String[] args) {
        String baseUrl = "https://demo.guru99.com/test/newtours/";
        System.setProperty("webdriver.chrome.driver", "G:\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();

        String underConsTitle = "Under Construction: Mercury Tours";
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

        driver.get(baseUrl);
        List<WebElement> linkElements = driver.findElements(By.tagName("a"));
        String[] linkTexts = new String[linkElements.size()];
        int i = 0;

        //extract the link texts of each link element
        for (WebElement e : linkElements) {
            linkTexts[i] = e.getText();
            i++;
        }

        //test each link
        for (String t : linkTexts) {
            driver.findElement(By.linkText(t)).click();
            if (driver.getTitle().equals(underConsTitle)) {
                System.out.println("\"" + t + "\""
                        + " is under construction.");
            } else {
                System.out.println("\"" + t + "\""
                        + " is working.");
            }
            driver.navigate().back();
        }
        driver.quit();
    }
}

ผลลัพธ์ควรคล้ายกับผลลัพธ์ที่ระบุด้านล่าง

  • การเข้าถึงลิงก์รูปภาพทำได้โดยใช้วิธี By.cssSelector() และ By.xpath()

รับลิงค์ทั้งหมดของเว็บเพจ

การแก้ไขปัญหา

ในกรณีพิเศษ ลิงก์แรกที่โค้ดเข้าถึงอาจเป็นลิงก์ "หน้าแรก" ในกรณีเช่นนี้ การกระทำ driver.navigate.back() จะแสดงหน้าว่างเปล่า เนื่องจากแอ็กชันแรกเป็นการเปิดเบราว์เซอร์ ไดรเวอร์จะไม่สามารถค้นหาลิงก์อื่นๆ ทั้งหมดในเบราว์เซอร์ที่ว่างเปล่าได้ ดังนั้น IDE จะแสดงข้อผิดพลาดและโค้ดส่วนที่เหลือจะไม่ทำงาน ซึ่งสามารถจัดการได้ง่ายๆ โดยใช้ลูป If

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

Selenium รวบรวมแท็กแองเคอร์ทั้งหมด แล้วส่งคำขอ HTTP HEAD ไปยังแต่ละแท็ก URLและจะทำเครื่องหมายลิงก์ใดๆ ที่ส่งคืนค่า 400 หรือสูงกว่าว่าเป็นลิงก์เสีย

รหัส 4xx บ่งชี้ถึงปัญหาฝั่งไคลเอ็นต์ เช่น หน้าเว็บหายไป ในขณะที่รหัส 5xx บ่งชี้ถึงความล้มเหลวฝั่งเซิร์ฟเวอร์ขณะประมวลผลคำขอ

ใช่แล้ว แหล่งที่มาของรูปภาพจะถูกรวบรวมโดยใช้ By.cssSelector() หรือ By.xpath() จากนั้นจึงระบุ src แต่ละรายการ URL ตรวจสอบความถูกต้องผ่านรหัสตอบสนอง HTTP

ใช่แล้ว โปรแกรมรวบรวมข้อมูลที่ใช้ AI จะสแกนหน้าเว็บ ติดตามลิงก์ และแจ้งเตือนเมื่อลิงก์เสียหรือมีการเปลี่ยนเส้นทาง URLโดยไม่ต้องเขียนสคริปต์ด้วยตนเอง

AI จะตรวจสอบสถานะของลิงก์อย่างต่อเนื่อง คาดการณ์ความล้มเหลว และแนะนำชิ้นส่วนที่ต้องเปลี่ยน ซึ่งช่วยลดการตรวจสอบลิงก์ด้วยตนเองซ้ำๆ

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