Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Selenium获取网站中的所有链接_Selenium_Selenium Chromedriver - Fatal编程技术网

使用Selenium获取网站中的所有链接

使用Selenium获取网站中的所有链接,selenium,selenium-chromedriver,Selenium,Selenium Chromedriver,我想获取网站中的所有链接,然后单击每个链接。基本上我想检查一下,如果该网站有任何断开的链接或没有 我想的一种方法是在主地图中添加所有链接,以键作为文本,并继续在地图中添加,直到添加菜单项页面中的所有链接,然后在地图上迭代并单击每个链接 但我知道这不是最好的解决方案,因为我们仍然可能错过一些链接 有人有其他更好的解决方法吗?您可以使用以下方法验证链接是否断开 try { List<WebElement> anchorTagsList = driver.findE

我想获取网站中的所有链接,然后单击每个链接。基本上我想检查一下,如果该网站有任何断开的链接或没有

我想的一种方法是在主地图中添加所有链接,以键作为文本,并继续在地图中添加,直到添加菜单项页面中的所有链接,然后在地图上迭代并单击每个链接

但我知道这不是最好的解决方案,因为我们仍然可能错过一些链接


有人有其他更好的解决方法吗?

您可以使用以下方法验证链接是否断开

try {
            List<WebElement> anchorTagsList = driver.findElements(By.tagName("a"));
            System.out.println("Total no. of links are " + anchorTagsList.size());
            for (WebElement anchorTagElement : anchorTagsList) {
                if (anchorTagElement != null) {
                    verifyURLStatus(anchorTagElement.getAttribute("href"));
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
        }
    }

    public static List<String> verifyURLStatus(String URL) throws Exception {
        List<String> invalidURL = new ArrayList<String>();
        try {
            URL url = new URL(URL);
            HttpURLConnection httpURLConnect = (HttpURLConnection) url.openConnection();
            httpURLConnect.setConnectTimeout(3000);
            httpURLConnect.connect();
            if (httpURLConnect.getResponseCode() == 200) {
                System.out.println("Valid URL " + URL);
            } else {
                invalidURL.add(URL);
                System.out.println("In Valid URL " + URL);
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new Exception("Failed to validate broken link");
        }
        return invalidURL;
    }
试试看{
List anchorTagsList=driver.findElements(按.tagName(“a”));
System.out.println(“链接总数为”+anchorTagsList.size());
for(WebElement AnchortageElement:anchorTagsList){
如果(AnchortageElement!=null){
verifyURLStatus(AnchortageElement.getAttribute(“href”);
}
}
}捕获(例外e){
e、 printStackTrace();
System.out.println(e.getMessage());
}
}
公共静态列表verifyURLStatus(字符串URL)引发异常{
List invalidURL=new ArrayList();
试一试{
URL=新URL(URL);
HttpURLConnection httpURLConnect=(HttpURLConnection)url.openConnection();
httpURLConnect.setConnectTimeout(3000);
httpURLConnect.connect();
如果(httpURLConnect.getResponseCode()==200){
System.out.println(“有效URL”+URL);
}否则{
invalidURL.add(URL);
System.out.println(“在有效URL中”+URL);
}
}捕获(例外e){
e、 printStackTrace();
抛出新异常(“未能验证断开的链接”);
}
返回invalidURL;
}

Pradeep的答案对于验证链接很有用,但您似乎首先在问如何获取链接

List<WebElement> allLinks = driver.findElements(By.xpath("//a"));

我的示例忽略了返回的无效URL的列表数组,但您明白了。

您可以使用Selenium访问网站。查找所有链接。逐个单击它。单击时尝试/Catch
TimeoutException
。要验证页面中的断开链接,它不需要单击您获取的链接。获取网页中的所有链接后——检查HTTP状态代码是否为200。如果是200个链接,它们都是功能性的,并且没有中断。是的,如果我想检查URL的状态,这一个很好,但是如何使用selenium获取网站中的所有URL?@NJin,这有帮助吗?它在某种程度上有帮助,特别是用于检查状态的代码,但我无法获取网站中的所有URL。@NJin,你检查过我更新的代码吗?我能够得到所有的网址在网站与上述代码。是的,我能够得到所有的网址在网页给定的,但我想得到每个网页内的所有网址,但也希望唯一的网址。我在一个页面上存在一个url,在另一个页面上存在相同的url,我只想保留一个副本。
for(WebElement link : allLinks)
    verifyURLStatus(link.getAttribute("href"));