Как найти неработающие ссылки в Selenium

⚡ Умное резюме

Поиск неработающих ссылок в Selenium WebDriver собирает все теги <a> и отправляет HTTP HEAD-запрос каждому из них. URLи считывая код ответа. Ссылки, возвращающие код 400 или выше, помечаются как неработающие, в то время как действительные ссылки возвращают коды 2xx.

  • 🔗 Определение: Неработающая ссылка — это URL до которого невозможно дотянуться, обычно возвращая ошибку 4xx или 5xx.
  • 🧭 Почему это важно: Неработающие ссылки ухудшают пользовательский опыт и SEO, поэтому автоматизированные проверки заменяют медленную ручную верификацию.
  • 📥 Собирайте ссылки: Используйте findElements с By.tagName(“a”), чтобы собрать все элементы привязки на странице в список.
  • 📡 Отправить HEAD-запрос: Откройте HTTP-запросURLУстановите соединение, выберите метод HEAD и считайте код ответа для каждого соединения. URL.
  • Проверить статус: Код ответа 400 или выше следует рассматривать как неработающий, а любой код 2xx — как работающую ссылку.

Как найти неработающие ссылки в Selenium

Что такое битые ссылки?

Битые ссылки — это ссылки или URLНедоступны. Возможно, они не работают или неисправны из-за ошибки сервера.

A URL Всегда будет иметь статус 2xx, что означает допустимость запроса. Существуют разные коды состояния HTTP, которые имеют разное назначение. Для недопустимого запроса статус HTTP равен 4xx и 5xx.

Коды состояния класса 4xx в основном относятся к ошибкам на стороне клиента, а коды состояния класса 5xx — к ошибкам ответа сервера.

Скорее всего, мы не сможем подтвердить, работает ли эта ссылка или нет, пока мы не нажмем и не подтвердим ее.

Почему вам следует проверять неработающие ссылки?

Всегда следует проверять наличие неработающих ссылок на сайте, поскольку пользователь не должен попадать на страницу с ошибкой.

Ошибка возникает, если правила не обновлены правильно или запрошенные ресурсы отсутствуют на сервере.

Ручная проверка ссылок — утомительная задача, поскольку каждая веб-страница может содержать большое количество ссылок, и ручной процесс приходится повторять для всех страниц.

Скрипт автоматизации, использующий Selenium то, что позволит автоматизировать процесс, является более подходящим решением.

Как проверить неработающие ссылки и изображения в Selenium

Для проверки неработающих ссылок вам необходимо будет выполнить следующие шаги.

  1. Соберите все ссылки на веб-странице на основе тега.
  2. Отправьте HTTP-запрос для получения ссылки и считайте код HTTP-ответа.
  3. Определите, является ли ссылка действительной или неработающей, на основе кода ответа HTTP.
  4. Повторите это для всех захваченных ссылок.

Code Найти неработающие ссылки на веб-странице

Ниже приведен код веб-драйвера, который проверяет наш вариант использования:

package automationPractice;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;
import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class BrokenLinks {

    private static WebDriver driver = null;

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        String homePage = "http://www.zlti.com";
        String url = "";
        HttpURLConnection huc = null;
        int respCode = 200;

        driver = new ChromeDriver();

        driver.manage().window().maximize();

        driver.get(homePage);

        List<WebElement> links = driver.findElements(By.tagName("a"));

        Iterator<WebElement> it = links.iterator();

        while(it.hasNext()){

            url = it.next().getAttribute("href");

            System.out.println(url);

            if(url == null || url.isEmpty()){
                System.out.println("URL is either not configured for anchor tag or it is empty");
                continue;
            }

            if(!url.startsWith(homePage)){
                System.out.println("URL belongs to another domain, skipping it.");
                continue;
            }

            try {
                huc = (HttpURLConnection)(new URL(url).openConnection());

                huc.setRequestMethod("HEAD");

                huc.connect();

                respCode = huc.getResponseCode();

                if(respCode >= 400){
                    System.out.println(url+" is a broken link");
                }
                else{
                    System.out.println(url+" is a valid link");
                }

            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        driver.quit();

    }
}

Объяснение кода неработающих ссылок

Шаг 1: Импортируйте пакеты

В дополнение к пакетам, установленным по умолчанию, импортируйте следующий пакет:

import java.net.HttpURLConnection;

Используя методы этого пакета, мы можем отправлять HTTP-запросы и захватывать коды HTTP-ответов из ответа.

Шаг 2. Соберите все ссылки на веб-странице.

Определите все ссылки на веб-странице и сохраните их в списке.

List<WebElement> links = driver.findElements(By.tagName("a"));

Получите итератор для обхода списка.

Iterator<WebElement> it = links.iterator();

Шаг 3: Идентификация и проверка URL

В этой части мы проверим, если URL принадлежит домену третьей стороны или же URL пуст/нулевой.

Получите атрибут href тега <a> и сохраните его в переменной url.

url = it.next().getAttribute("href");

Проверьте, URL Если условие выполнено, оно равно null или пустое, и если оно выполнено, пропустить оставшиеся шаги.

if(url == null || url.isEmpty()){
              System.out.println("URL is either not configured for anchor tag or it is empty");
              continue;
     }

Проверьте, URL Принадлежит к основному домену или домену третьей стороны. Если домен принадлежит третьей стороне, пропустите оставшиеся шаги.

 if(!url.startsWith(homePage)){
           System.out.println("URL belongs to another domain, skipping it.");
           continue;
   }

Шаг 4. Отправьте HTTP-запрос

HttpURLКласс Connection содержит методы для отправки HTTP-запроса и захвата кода HTTP-ответа. Таким образом, результат выполнения метода openConnection() (URLТип соединения преобразуется в тип HTTP.URLПодключение.

huc = (HttpURLConnection)(new URL(url).openConnection());

Мы можем установить тип запроса как «HEAD» вместо «GET», чтобы возвращались только заголовки, а не тело документа.

huc.setRequestMethod("HEAD");

При вызове метода connect() устанавливается фактическое соединение с URL-адресом и отправляется запрос.

huc.connect();

Шаг 5: Проверка ссылок

Используя метод getResponseCodeС помощью метода () мы можем получить код ответа на запрос.

respCode = huc.getResponseCode();

На основании полученного кода ответа мы попытаемся проверить состояние ссылки.

if(respCode >= 400){
        System.out.println(url+" is a broken link");
}
else{
        System.out.println(url+" is a valid link");
}

Таким образом, мы можем получить все ссылки с веб-страницы и вывести информацию о том, являются ли ссылки действительными или неработающими.

Как получить ВСЕ ссылки веб-страницы

Одна из распространенных процедур в Интернете Тестирование заключается в том, чтобы проверить, работают ли все ссылки, присутствующие на странице. Это удобно сделать, используя комбинацию Java для каждого цикла, найтиЭлементы() & By.tagName("а") метод.

Метод findElements() возвращает список веб-элементов с тегом "a". Доступ к каждому элементу осуществляется с помощью цикла for-each.

Получить ВСЕ ссылки веб-страницы

Код WebDriver ниже проверяет каждую ссылку из Mercury Домашняя страница Tours, чтобы определить те, которые работают, и те, которые все еще находятся в стадии строительства.

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.*;

public class P1 {

    public static void main(String[] args) {
        String baseUrl = "https://demo.guru99.com/test/newtours/";
        System.setProperty("webdriver.chrome.driver", "G:\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();

        String underConsTitle = "Under Construction: Mercury Tours";
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

        driver.get(baseUrl);
        List<WebElement> linkElements = driver.findElements(By.tagName("a"));
        String[] linkTexts = new String[linkElements.size()];
        int i = 0;

        //extract the link texts of each link element
        for (WebElement e : linkElements) {
            linkTexts[i] = e.getText();
            i++;
        }

        //test each link
        for (String t : linkTexts) {
            driver.findElement(By.linkText(t)).click();
            if (driver.getTitle().equals(underConsTitle)) {
                System.out.println("\"" + t + "\""
                        + " is under construction.");
            } else {
                System.out.println("\"" + t + "\""
                        + " is working.");
            }
            driver.navigate().back();
        }
        driver.quit();
    }
}

Результат должен быть аналогичен показанному ниже.

  • Доступ к ссылкам на изображения осуществляется с помощью методов By.cssSelector() и By.xpath().

Получить ВСЕ ссылки веб-страницы

Поиск проблемы

В единичном случае первой ссылкой, к которой обращается код, может быть ссылка «Главная». В таком случае действие driver.navigate.back() отобразит пустую страницу, поскольку первым действием является открытие браузера. Драйвер не сможет найти все остальные ссылки в пустом браузере. Поэтому IDE выдаст исключение, и остальная часть кода не будет выполнена. Это легко исправить с помощью цикла If.

Часто задаваемые вопросы (FAQ)

Selenium собирает все теги привязки и отправляет HTTP HEAD-запрос каждому из них. URLи помечает любую ссылку, возвращающую код 400 или выше, как неработающую.

Код 4xx указывает на проблему на стороне клиента, например, на отсутствие страницы, а код 5xx указывает на сбой на стороне сервера при обработке запроса.

Да. Источники изображений собираются с помощью By.cssSelector() или By.xpath(), а затем каждый src URL подтверждается кодом HTTP-ответа.

Да. Поисковые роботы на основе ИИ сканируют страницы, переходят по ссылкам и отмечают неработающие ссылки или перенаправления. URLбез ручного написания скриптов.

Искусственный интеллект отслеживает состояние соединений с течением времени, прогнозирует сбои и предлагает варианты замены, сокращая количество повторных ручных проверок соединений.

Подведем итог этой публикации следующим образом: