String chromeDriver = System.getProperty("chrome.driver");
String chromeSetup = System.getProperty("chrome.setup");
log.info("chromeSetup ===> " + chromeSetup);
log.info("chromeDriver ===> " + chromeDriver);
System.setProperty("webdriver.chrome.driver", chromeDriver);
ChromeOptions options = new ChromeOptions();
options.addArguments("--disable-extensions");
options.addArguments("--headless"); // GUI 환경 없이 실행
options.addArguments("--disable-dev-shm-usage");
options.addArguments("--remote-debugging-port=9222");
options.addArguments("'--window-size=1280x1696");
options.addArguments("'--disable-gpu");
options.addArguments("'--enable-logging");
options.addArguments("'--ignore-certificate-errors");
options.setBinary(chromeSetup);
WebDriver webDriver = new ChromeDriver(options);
webDriver.get("https://naver.com");
log.info("title : {}", webDriver.getTitle());
1. 개요
AWS AMI(아마존 머신 이미지) 환경에서 Selenium을 사용하여 크롬 브라우저를 자동화하는 과정에서 크롬 드라이버와 리눅스에 설치된 크롬 버전 간의 버전 차이로 인해 발생하는 문제를 해결하는 방법을 설명합니다. 이 글에서는 크롬 드라이버 v129와 리눅스에 설치된 크롬 v126 사이의 충돌, 옵션 미작동 문제, AMI(CentOS/RHEL 기반)에서의 테스트 환경 구성 방법 등을 다룹니다.
2. 내용
2.1 문제점
- 크롬 드라이버와 크롬 브라우저 버전 불일치
AWS AMI 환경에서 크롬 드라이버 v129(상위 버전)가 설치된 반면, 리눅스에 설치된 크롬은 v126(하위 버전)으로 인해 호환성 문제 발생. - 일부 옵션 동작 불가
--no-sandbox 옵션이 정상적으로 동작하지 않음. - 테스트 환경 정보 부족
AWS AMI 환경에서는 Selenium 관련 자료가 부족하며, 특히 Ubuntu 대신 CentOS/RHEL 기반 시스템을 사용하기 때문에 기존 리소스와 호환되지 않는 경우가 있음.
2.2 조치 사항
2.2.1 크롬 및 드라이버 설정
- 크롬 테스트 버전을 구글 크롬 랩 사이트에서 다운로드 후 저장.
- 다운로드한 크롬을 리눅스에서 실행하기 위해 /app/chrome-exec/chrome-linux/chrome을 실행.
- 실행 시 http2 오류 및 여러 .so 라이브러리 관련 오류 발생.
2.2.2 패키지 설치
- 여러 라이브러리 관련 오류 해결을 위해 아래의 명령어로 필요한 패키지 설치:
yum install -y rpm-build rpmdevtools gcc gcc-c++ libgcrypt-devel gnutls-devel pam-devel dbus-devel avahi-devel
wget https://github.com/apple/cups/releases/download/release-1.7.5/cups-1.7.5-source.tar.gz
rpmbuild -ta --without libusb1 cups-1.7.5-source.tar.gz
yum install -y ~/rpmbuild/RPMS/x86_64/cups-libs-1.7.5-1.x86_64.rpm
2.2.3 가상 디스플레이 설정
- Xvfb(가상 프레임버퍼)를 사용하여 GUI가 없는 환경에서도 디스플레이를 시뮬레이션하도록 설정.
cat /etc/systemd/system/xvfb.service
[Unit]
Description=Start Xvfb at startup
After=multi-user.target
[Service]
ExecStart=/usr/bin/Xvfb :99 -screen 0 1920x1080x24
[Install]
WantedBy=multi-user.target
echo "export DISPLAY=:99" > /etc/bashrc
systemctl enable xvfb.service
2.2.4 Java 프로젝트의 Gradle 설정
- 기존에 사용하던 Selenium 버전과 혼합된 버전 문제를 해결하기 위해 명시적으로 Selenium 4.23.0 버전을 사용:
implementation 'org.seleniumhq.selenium:selenium-java:4.23.0'
implementation 'org.seleniumhq.selenium:selenium-remote-driver:4.23.0'
implementation 'org.seleniumhq.selenium:selenium-chrome-driver:4.23.0'
implementation group: 'org.seleniumhq.selenium', name: 'selenium-manager', version: '4.23.0'
implementation group: 'org.seleniumhq.selenium', name: 'selenium-api', version: '4.23.0'
2.3 Selenium ChromeDriver 설정
- 크롬 드라이버 및 옵션을 아래와 같이 설정합니다. 크롬 실행 바이너리는 미리 지정한 경로를 사용하고, GUI가 없는 환경에서 동작하도록 옵션을 구성했습니다:
String chromeDriver = System.getProperty("chrome.driver");
String chromeSetup = System.getProperty("chrome.setup");
log.info("chromeSetup ===> " + chromeSetup);
log.info("chromeDriver ===> " + chromeDriver);
System.setProperty("webdriver.chrome.driver", chromeDriver);
ChromeOptions options = new ChromeOptions();
options.addArguments("--disable-extensions");
options.addArguments("--headless"); // GUI 환경 없이 실행
options.addArguments("--disable-dev-shm-usage");
options.addArguments("--remote-debugging-port=9222");
options.addArguments("'--window-size=1280x1696");
options.addArguments("'--disable-gpu");
options.addArguments("'--enable-logging");
options.addArguments("'--ignore-certificate-errors");
options.setBinary(chromeSetup);
WebDriver webDriver = new ChromeDriver(options);
webDriver.get("https://naver.com");
log.info("title : {}", webDriver.getTitle());
2.4 크롤링 자바 실행
- 크롤링 작업을 위한 자바 프로그램 실행 명령어는 다음과 같습니다.
java -Dchrome.driver="/app/chrome-exec/chromedriver-linux" -Dchrome.setup="/app/chrome-exec/chrome-linux/chrome" -jar *.jar
3. 코드
String chromeDriver = System.getProperty("chrome.driver");
String chromeSetup = System.getProperty("chrome.setup");
log.info("chromeSetup ===> " + chromeSetup);
log.info("chromeDriver ===> " + chromeDriver);
System.setProperty("webdriver.chrome.driver", chromeDriver);
ChromeOptions options = new ChromeOptions();
options.addArguments("--disable-extensions");
options.addArguments("--headless"); // GUI 환경 없이 실행
options.addArguments("--disable-dev-shm-usage");
options.addArguments("--remote-debugging-port=9222");
options.addArguments("'--window-size=1280x1696");
options.addArguments("'--disable-gpu");
options.addArguments("'--enable-logging");
options.addArguments("'--ignore-certificate-errors");
options.setBinary(chromeSetup);
WebDriver webDriver = new ChromeDriver(options);
webDriver.get("https://naver.com");
log.info("title : {}", webDriver.getTitle());
결론
크롬 버전 충돌 문제는 AMI 환경에서 적절한 크롬 및 드라이버 버전을 설정하고, 필요한 패키지 설치를 통해 해결할 수 있습니다. Selenium 설정과 가상 디스플레이 환경도 중요하며, 크롤링을 실행할 때 자바 명령어에서 크롬 바이너리 경로를 명시적으로 설정하는 것이 핵심입니다.
'Programming > 스프링.유틸' 카테고리의 다른 글
[JAVA] TempFileCleanJob - 임시 파일 정리 작업 구현 (0) | 2024.07.14 |
---|---|
[Java][SSH] Jsch Java SSH 라이브러리 사용 주의 사항 (2) | 2022.11.28 |
[자바][JAVA][파일업로드]자바 파일업로드 기초 소스 (초급자용) (0) | 2022.03.20 |
Image Test 및 부정 클릭 방지 테스트. (0) | 2021.11.18 |
[Spring F/W 유틸] Dynamic Get Bean Object (0) | 2021.09.07 |