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

ลิงค์เสียคืออะไร?
ลิงก์เสียคือลิงก์หรือ URLเว็บไซต์ที่ไม่สามารถเข้าถึงได้ อาจเป็นเพราะเซิร์ฟเวอร์ปิดตัวลงหรือใช้งานไม่ได้เนื่องจากข้อผิดพลาดของเซิร์ฟเวอร์
A URL สถานะการร้องขอที่ถูกต้องมักจะเป็น 2xx เสมอ รหัสสถานะ HTTP ต่างๆ มีวัตถุประสงค์ที่แตกต่างกัน สำหรับการร้องขอที่ไม่ถูกต้อง สถานะ HTTP จะเป็น 4xx และ 5xx
รหัสสถานะประเภท 4xx ส่วนใหญ่ใช้สำหรับข้อผิดพลาดฝั่งไคลเอ็นต์ และรหัสสถานะประเภท 5xx ส่วนใหญ่ใช้สำหรับข้อผิดพลาดในการตอบสนองของเซิร์ฟเวอร์
เรามักจะไม่สามารถยืนยันได้ว่าลิงก์นั้นใช้งานได้หรือไม่จนกว่าเราจะคลิกและยืนยัน
เหตุใดคุณจึงควรตรวจสอบลิงก์ที่ใช้งานไม่ได้
คุณควรตรวจสอบให้แน่ใจเสมอว่าไม่มีลิงก์เสียบนเว็บไซต์ เพราะผู้ใช้ไม่ควรไปเจอหน้าแสดงข้อผิดพลาด
ข้อผิดพลาดเกิดขึ้นหากกฎไม่ได้รับการอัปเดตอย่างถูกต้อง หรือทรัพยากรที่ร้องขอไม่มีอยู่ที่เซิร์ฟเวอร์
การตรวจสอบลิงก์ด้วยตนเองเป็นงานที่น่าเบื่อ เพราะแต่ละหน้าเว็บอาจมีลิงก์จำนวนมาก และต้องทำซ้ำกระบวนการนี้กับทุกหน้า
สคริปต์อัตโนมัติที่ใช้ Selenium ซึ่งจะทำให้กระบวนการเป็นอัตโนมัติเป็นวิธีแก้ปัญหาที่เหมาะสมกว่า
วิธีตรวจสอบลิงค์เสียและรูปภาพใน Selenium
เพื่อตรวจสอบลิงก์ที่เสียหายคุณจะต้องดำเนินการตามขั้นตอนต่อไปนี้
- รวบรวมลิงก์ทั้งหมดในหน้าเว็บโดยใช้ แท็ก ที่กำหนด
- ส่งคำขอ HTTP ไปยังลิงก์และอ่านรหัสตอบกลับ HTTP
- ตรวจสอบว่าลิงก์นั้นใช้งานได้หรือเสียโดยพิจารณาจากรหัสการตอบสนอง HTTP
- ทำซ้ำขั้นตอนนี้กับลิงก์ทั้งหมดที่บันทึกไว้
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


.png)