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

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

Liên kết bị hỏng là các liên kết hoặc URL không thể truy cập được. Chúng có thể ngừng hoạt động hoặc không hoạt động do một số lỗi máy chủ

Một URL sẽ luôn có trạng thái 2xx hợp lệ. Có các mã trạng thái HTTP khác nhau 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.

Loại mã trạng thái 4xx chủ yếu dành cho lỗi phía máy khách và loại mã trạng thái 5xx chủ yếu dành cho lỗi phản hồi của 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 phải luôn đảm bảo rằng không có liên kết bị hỏng trên trang web vì người dùng sẽ không truy cập vào trang 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ủ.

Kiểm tra liên kết theo cách thủ công là một công việc tẻ nhạt vì mỗi trang web có thể có số lượng lớn liên kết và quy trình thủ công phải được lặp lại cho tất cả các trang.

Tập lệnh 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. Tìm hiểu xem liên kết có hợp lệ hay bị hỏng 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.

Mã để 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

Nhập gói bên dưới ngoài 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 trong Danh sách.

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

Lấy Iterator để duyệt qua Danh sách.

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

Bước 3: Xác định và xác thực URL

Trong phần này, chúng tôi sẽ kiểm tra xem URL có thuộc miền của bên thứ ba hay không hoặc liệu URL có trống/null hay không.

Nhận href của thẻ neo và lưu trữ nó trong biến url.

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

Kiểm tra xem URL có rỗng hay trống khô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ề miền chính hay bên thứ ba. Bỏ qua các bước còn lại nếu nó thuộc về 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

Lớp HttpURLConnection 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() (URLConnection) được truyền vào HttpURLConnection.

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

Chúng ta có thể đặt loại Yêu cầu là “HEAD” thay vì “GET”. Vì vậy, chỉ có tiêu đề được trả về chứ không phải 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ế tới 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 phương thức getResponseCode() chúng ta có thể nhận được 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 liên kết.

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

Vì vậy, chúng tôi có thể lấy tất cả các liên kết từ trang web và in xem các liên kết có hợp lệ hay bị hỏng hay không.

Hy vọng hướng dẫn này sẽ giúp bạn kiểm tra các liên kết bị hỏng bằng selen.

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ề danh sách các Thành phần Web có thẻ a. Bằng cách sử dụng vòng lặp for-each, mỗi phần tử sẽ đượ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á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 riêng lẻ, 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 như vậy, 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 trình duyệt trống. Vì vậy IDE sẽ đưa ra một ngoại lệ và phần còn lại của mã sẽ không thực thi. Điều này có thể được xử lý dễ dàng bằng cách sử dụng vòng lặp If.

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