끊어진 링크를 찾는 방법 Selenium
끊어진 링크는 무엇입니까?
끊어진 링크는 연결할 수 없는 링크 또는 URL입니다. 일부 서버 오류로 인해 다운되거나 작동하지 않을 수 있습니다.
URL은 항상 유효한 2xx 상태를 갖습니다. 서로 다른 목적을 갖는 서로 다른 HTTP 상태 코드가 있습니다. 잘못된 요청의 경우 HTTP 상태는 4xx 및 5xx입니다.
4xx 클래스의 상태 코드는 주로 클라이언트 측 오류용이고, 5xx 클래스의 상태 코드는 주로 서버 응답 오류용입니다.
링크를 클릭하여 확인할 때까지 해당 링크가 작동하는지 여부를 확인할 수 없을 가능성이 높습니다.
깨진 링크를 확인해야 하는 이유는 무엇입니까?
사용자가 오류 페이지로 이동해서는 안 되기 때문에 사이트에 깨진 링크가 없는지 항상 확인해야 합니다.
규칙이 올바르게 업데이트되지 않거나 요청한 리소스가 서버에 없으면 오류가 발생합니다.
링크를 수동으로 확인하는 것은 지루한 작업입니다. 각 웹페이지에 많은 수의 링크가 있을 수 있고 모든 페이지에 대해 수동 프로세스를 반복해야 하기 때문입니다.
다음을 사용하는 자동화 스크립트 Selenium 프로세스를 자동화하는 것이 더 적합한 솔루션입니다.
끊어진 링크와 이미지를 확인하는 방법 Selenium
깨진 링크를 확인하려면 다음 단계를 따르세요.
- 태그를 기반으로 웹 페이지의 모든 링크를 수집합니다.
- 링크에 대한 HTTP 요청을 보내고 HTTP 응답 코드를 읽습니다.
- HTTP 응답 코드를 기반으로 링크가 유효한지, 끊어졌는지 알아보세요.
- 캡처된 모든 링크에 대해 이 작업을 반복합니다.
웹페이지에서 깨진 링크를 찾는 코드
다음은 사용 사례를 테스트하는 웹 드라이버 코드입니다.
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 루프를 사용하여 쉽게 처리할 수 있습니다.