Як знайти непрацюючі посилання в Selenium
⚡ Розумний підсумок
Пошук непрацюючих посилань у Selenium WebDriver передбачає збір кожного тегу прив'язки та надсилання 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
У цій частині ми перевіримо, чи 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() (URLЗ’єднання) перетворюється на тип 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 Домашня сторінка 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)