找出网页中的无效链接有两个步骤:
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 }
最后的结果显示如下:
控制台输出:
txt文本输出:
如果有不正确的地方,欢迎指教
感谢国外的一个作者LAKSHAY SHARMA的博客,hats off to him!
不要怨天尤人,很多时候只是你不够努力,一味地沉浸在自己的世界里,做着美好的梦。
浙公网安备 33010602011771号