Как да намерите повредени връзки в 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() (URLConnection) е преобразувано от типа 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 Обиколки на началната страница, за да определите тези, които работят и тези, които все още са в процес на изграждане.

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без ръчно писане на скриптове.

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

Обобщете тази публикация с: