如何查找断开的链接 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();

    }
}

解释断开链接的代码

步骤 1:导入包

除了默认包之外,还导入以下包:

import java.net.HttpURLConnection;

使用此包中的方法,我们可以发送 HTTP 请求并从响应中捕获 HTTP 响应代码。

第 2 步:收集网页中的所有链接

识别网页中的所有链接并将其存储在 List 中。

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

因此,我们可以从网页获取所有链接并打印链接是否有效或损坏。

希望本教程能帮助您使用 selenium 检查断开的链接。

如何获取网页的所有链接

网络中常见的程序之一 测试 是测试页面中所有链接是否正常工作。这可以方便地使用 Java for-each 循环, 查找元素() & 通过.tagName(“a”) 方法。

findElements() 方法返回带有标签 a 的 Web 元素列表。使用 for-each 循环访问每个元素。

获取网页的所有链接

下面的 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 循环轻松处理。