끊어진 링크를 찾는 방법 Selenium

⚡ 스마트 요약

깨진 링크 찾기 Selenium WebDriver는 모든 앵커 태그를 수집하고 각 태그에 HTTP HEAD 요청을 보내는 방식으로 작동합니다. URL그리고 응답 코드를 읽습니다. 400 이상의 코드를 반환하는 링크는 깨진 링크로 표시되고, 유효한 링크는 2xx 코드를 반환합니다.

  • 🔗 정의: 깨진 링크는 URL 연결할 수 없으며, 일반적으로 4xx 또는 5xx 오류가 반환됩니다.
  • 🧭 어떤 의미에서 중요한가: 깨진 링크는 사용자 경험과 SEO에 악영향을 미치므로, 느리고 시간이 많이 걸리는 수동 검증은 자동화된 검사로 대체됩니다.
  • 📥 링크 수집: 페이지의 모든 앵커 요소를 목록으로 가져오려면 findElements 함수에 By.tagName("a")를 사용하세요.
  • 📡 HEAD 요청 전송: HTTP를 엽니다URL연결 시 메서드를 HEAD로 설정하고 응답 코드를 읽습니다. URL.
  • 상태 유효성 검사: 응답 코드 400 이상이면 링크가 끊어진 것으로 간주하고, 2xx 코드는 모두 정상 작동하는 링크로 간주하십시오.

끊어진 링크를 찾는 방법 Selenium

끊어진 링크는 무엇입니까?

깨진 링크는 링크 또는 URL접속할 수 없는 서버입니다. 서버 오류로 인해 다운되었거나 제대로 작동하지 않을 수 있습니다.

A URL HTTP 상태 코드는 항상 2xx로 표시되며, 이는 유효한 요청임을 나타냅니다. HTTP 상태 코드는 여러 가지 용도로 사용됩니다. 유효하지 않은 요청의 경우 HTTP 상태 코드는 4xx 또는 5xx입니다.

4xx 계열 상태 코드는 주로 클라이언트 측 오류에 사용되고, 5xx 계열 상태 코드는 주로 서버 응답 오류에 사용됩니다.

링크를 클릭하여 확인할 때까지 해당 링크가 작동하는지 여부를 확인할 수 없을 가능성이 높습니다.

깨진 링크를 확인해야 하는 이유는 무엇입니까?

사이트에 깨진 링크가 없는지 항상 확인해야 합니다. 사용자가 오류 페이지로 이동해서는 안 되기 때문입니다.

규칙이 올바르게 업데이트되지 않거나 요청한 리소스가 서버에 없으면 오류가 발생합니다.

링크를 수동으로 확인하는 것은 매우 번거로운 작업입니다. 각 웹페이지마다 수많은 링크가 있을 수 있고, 모든 페이지에 대해 수동 작업을 반복해야 하기 때문입니다.

자동화 스크립트 사용 Selenium 프로세스를 자동화하는 것이 더 적합한 솔루션입니다.

끊어진 링크와 이미지를 확인하는 방법 Selenium

깨진 링크를 확인하려면 다음 단계를 따르세요.

  1. 태그를 기준으로 웹페이지의 모든 링크를 수집합니다.
  2. 해당 링크에 대한 HTTP 요청을 보내고 HTTP 응답 코드를 읽습니다.
  3. HTTP 응답 코드를 기반으로 링크가 유효한지 또는 깨졌는지 확인하십시오.
  4. 캡처된 모든 링크에 대해 이 작업을 반복합니다.

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 제3자 도메인에 속하는지 여부 또는 URL 비어있거나 null입니다.

앵커 태그의 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 해당 도메인이 메인 도메인에 속하는지 아니면 제3자 소유인지 확인하십시오. 제3자 도메인에 속하는 경우 나머지 단계를 건너뛰십시오.

 if(!url.startsWith(homePage)){
           System.out.println("URL belongs to another domain, skipping it.");
           continue;
   }

4단계: HTTP 요청 보내기

HTTPURLConnection 클래스에는 HTTP 요청을 보내고 HTTP 응답 코드를 캡처하는 메서드가 있습니다. 따라서 openConnection() 메서드의 출력은 다음과 같습니다.URLConnection은 Http로 형변환됩니다.URL연결.

huc = (HttpURLConnection)(new URL(url).openConnection());

요청 유형을 "GET" 대신 "HEAD"로 설정하면 문서 본문이 아닌 헤더만 반환됩니다.

huc.setRequestMethod("HEAD");

connect() 메서드를 호출하면 해당 URL에 대한 실제 연결이 설정되고 요청이 전송됩니다.

huc.connect();

5단계: 링크 유효성 검사

getResponse를 사용하기Code() 메서드를 사용하면 요청에 대한 응답 코드를 얻을 수 있습니다.

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() 메서드를 사용합니다.

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

문제 해결

드물지만 코드가 처음으로 접근하는 링크가 "홈" 링크인 경우가 있습니다. 이 경우, `driver.navigate.back()` 액션은 브라우저를 여는 첫 번째 동작이기 때문에 빈 페이지를 표시합니다. 드라이버는 빈 브라우저에서 다른 링크들을 찾을 수 없으므로 IDE에서 예외가 발생하고 나머지 코드는 실행되지 않습니다. 이러한 상황은 `if` 루프를 사용하여 쉽게 처리할 수 있습니다.

자주 묻는 질문

Selenium 모든 앵커 태그를 수집하고 각 태그에 HTTP HEAD 요청을 보냅니다. URL또한, 400 이상의 오류 코드를 반환하는 링크는 모두 깨진 링크로 표시합니다.

4xx 코드는 페이지 누락과 같은 클라이언트 측 문제를 나타내고, 5xx 코드는 요청 처리 중 서버 측 오류를 나타냅니다.

예. 이미지 소스는 By.cssSelector() 또는 By.xpath()를 사용하여 수집한 다음 각 src를 선택합니다. URL HTTP 응답 코드를 통해 유효성이 검증됩니다.

네. AI 기반 크롤러는 페이지를 스캔하고 링크를 따라가며 깨진 링크나 리디렉션되는 링크를 표시합니다. URL수동 스크립팅 없이.

AI는 시간 경과에 따른 링크 상태를 모니터링하고, 오류를 예측하며, 교체 링크를 제안하여 반복적인 수동 링크 점검 작업을 줄입니다.

이 게시물을 요약하면 다음과 같습니다.