Як знайти непрацюючі посилання в Selenium

⚡ Розумний підсумок

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

  • 🔗 Визначення: Непрацююче посилання – це URL до якого неможливо дістатися, зазвичай повертаючи помилку 4xx або 5xx.
  • 🧭 Чому це важливо: Непрацюючі посилання шкодять користувацькому досвіду та SEO, тому автоматичні перевірки замінюють повільну ручну верифікацію.
  • 📥 Зібрати посилання: Використовуйте findElements з By.tagName(“a”), щоб зібрати кожен елемент-якорь на сторінці у список.
  • 📡 Надіслати запит HEAD: Відкрийте HttpURLЗ’єднання, встановіть метод на 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

У цій частині ми перевіримо, чи a URL належить до домену третьої сторони, або чи URL порожній/нульовий.

Отримайте href тегу прив'язки та збережіть його у змінній 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З’єднання) перетворюється на тип HttpURLПідключення.

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 для кожного циклу, findElements() & By.tagName("a") метод.

Метод 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.

Поширені запитання

Selenium збирає всі теги прив'язки, надсилає HTTP HEAD-запит кожному URLі позначає будь-яке посилання, яке повертає 400 або вище, як непрацююче.

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

Так. Джерела зображень збираються за допомогою By.cssSelector() або By.xpath(), а потім кожен src URL перевіряється через код відповіді HTTP.

Так. Сканери на основі штучного інтелекту сканують сторінки, переходять за посиланнями та позначають пошкоджені або перенаправляють. URLбез ручного написання сценаріїв.

Штучний інтелект відстежує стан посилань з часом, прогнозує збої та пропонує заміни, зменшуючи повторні ручні перевірки посилань.

Підсумуйте цей пост за допомогою: