版权声明:本文为AutotestOps原创文章,未经允许禁止转载。
咱们轻松一下,我们做个有意思的问题。给你一个页面如何快速的找出所有的死链接。
咱们的AutotestOps 提供的Selenium系列课程经常会让大家做些有意思的事情,这个属于课间甜点的一种。
我问过我的团队,如何快速解决这个问题,好多人回答说我们有现成的工具可以扫啊,我说如果作为一个练习让你用已学到的Selenium知识自己来快速的解决这个问题呢? 好多人开始蒙圈了。
SuperXi教你一种快速的解决办法。所谓死链接就是不是正常响应的链接,咱们正常响应的链接,http状态码应该返回200,那么我们应考虑如何快速的找到http状态码不是200的页面呢?
我们先写个工具类,它只有一个方法,作用是给定一个url,返回这个url对应的http状态码。
public class HTTPUtil {
public static int getResponseCodeByUrl(String strUrl) {
URL url;
HttpURLConnection httpURLConnection = null;
Integer responsecode = 0;
try {
url = new URL(strUrl);
httpURLConnection = (HttpURLConnection) url.openConnection();
responsecode = httpURLConnection.getResponseCode();
} catch (Exception e) {
} finally {
if (null != httpURLConnection)
httpURLConnection.disconnect();
}
return responsecode;
}
}
下面让我们见证奇迹的时刻,几行代码来快速搞定这个问题。
Map<Boolean, List<String>> map= driver.findElements(By.xpath("//*[@href]"))
//首先要找到当前页面的所有链接
.stream()
.map(element -> element.getAttribute("href")) // 获取href属性的值,该值即为链接的url
.map(String::trim) //去处两边的空格
.distinct() //过滤掉重复的链接 unique
.collect(Collectors.partitioningBy(url -> HTTPUtil.getResponseCodeByUrl(url) == 200));
下面我们打印出所有死链接
map.get(false)
.stream()
.forEach(System.out::println);
怎么样?是不是既简洁又高效?不过这里需要注意的是,http状态码不为200的还可能是3XX重定向的链接,这种链接不属于bug,我们 现在换个需求,比如我想得到给定任意的HTTP状态码的所有链接,比如我需要你打印出状态码为301的所有链接,或者我让你打印出状 态码为200的所有链接,该如何改写我们的代码呢?这个作为练习给大家吧。
是不是很有趣?我们AutoTestOps精品课程不光有深度,范围广,而且更有趣味性和游戏性,不知不觉已经练就了很深厚的基础。有兴 趣的同学赶紧联系我们的课程顾问吧。
Happy Auto Testing
SuperXi
版权声明:本文为AutotestOps原创文章,未经允许禁止转载。