Cách tìm các liên kết bị hỏng trong Selenium

⚡ Tóm tắt thông minh

Tìm các liên kết bị hỏng trong Selenium WebDriver bao gồm việc thu thập mọi thẻ neo (anchor tag), sau đó gửi yêu cầu HTTP HEAD đến từng thẻ. URLvà đọc mã phản hồi. Các liên kết trả về mã 400 trở lên được đánh dấu là bị hỏng, trong khi các liên kết hợp lệ trả về mã 2xx.

  • 🔗 Định nghĩa: Liên kết bị hỏng là URL Không thể truy cập được, thường trả về lỗi 4xx hoặc 5xx.
  • 🧭 Tại sao nó quan trọng: Các liên kết hỏng gây ảnh hưởng xấu đến trải nghiệm người dùng và SEO, vì vậy việc kiểm tra tự động thay thế cho việc xác minh thủ công chậm chạp.
  • 📥 Thu thập các liên kết: Sử dụng findElements với By.tagName(“a”) để tập hợp tất cả các phần tử liên kết trên trang vào một danh sách.
  • 📡 Gửi yêu cầu HEAD: Mở một HTTPURLKết nối, đặt phương thức là HEAD và đọc mã phản hồi theo URL.
  • Xác thực trạng thái: Hãy coi mã phản hồi từ 400 trở lên là liên kết bị lỗi và bất kỳ mã nào thuộc nhóm 2xx đều là liên kết hoạt động bình thường.

Cách tìm các liên kết bị hỏng trong Selenium

Liên kết bị hỏng là gì?

Các liên kết bị hỏng là các liên kết hoặc URLNhững trang web này không thể truy cập được. Chúng có thể đang gặp sự cố hoặc không hoạt động do lỗi máy chủ.

A URL Yêu cầu sẽ luôn có trạng thái 2xx, tức là hợp lệ. Có nhiều mã trạng thái HTTP khác nhau với các mục đích khác nhau. Đối với yêu cầu không hợp lệ, trạng thái HTTP là 4xx và 5xx.

Mã trạng thái 4xx chủ yếu dành cho lỗi phía máy khách, còn mã trạng thái 5xx chủ yếu dành cho lỗi phản hồi từ máy chủ.

Rất có thể chúng tôi sẽ không thể xác nhận xem liên kết đó có hoạt động hay không cho đến khi chúng tôi nhấp vào và xác nhận nó.

Tại sao bạn nên kiểm tra các liên kết bị hỏng?

Bạn luôn phải đảm bảo rằng không có liên kết hỏng nào trên trang web, vì người dùng không nên bị chuyển hướng đến trang báo lỗi.

Lỗi xảy ra nếu các quy tắc không được cập nhật chính xác hoặc tài nguyên được yêu cầu không tồn tại trên máy chủ.

Việc kiểm tra liên kết thủ công là một công việc tốn nhiều thời gian, vì mỗi trang web có thể có rất nhiều liên kết và quy trình thủ công phải được lặp đi lặp lại cho tất cả các trang.

Một kịch bản tự động hóa sử dụng Selenium điều đó sẽ tự động hóa quá trình là một giải pháp thích hợp hơn.

Cách kiểm tra các liên kết và hình ảnh bị hỏng trong Selenium

Để kiểm tra các liên kết bị hỏng, bạn sẽ cần thực hiện các bước sau.

  1. Thu thập tất cả các liên kết trong trang web dựa trên thẻ.
  2. Gửi yêu cầu HTTP cho liên kết và đọc mã phản hồi HTTP.
  3. Kiểm tra xem liên kết có hợp lệ hay bị lỗi dựa trên mã phản hồi HTTP.
  4. Lặp lại điều này cho tất cả các liên kết được ghi lại.

Code Tìm các liên kết bị hỏng trên một trang web

Dưới đây là mã trình điều khiển web kiểm tra trường hợp sử dụng của chúng tôi:

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();

    }
}

Giải thích mã của Liên kết bị hỏng

Bước 1: Nhập gói

Thêm gói sau vào danh sách các gói mặc định:

import java.net.HttpURLConnection;

Bằng cách sử dụng các phương thức trong gói này, chúng tôi có thể gửi yêu cầu HTTP và lấy mã phản hồi HTTP từ phản hồi.

Bước 2: Thu thập tất cả các liên kết trong trang web

Xác định tất cả các liên kết trong một trang web và lưu trữ chúng vào một Danh sách.

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

Lấy một Iterator để duyệt qua danh sách.

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

Bước 3: Xác định và kiểm chứng URL

Trong phần này, chúng ta sẽ kiểm tra xem liệu URL thuộc về tên miền của bên thứ ba hoặc liệu URL Trống/vô nghĩa.

Lấy thuộc tính href của thẻ neo và lưu trữ nó trong biến url.

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

Kiểm tra nếu URL là null hoặc rỗng và bỏ qua các bước còn lại nếu điều kiện được thỏa mãn.

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

Kiểm tra xem URL Thuộc về tên miền chính hoặc bên thứ ba. Bỏ qua các bước còn lại nếu nó thuộc về tên miền của bên thứ ba.

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

Bước 4: Gửi yêu cầu HTTP

HTTPURLLớp Connection có các phương thức để gửi yêu cầu HTTP và thu thập mã phản hồi HTTP. Vì vậy, đầu ra của phương thức openConnection() (URLKết nối) được ép kiểu thành HttpURLKết nối.

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

Chúng ta có thể đặt loại yêu cầu là “HEAD” thay vì “GET”, để chỉ trả về phần tiêu đề chứ không phải toàn bộ nội dung tài liệu.

huc.setRequestMethod("HEAD");

Khi gọi phương thức connect(), kết nối thực tế đến URL được thiết lập và yêu cầu được gửi đi.

huc.connect();

Bước 5: Xác thực liên kết

Sử dụng getResponseCode() phương thức này cho phép ta lấy mã phản hồi cho yêu cầu.

respCode = huc.getResponseCode();

Dựa trên mã phản hồi, chúng tôi sẽ cố gắng kiểm tra trạng thái kết nối.

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

Như vậy, chúng ta có thể lấy tất cả các liên kết từ một trang web và in ra thông tin các liên kết đó còn hợp lệ hay bị hỏng.

Cách nhận TẤT CẢ các liên kết của một trang web

Một trong những thủ tục phổ biến trong web Kiểm tra là để kiểm tra xem tất cả các liên kết có trong trang có hoạt động hay không. Điều này có thể được thực hiện một cách thuận tiện bằng cách sử dụng sự kết hợp của Java vòng lặp cho mỗi, tìmElements() & By.tagName(“a”) phương pháp.

Phương thức findElements() trả về một danh sách các phần tử Web có thẻ là a. Sử dụng vòng lặp for-each, từng phần tử được truy cập.

Nhận TẤT CẢ các liên kết của một trang web

Mã WebDriver bên dưới kiểm tra từng liên kết từ Mercury Trang chủ của chuyến tham quan để xác định những trang đang hoạt động và những trang vẫn đang được xây dựng.

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();
    }
}

Đầu ra phải tương tự như đầu ra được chỉ ra dưới đây.

  • Việc truy cập các liên kết hình ảnh được thực hiện bằng cách sử dụng các phương thức By.cssSelector() và By.xpath().

Nhận TẤT CẢ các liên kết của một trang web

Xử lý sự cố

Trong một trường hợp đặc biệt, liên kết đầu tiên được mã truy cập có thể là liên kết "Trang chủ". Trong trường hợp đó, hành động `driver.navigate.back()` sẽ hiển thị một trang trắng, vì hành động đầu tiên là mở trình duyệt. Trình điều khiển sẽ không thể tìm thấy tất cả các liên kết khác trong một trình duyệt trống. Do đó, IDE sẽ ném ra một ngoại lệ và phần còn lại của mã sẽ không được thực thi. Điều này có thể dễ dàng được xử lý bằng cách sử dụng vòng lặp `If`.

Câu Hỏi Thường Gặp

Selenium Thu thập tất cả các thẻ neo, gửi yêu cầu HTTP HEAD đến từng thẻ. URLvà đánh dấu bất kỳ liên kết nào trả về mã lỗi 400 trở lên là bị hỏng.

Mã 4xx cho biết sự cố ở phía máy khách, chẳng hạn như trang bị thiếu, trong khi mã 5xx cho biết lỗi ở phía máy chủ trong quá trình xử lý yêu cầu.

Đúng vậy. Các nguồn hình ảnh được thu thập bằng By.cssSelector() hoặc By.xpath(), và sau đó mỗi src được lấy từ mỗi nguồn. URL được xác thực thông qua mã phản hồi HTTP của nó.

Đúng vậy. Các trình thu thập dữ liệu dựa trên AI sẽ quét các trang, theo dõi các liên kết và đánh dấu các liên kết bị lỗi hoặc chuyển hướng. URLkhông cần lập trình thủ công.

Trí tuệ nhân tạo (AI) giám sát tình trạng liên kết theo thời gian, dự đoán các lỗi và đề xuất các liên kết thay thế, giảm thiểu việc kiểm tra liên kết thủ công lặp đi lặp lại.

Tóm tắt bài viết này với: