Как да намерите повредени връзки в 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() (URLConnection) е преобразувано от типа 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 Обиколки на началната страница, за да определите тези, които работят и тези, които все още са в процес на изграждане.
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)