Как найти битые ссылки в Selenium

Содержание:

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

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

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

Практически невозможно проверить, работает ли ссылка или нет, пока вы не нажмете на нее.

Подпишитесь на наш ТЕЛЕГРАМ КАНАЛ ПО АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ

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

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

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

Сценарий автоматизации с использованием Selenium, который автоматизирует этот процесс, является более правильным решением.

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

  1. Соберите все ссылки на веб-странице на основе тега <a>.
  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 из ответов.

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

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

Получите итератор для перемещения по списку:

Iterator&lt;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();

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

respCode = huc.getResponseCode();

По коду ответа мы попытаемся проверить статус ссылки:

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

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

Одной из распространенных процедур в web тестировании является проверка работоспособности всех ссылок, присутствующих на странице. Это удобно сделать с помощью комбинации Java цикла for-each, метода findElements() & By.tagName("a").

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

использование метода findElements()

Приведенный ниже код 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 = "http://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.

Перевод статьи «How to Find Broken Links in Selenium».

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *