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에서 테스트 실행
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 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점대로 올리면 된다.!!!!!