개발/ETC

[java] selenium으로 Chrome headless 사용해보기

신매력 2018. 1. 19. 20:14

Headless browser란?


GUI가 없는 브라우저. command line interface(CLI)에서 다루는 브라우저. CLI 환경에서 에뮬레이션 가능.

headless 브라우저에서 phantomJS가 대세였었지만,

2017년 4월에 Chrome에서 직접 headless 모드를 추가함으로써 phantomJS의 의미가 없어져서 더 이상 지원하지 않는다고 한다.


Selenium이란?


브라우저 플러그인을 넣고 테스트를 실행시킬 수 있도록 하는 자동화 툴이다.

  • 서버 사이드에서 테스트를 실행시킬 수 있는 Remote Controller (RC)
  • 브라우저를 제어할 수 있는 webdriver

Java, Python, node.js, javascript, ruby, groovy, php, perl 등 다양한 언어 제공

WebDriver라는 웹 자동화 툴에서 브라우저가 제공하는 API들을 사용할 수 있다.

  • WebDriver가 제공하는 브라우저
    • Firefox
    • Chrome
    • Internet Explorer
    • Opera
    • PhantomJS


1. JAVA local 환경에서 selenium 사용하기

(1) maven 빌드 설정 (pom.xml)

<!-- selenium -->
<dependency>
   <groupId>org.seleniumhq.selenium</groupId>
   <artifactId>selenium-java</artifactId>
   <version>3.5.3</version>
</dependency>
<dependency>
      <groupId>org.seleniumhq.selenium</groupId>
      <artifactId>selenium-server</artifactId>
      <version>3.5.3</version>
</dependency>
<dependency>
     <groupId>org.seleniumhq.selenium</groupId>
     <artifactId>selenium-chrome-driver</artifactId>
     <version>3.5.3</version>
</dependency>
 
<!-- guava -->
<dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>22.0</version>
</dependency>

참고: 내부에서 guava를 사용하므로 guava도 dependency를 추가해주어야 했다.


(2) JUnit에서 테스트 실행


chromedriver.exe를 환경에 맞게 다운로드 한다. (https://sites.google.com/a/chromium.org/chromedriver/downloads)

Chrome Headless

@Test
public void test() {
    System.setProperty("webdriver.chrome.driver""c:\\selenium\\chromedriver.exe");
 
    ChromeOptions options = new ChromeOptions();
    options.addArguments("headless");
 
    driver = new ChromeDriver(options);
    driver.get("http://naver.com");
    driver.quit();
}

 

 

2. linux 서버에서 동작시키기

 

로컬의 chrome driver를 사용하는 대신, linux 서버에 올려서 테스트를 해보자.

 

먼저 linux 서버에 chrome을 설치하고,

자바 코드에서 로컬의 chromedriver 위치로 잡아 두었던 것을

System.setProperty("webdriver.chrome.driver""c:\\selenium\\chromedriver.exe");

linux에 있는 위치로 잡아주었다.

System.setProperty("webdriver.chrome.driver""/home/marobiana/downloads/chromedriver");

 

테스트용 java code

@Controller
@Slf4j
public class TestController {
    private WebDriver driver;
 
    public void setup() throws Exception {
        System.setProperty("webdriver.chrome.driver""/home/marobiana/downloads/chromedriver");
 
        ChromeOptions options = new ChromeOptions();
        options.addArguments("headless");
 
        try {
            driver = new ChromeDriver(options);
        catch (Exception e) {
            log.error("########## [driver error] msg: {}, cause: {}", e.getMessage(), e.getCause());
            return;
        }
    }
 
    @RequestMapping("/test/selenium")
    public void browserTest() throws Exception {
        setup();
 
        String startUrl = "https://is.gd/XWLTZy";
        String currentUrl = null;
 
        currentUrl = driver.get(startUrl);
 
        log.error("# start url: {}", startUrl);
        log.error("# current url: {}", currentUrl);
 
        tearDown();
    }
 
    public void tearDown() throws Exception {
        this.driver.quit();
    }
}

 * test code는 블로그에 올리면서 대충 작성했기 때문에, 안 돌아갈 수도 있다.


수행결과


/home/marobiana/downloads/chromedriver: /lib64/libc.so.6: version 'GLIBC_2.14' not found

이런 에러가 발생했다.


에러 원인

centOS의 버전이 낮아서 GLIBC_2.14 버전이 설치되어있지 않아 발생하는 현상.

현재 장비의 centOS 버전은 6.9이다. GLIBC_2.12까지 지원한다.

centOS의 버전 7은 GLIBC_2.17까지 지원한다.


아래 명령어를 쳐보면 지원하는 라이브러리 버전이 나온다.

$ strings /lib64/libc.so.6 | grep GLIBC_
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_PRIVATE


삽질


GLIBC_2.14 버전을 따로 설치하고 환경변수가 새 라이브러리를 참조하도록 해볼까?

새 라이브러리가 있는 곳으로 환경변수 세팅 완료. (irteam의 .bash_profile)
=> 직접 크롬드라이버를 실행시키면 잘 동작한다. (환경변수를 제대로 인식한다!)

그러나, 톰캣 WAS를 통해 접근하면 접근이 되지 않는다. (환경변수를 인식하지 못한다)

해결방법


CentOS 버전을 7점대로 올리면 된다.!!!!!