끊어진 링크를 찾는 방법 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를 획득하세요.

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

3단계: URL 식별 및 유효성 검사

이 부분에서는 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이 기본 도메인에 속하는지, 아니면 제XNUMX자에 속하는지 확인하세요. 타사 도메인에 속하는 경우 나머지 단계를 건너뜁니다.

 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());

요청 유형을 "GET" 대신 "HEAD"로 설정할 수 있습니다. 따라서 문서 본문은 반환되지 않고 헤더만 반환됩니다.

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 for-each 루프, 찾기요소() & By.태그이름(“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() 메서드를 사용하여 수행됩니다.

웹 페이지의 모든 링크 가져오기

문제 해결

특별한 경우에는 코드가 액세스하는 첫 번째 링크가 "홈" 링크일 수 있습니다. 이러한 경우 첫 번째 작업이 브라우저를 열 때 드라이버.navigate.back() 작업은 빈 페이지를 표시합니다. 드라이버는 빈 브라우저에서 다른 모든 링크를 찾을 수 없습니다. 따라서 IDE는 예외를 발생시키고 나머지 코드는 실행되지 않습니다. 이는 If 루프를 사용하여 쉽게 처리할 수 있습니다.