如何查找断开的链接 Selenium

⚡ 智能摘要

查找断开的链接 Selenium WebDriver 涉及收集每个锚标签,并向每个锚标签发送 HTTP HEAD 请求。 URL并读取响应代码。返回 400 或以上代码的链接会被标记为失效链接,而有效链接会返回 2xx 代码。

  • 🔗 定义: 失效链接是指 URL 无法访问,通常会返回 4xx 或 5xx 错误。
  • 🧭 为何重要: 死链接会损害用户体验和搜索引擎优化,因此自动化检查取代了缓慢的人工验证。
  • 📥 收集链接: 使用 findElements 和 By.tagName(“a”) 将页面上的每个锚元素收集到一个列表中。
  • 📡 发送 HEAD 请求: 打开一个HTTPURL连接后,将方法设置为 HEAD,并读取响应代码。 URL.
  • 验证状态: 将响应代码 400 或更高视为链接失效,将任何 2xx 代码视为链接有效。

如何查找断开的链接 Selenium

什么是失效链接?

失效链接是指链接或 URL这些网站无法访问。它们可能已关闭或由于服务器错误而无法正常运行。

A URL 状态码始终为 2xx,表示有效。HTTP 状态码种类繁多,用途各异。无效请求的状态码为 4xx 和 5xx。

4xx 类状态码主要表示客户端错误,5xx 类状态码主要表示服务器响应错误。

在我们点击并确认之前,我们很可能无法确认该链接是否有效。

为什么要检查断开的链接?

您应该始终确保网站上没有失效链接,因为用户不应该访问到错误页面。

如果规则未正确更新或所请求的资源不存在于服务器上,就会发生错误。

手动检查链接是一项繁琐的工作,因为每个网页可能有很多链接,而且必须对所有页面重复手动检查过程。

使用自动化脚本 Selenium 使流程自动化是一个更合适的解决方案。

如何检查损坏的链接和图片 Selenium

要检查断开的链接,您需要执行以下步骤。

  1. 根据标签收集网页中所有链接。
  2. 向该链接发送HTTP请求并读取HTTP响应代码。
  3. 根据HTTP响应代码判断链接是否有效或已失效。
  4. 对捕获的所有链接重复此操作。

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();

    }
}

解释断开链接的代码

步骤 1:导入包

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

import java.net.HttpURLConnection;

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

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

识别网页中的所有链接并将它们存储在列表中。

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

获取用于遍历列表的迭代器。

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

步骤三:识别和验证 URL

在本部分,我们将检查是否 URL 属于第三方域名,或者是否 URL 为空/null。

获取锚标签的 href 属性并将其存储在 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;
   }

第三步:发送HTTP请求

HTTPURLConnection 类具有发送 HTTP 请求和捕获 HTTP 响应代码的方法。因此,openConnection() 方法的输出(URLConnection) 被强制转换为 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 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 循环轻松处理。

常见问题

Selenium 收集所有锚标签,并向每个锚标签发送 HTTP HEAD 请求。 URL并将返回 400 或更高值的任何链接标记为已断开。

4xx 代码表示客户端问题,例如页面缺失;而 5xx 代码表示服务器在处理请求时发生故障。

是的。图像源是通过 `By.cssSelector()` 或 `By.xpath()` 获取的,然后是每个 src 属性。 URL 通过其HTTP响应代码进行验证。

是的。基于人工智能的爬虫会扫描页面、跟踪链接,并标记失效或重定向的链接。 URL无需手动编写脚本。

AI 会持续监测链路健康状况,预测故障,并建议更换链路,从而减少重复的人工链路审核。

总结一下这篇文章: