Как да намерите повредени връзки в Selenium

Какво представляват повредените връзки?

Неработещите връзки са връзки или URL адреси, които не са достъпни. Те може да не работят или да не функционират поради грешка в сървъра

Един URL винаги ще има статус с 2xx, който е валиден. Има различни HTTP кодове за състояние, които имат различни цели. За невалидна заявка HTTP статусът е 4xx и 5xx.

4xx клас код за състояние е главно за грешка от страна на клиента, а 5xx клас кодове за състояние е главно за грешка в отговор на сървъра.

Най-вероятно няма да можем да потвърдим дали тази връзка работи или не, докато не щракнем и не я потвърдим.

Защо трябва да проверявате Невалидни връзки?

Винаги трябва да се уверявате, че няма повредени връзки на сайта, защото потребителят не трябва да попада на страница с грешка.

Грешката възниква, ако правилата не се актуализират правилно или заявените ресурси не съществуват на сървъра.

Ръчната проверка на връзките е досадна задача, тъй като всяка уеб страница може да има голям брой връзки и ръчният процес трябва да се повтори за всички страници.

Използване на скрипт за автоматизация Selenium което ще автоматизира процеса е по-подходящо решение.

Как да проверите повредените връзки и изображения в Selenium

За да проверите повредените връзки, ще трябва да направите следните стъпки.

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

Стъпка 2: Съберете всички връзки в уеб страницата

Идентифицирайте всички връзки в уеб страница и ги съхранявайте в списък.

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

Получете итератор за преминаване през списъка.

Iterator<WebElement> it = links.iterator();

Стъпка 3: Идентифициране и валидиране на URL

В тази част ще проверим дали URL адресът принадлежи към домейн на трета страна или дали URL адресът е празен/нулев.

Вземете href на anchor таг и го съхранете в 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");
}

По този начин можем да получим всички връзки от уеб страницата и да отпечатаме дали връзките са валидни или повредени.

Надяваме се, че този урок ви помага при проверката на повредени връзки с помощта на селен.

Как да получите ВСИЧКИ връзки на уеб страница

Една от често срещаните процедури в мрежата Тестване е да се тества дали всички връзки в страницата работят. Това може удобно да се направи с помощта на комбинация от 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 цикъл.