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