找出网页中的无效链接有两个步骤:

1、查找出网页中所有的链接

2、迭代查找所有链接中无效的链接

在网页中,一般链接存在于img<img/>或者tags<a/>中,并且所有的链接都是 href 属性的

举例来说:<a href = "http://www.google.com">Google</a>,当我们点击Google文本的时候页面就会跳转到Google.com

 

Step1,我们要找出所有的链接,并且去掉链接为空的链接,我们需要用到driver.findElements()这个方法,具体的实现如下:

public static List<String> findAllLinks(WebDriver driver) {
    List<WebElement> elementList = new ArrayList<WebElement>() ;
    //找出标签名为a的链接
    elementList = driver.findElements(By.tagName("a")) ;
    //找出img中的链接
    elementList.addAll(driver.findElements(By.tagName("img"))) ;
    List<String> finalLists = new ArrayList<String>() ;
    //循环迭代去掉空的链接
    for(WebElement element : elementList) {
        String link = element.getAttribute("href") ;
        //因为我的网站上存在href为javascript的,所以这里也做了下过滤
        if(link!=null && link!="" && !link.contains("javascript")) {
            finalLists.add(link) ;
        }
    }
    return finalLists ;
}

Step2,需要用到java中的HttpURLConnection中的方法,对Step1返回的 finaLists 进行连接,根据response的结果可以确定链接是否能正确连上,虽然下面的代码简单了些,不过也差不多够用了:

public static String isLinkBroken(URL url) throws Exception {
    String response = "" ;
    HttpURLConnection connection = (HttpURLConnection) url.openConnection() ;
    try{
        connection.connect();
        response = connection.getResponseMessage() ;
        connection.disconnect();
        return response ;
    }catch(Exception e) {
        return e.getMessage() ;
    }
}

Step3,写一个测试类进行验证:

 1 package aaaa;
 2 
 3 import java.io.File;
 4 import java.io.FileWriter;
 5 import java.io.IOException;
 6 import java.net.HttpURLConnection;
 7 import java.net.URL;
 8 import java.util.ArrayList;
 9 import java.util.List;
10 
11 import org.openqa.selenium.By;
12 import org.openqa.selenium.WebDriver;
13 import org.openqa.selenium.WebElement;
14 import org.openqa.selenium.firefox.FirefoxDriver;
15 
16 class CheckLinks{
17     public static List<String> findAllLinks(WebDriver driver) {
18         List<WebElement> elementList = new ArrayList<WebElement>() ;
19         //找出标签名为a的链接
20         elementList = driver.findElements(By.tagName("a")) ;
21         //找出img中的链接
22         elementList.addAll(driver.findElements(By.tagName("img"))) ;
23         List<String> finalLists = new ArrayList<String>() ;
24         //循环迭代去掉空的链接
25         for(WebElement element : elementList) {
26             String link = element.getAttribute("href") ;
27             //因为我的网站上存在href为javascript的,所以这里也做了下过滤
28             if(link!=null && link!="" && !link.contains("javascript")) {
29                 finalLists.add(link) ;
30             }
31         }
32         return finalLists ;
33     }
34     
35     public static String isLinkBroken(URL url) throws Exception {
36         String response = "" ;
37         HttpURLConnection connection = (HttpURLConnection) url.openConnection() ;
38         try{
39             connection.connect();
40             response = connection.getResponseMessage() ;
41             connection.disconnect();
42             return response ;
43         }catch(Exception e) {
44             return e.getMessage() ;
45         }
46     }
47 }
48 
49 public class CheckBrokenLinks{
50     public static void main(String[] args) throws Exception {
51         FileWriter writer ;
52         FirefoxDriver ff = new FirefoxDriver() ;
53         ff.get("http://www.google.com");
54         List<String> allLinks = CheckLinks.findAllLinks(ff) ;
55         System.out.println("总的链接数量有:"+allLinks.size());
56         File file = new File("D://links.txt") ;
57         try {
58             writer = new FileWriter(file) ;
59             for(String link:allLinks) {
60                 //将链接写入到txt文件中
61                 writer.write(link+" **** returned ****"+CheckLinks.isLinkBroken(new URL(link)));
62                 writer.write("\r\n");
63                 //打印所有链接到控制台
64                 System.out.println(link);
65             }
66         } catch (IOException e) {
67             // TODO Auto-generated catch block
68             e.printStackTrace();
69         }
70         //关闭driver
71         ff.close() ;
72     }
73 }
CheckBrokenLinks

最后的结果显示如下:

控制台输出:

txt文本输出:

如果有不正确的地方,欢迎指教
感谢国外的一个作者LAKSHAY SHARMA的博客,hats off to him!