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

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

ลิงค์เสียคือลิงค์หรือ URL ที่ไม่สามารถเข้าถึงได้ อาจหยุดทำงานหรือไม่ทำงานเนื่องจากข้อผิดพลาดของเซิร์ฟเวอร์

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

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

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

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

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

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

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

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

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

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

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

รหัสเพื่อค้นหาลิงค์ที่ใช้งานไม่ได้บนหน้าเว็บ

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

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 เพื่อสำรวจผ่านรายการ

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

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

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

รับแท็ก href ของสมอและเก็บไว้ในตัวแปร url

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

ตรวจสอบว่า URL เป็นโมฆะหรือว่างเปล่า และข้ามขั้นตอนที่เหลือหากตรงตามเงื่อนไข

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

คลาส HttpURLConnection มีวิธีการในการส่งคำขอ HTTP และบันทึกรหัสตอบกลับ HTTP ดังนั้นเอาต์พุตของเมธอด openConnection() (URLConnection) จะถูกพิมพ์ไปที่ HttpURLConnection

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() ส่งคืนรายการองค์ประกอบเว็บที่มีแท็ก a การใช้ for-each loop จะทำให้เข้าถึงแต่ละองค์ประกอบได้

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

รหัส 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 loop