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

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

Неработающие ссылки — это ссылки или URL-адреса, которые недоступны. Они могут быть недоступны или не функционировать из-за какой-либо ошибки сервера.

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

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

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

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

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

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

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

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

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

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

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

Код для поиска неработающих ссылок на веб-странице

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

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 для перемещения по списку.

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

Шаг 3. Определение и проверка URL-адреса

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

Получите href тега привязки и сохраните его в переменной URL.

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

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

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-запрос

Класс HttpURLConnection имеет методы для отправки HTTP-запроса и захвата кода HTTP-ответа. Таким образом, выходные данные метода openConnection() (URLConnection) преобразуются к типу HttpURLConnection.

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.