版权声明:本文为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原创文章,未经允许禁止转载。