2024-03-12 10:26:37 [http-nio-8082-exec-7] [ERROR] o.a.c.c.C.[.[.[.[dispatcherServlet] -
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed: java.lang.NoSuchMethodError: 'org.openqa.selenium.chromium.ChromiumOptions org.openqa.selenium.chrome.ChromeOptions.addArguments(java.lang.String[])'] with root cause
java.lang.NoSuchMethodError: 'org.openqa.selenium.chromium.ChromiumOptions org.openqa.selenium.chrome.ChromeOptions.addArguments(java.lang.String[])'
제공된 pom.xml 파일은 크롤링 코드와 직접적으로 관련이 없는 것으로 보입니다. 그러나 몇 가지 개선 및 주의사항이 있습니다:
의존성 버전 확인:
현재 Selenium의 버전은 4.9.0이지만, 가장 최신 버전을 사용하는 것이 좋습니다. Maven Central Repository를 통해 확인하여 필요한 버전으로 업데이트하세요.
자바 버전 지정:
현재 Java 버전이 17로 지정되어 있습니다. 사용하고 있는 Java 버전과 호환되는 다른 라이브러리 및 프레임워크 버전을 확인하세요.
Maven 빌드 프로파일 확인:
spring-boot-starter-parent의 버전은 3.1.9-SNAPSHOT으로 지정되어 있는데, 이는 현재 존재하지 않는 것으로 보입니다. 가장 최신의 안정된 버전을 사용하거나 프로젝트에 맞는 버전을 찾아서 지정하세요.
ChromiumDriver 사용 확인:
코드에서 ChromiumDriver를 사용하려면 해당 라이브러리가 의존성으로 추가되어 있어야 합니다. 필요한 경우 Selenium 버전에 따라 적절한 의존성을 추가하세요.
Lombok 관련 설정 확인:
org.projectlombok:lombok 의존성은 optional로 설정되어 있습니다. 이것이 의도된 것이라면 그대로 두세요. 그러나 Lombok을 사용 중이라면 해당 의존성을 필수로 설정하세요.
Spring Boot Maven Plugin 설정 확인:
Spring Boot Maven Plugin 설정에서 paketobuildpacks/builder-jammy-base:latest를 사용하고 있습니다. 이것이 의도된 것인지 확인하고 필요한 경우 수정하세요.
일정 크롤링
List elements = driver.findElements(By.cssSelector(".relative"));로 데이터를 불러오려고 했는데 안되서 gpt한테 물어봤음
만약 .relative로 태그를 지정했는데 원하는 값을 찾아오지 못한다면, 다음과 같은 몇 가지 원인이 있을 수 있습니다:
동적 로딩: 페이지가 JavaScript나 Ajax 등을 사용하여 동적으로 데이터를 로드하는 경우가 있습니다. 이 경우 WebDriver가 페이지 로드를 기다리도록 하는 것이 좋습니다. WebDriverWait를 사용하여 해당 요소가 나타날 때까지 대기하는 방법을 시도해보세요.
CSS 선택자 확인: .relative가 실제로 원하는 요소를 지정하는 올바른 CSS 선택자인지 확인하세요. Chrome 브라우저의 개발자 도구를 사용하여 해당 요소를 직접 확인하고 올바른 선택자를 찾아낼 수 있습니다.
프레임/윈도우 전환: 페이지에 프레임이나 다른 윈도우가 있는 경우, 올바른 프레임이나 윈도우로 전환하는지 확인하세요. driver.switchTo().frame() 또는 driver.switchTo().window() 메서드를 사용하여 전환할 수 있습니다. 라고 말해줬고!
// 웹 페이지 로드를 위한 대기
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(".relative")));
List<WebElement> elements = driver.findElements(By.cssSelector(".relative"));
for (WebElement element : elements) {
String title = element.getText();
System.out.println(title);
}
이런식으로 페이지 로드대기를 걸어줘보래
그리고 The constructor WebDriverWait(WebDriver, int) is undefined 생성자 오류가 떠서 Duration 객체를 사용하여 타임아웃을 설정하는 방식으로 변경해보라함
// 웹 페이지 로드를 위한 대기
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(".relative")));
List<WebElement> elements = driver.findElements(By.cssSelector(".relative"));
for (WebElement element : elements) {
String title = element.getText();
System.out.println(title);
}
잘나온다!
아니다....내가 원하는 데이터가 안나온다......