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

Что такое битые ссылки?
Битые ссылки — это ссылки или URLНедоступны. Возможно, они не работают или неисправны из-за ошибки сервера.
A URL Всегда будет иметь статус 2xx, что означает допустимость запроса. Существуют разные коды состояния HTTP, которые имеют разное назначение. Для недопустимого запроса статус HTTP равен 4xx и 5xx.
Коды состояния класса 4xx в основном относятся к ошибкам на стороне клиента, а коды состояния класса 5xx — к ошибкам ответа сервера.
Скорее всего, мы не сможем подтвердить, работает ли эта ссылка или нет, пока мы не нажмем и не подтвердим ее.
Почему вам следует проверять неработающие ссылки?
Всегда следует проверять наличие неработающих ссылок на сайте, поскольку пользователь не должен попадать на страницу с ошибкой.
Ошибка возникает, если правила не обновлены правильно или запрошенные ресурсы отсутствуют на сервере.
Ручная проверка ссылок — утомительная задача, поскольку каждая веб-страница может содержать большое количество ссылок, и ручной процесс приходится повторять для всех страниц.
Скрипт автоматизации, использующий Selenium то, что позволит автоматизировать процесс, является более подходящим решением.
Как проверить неработающие ссылки и изображения в Selenium
Для проверки неработающих ссылок вам необходимо будет выполнить следующие шаги.
- Соберите все ссылки на веб-странице на основе тега.
- Отправьте HTTP-запрос для получения ссылки и считайте код HTTP-ответа.
- Определите, является ли ссылка действительной или неработающей, на основе кода ответа HTTP.
- Повторите это для всех захваченных ссылок.
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.


.png)