서론
아래의 포스팅에서, 간단하게 WebDriverManager Library를 사용하여
ChromeDriver.exe를 수동으로 설치하고 버전을 호환시킬 필요가 없는 방법을 알아보았다.
위의 포스팅은 Window환경이었기 때문에
개발한 프로세스를 Linux환경에서 사용해야 하기 때문에 이를 해결해야했다.
에러 메세지
org.openqa.selenium.WebDrvierException: unknown error: Chrome failed to start: exited abnormally
해결
1. Chromeoptions 추가 - 실패
해당 옵션들을 사용하였으나 같은 에러가 계속 발생했다.
options.addArguments("--no-sandbox");
options.addArguments("--disable-dev-shm-usage");
참고
샌드박스 및 /dev/shm 공유 메모리 공간 비활성화하여 Chrome에서 샌드박스와 공유 메모리 공간을 사용하지 않도록 할 수 있으며, 이는 시작 및 비정상 종료와 관련된 오류를 해결하는 데 도움이 될 수 있다.
하지만 샌드박스를 사용하지 않고 공유 메모리공간을 사용하는 것은 보안에 영향을 미칠 수 있으니 주의하자.
2. 새로운 문제 발견 - X11 설치
X 윈도우 시스템(=X윈도우, X11, X 서버, X)
유닉스 계열 운영체제에서 사용되는 윈도 시스템 및 X 윈도우 GUI 환경으로 디스플레이 장치에 창을 표시하며 마우스와 키보드 등의 입력 장치의 상호작용 등을 관리해 GUI 환경의 구현을 위한 기본적인 프레임워크
webdrivermanager 사용 시 setBinary 설정을 통해 경로를 따로 지정해주지 않으면 기본값인 /usr/bin으로 향하며, 해당 경로의 google-chrome.exe로 향한다. setBinary설정은 아래와 같이 options을 통해 부여할 수 있다.
options.setBinary("/usr/share/man/man1/");
해당 경로에서 google-chrome 자체가 실행이 되는지 확인해보려고 했고, 새로운 문제를 발견했다.
Missing X server or $DISPLAY 랜다..
아래의 명령어를 통해 X11이 설치되어 있는지 찾아봤고 없었다고 한다..
which X
which Xorg
X11 설치를 위해 아래의 명령어를 사용했다. 패키지 관리자인 dnf를 업데이트 하고, Xorg를 설치한다.
설치완료 후 Xorg를 실행하고, display 환경변수를 설정한다.
sudo dnf update
sudo dnf install xorg-x11-server-Xorg
Xorg :0 &
export DISPLAY=:0
google-chrome을 실행해보고, 정상 동작한다면 다시 테스트코드를 실행해본다.
그래도 여전히 X 서버 관련 에러가 발생했다.
3. 굳이 GUI를?
위의 과정을 하면서 드는 생각이 Crawler 구동 시 로컬에서 테스트를 꾸준히 진행하는 과정에서
headless 옵션을 사용하여 크롬 창을 띄우지 않았었던 기억이 난다.
리눅스 환경에서도, 만약 headless옵션을 사용하여 프로세스는 실행되지만 화면이 필요하지 않다면?
굳이 GUI환경을 셋팅할 필요가 없지 않을까 싶어서 options을 추가
options.addArguments("--headless");
정상 구동 되는 것을 확인할 수 있다.
아래는 테스트를 위한 코드
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import io.github.bonigarcia.wdm.WebDriverManager;
class test2{
public static void main(String[] args) {
WebDriverManager.chromedriver().setup();
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
options.addArguments("--no-sandbox");
options.addArguments("--disable-dev-shm-usage");
ChromeDriver driver = new ChromeDriver(options);
final WebDriverWait wait = new WebDriverWait(driver, 20);
driver.get("http://www.google.com");
wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("img")));
String title = driver.findElement(By.cssSelector("img")).getAttribute("src");
System.out.println(title);
driver.quit();
}
}
이제 Linux환경에서 Crawler구동을 위한 모든 셋팅이 끝났다.
드디어 대형 웹을 대상으로 한 Crawler를 서버에 정상 탑재할 수 잇게 되었다.
참조
https://github.com/bonigarcia/webdrivermanager/issues/939
https://github.com/bonigarcia/webdrivermanager
2023.04 ~ 백엔드 개발자의 기록
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!