Содержание:
- Что такое битые ссылки?
- Зачем нужно их проверять?
- Как проверить битые ссылки и изображения в Selenium
- Код для поиска битых ссылок на веб-странице
- Пояснение кода битых ссылок
- Как получить все ссылки веб-страницы
- Поиск и устранение неисправностей
Что такое битые ссылки?
Неработающие (битые) ссылки – это ссылки или URL-адреса, которые недоступны пользователю. Они могут не функционировать из-за какой-либо ошибки сервера.
URL-адрес всегда будет иметь статус 2xx, который является действительным. Существуют различные коды состояния HTTP, которые имеют разное назначение. Для недействительного запроса статус HTTP имеет значения 4xx и 5xx.
Класс кодов состояния 4xx предназначен в основном для ошибок на стороне клиента, а класс кодов состояния 5xx – для ошибок в ответе сервера.
Практически невозможно проверить, работает ли ссылка или нет, пока вы не нажмете на нее.
Подпишитесь на наш ТЕЛЕГРАМ КАНАЛ ПО АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ
Зачем нужно проверять битые ссылки?
Всегда нужно следить за тем, чтобы на сайте не было неработающих ссылок, поскольку пользователь не должен попадать на страницу с ошибкой.
Ошибка возникает, если информация на странице обновлена некорректно, либо запрашиваемые ресурсы отсутствуют на сервере.
Ручная проверка ссылок — утомительная задача, поскольку на каждой веб-странице их может быть большое количество, и этот процесс приходится повторять вручную для всех страниц.
Сценарий автоматизации с использованием Selenium, который автоматизирует этот процесс, является более правильным решением.
Как проверить битые ссылки и изображения в Selenium
Для проверки неработающих ссылок необходимо выполнить следующие действия:
- Соберите все ссылки на веб-странице на основе тега
<a>
. - Отправьте HTTP-запрос на ссылку и считайте код HTTP-ответа.
- Выясните, является ли ссылка действительной или нерабочей, на основании кода ответа HTTP.
- Повторите это действие для всех собранных ссылок.
Код для поиска неработающих ссылок на веб-странице
Ниже приведен код веб-драйвера, который проверяет наш способ:
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-адрес пуст или имеет значение 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"); }
Таким образом, мы можем получить все ссылки с веб-страницы и вывести, являются ли они действительными или битыми.
Как получить все ссылки веб-страницы
Одной из распространенных процедур в web тестировании является проверка работоспособности всех ссылок, присутствующих на странице. Это удобно сделать с помощью комбинации Java цикла for-each, метода 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 = "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».