YOUNG-JIN.OH
웃어라. 온 세상이 너와 함께 웃을 것이다.
울어라. 너 혼자만 울게 될 것이다.

화면 테스트를 위한 Selenium 설정 및 Crawling

참고 사이트:

백 엔드(Back End)에서 테스트는 JUnit 을 쓰면 되는데, 프론트 엔드(Front End)에서 화면에 값을 입력하고 버튼을 클릭하면서 테스트를 하려면 Selenium 으로 자동화해서 사용하면 됩니다. 매크로 처럼 동작하는 이 기능은 화면 테스트 목적 이외에도 크롤링(Crawling)을 통해 정보를 수집하는 용도로도 이용할 수 있습니다.

Selenium 사이트를 방문하여 Java 언어의 Client를 받아서 수동으로 설치를 해도 되지만, 지금은 비어있는 스프링 부트 프로젝트를 하나 만들고 build.gradle에서 추가하도록 합니다.

plugins {
    id 'org.springframework.boot' version '2.1.3.RELEASE'
    id 'java'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'

    compile group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '3.141.59'
}

MacOS에 이미 설치된 Chrome 브라우저를 이용하려고 하는데, 코드와 연결해주기 위한 드라이버를 다운 받습니다.

최신버전으로 Mac용과 운영 환경으로 위한 Linux용을 다운받아 압축을 해제하고 프로젝트의 resources – selenium 디렉토리를 만들어 복사합니다. 꼭 필요한 건 아니지만, 화면 요소를 좀 더 쉽게 확인하기 위해 chrome 웹 스토어에 Selenium IDE를 설치하고 간단하게 사용해 보겠습니다.

https://chrome.google.com/webstore/detail/selenium-ide/mooikfkahbdckldjjndioackbalphokd?hl=ko

테스트할 사이트를 열어놓고 Chrome 우측 상단의 Se아이콘을 클릭하고 새로운 프로젝트를 만들어 진행합니다.

오른쪽 하단에 Selenium IDE is recording… 이라고 뜨면 정상적으로 동작되고 있는 것입니다. 현재 상태에서 브라우저를 클릭해보면 이벤트가 반응하여 내용이 표시가 되는 것을 알 수 있습니다. YOUNG-JIN,OH를 눌러보면 아래와 같이 반응하는 것을 알 수 있습니다. 브라우저의 요소검사를 하는 것보다 쉽게 확인이 가능합니다.

Selenium IDE 로 추출 대상을 확인하고 JUnit 테스트 코드를 통해 간단한 크롤링(Crawling) 작업을 해보도록 합니다. 크롤링 내용은 사이트의 #profile-name의 값을 가져오고 “java”키워드로 검색해서 처음 나오는 Article의 제목을 표시하도록 합니다.

package com.example.demo;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.ClassPathResource;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.IOException;

import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {

    @Test
    public void seleniumTest() {
        WebDriver browser = null;
        try {
            var classPathResource = new ClassPathResource("selenium/chromedriver_mac64");
            System.setProperty("webdriver.chrome.driver", classPathResource.getURL().getPath());
            browser = new ChromeDriver();
            browser.get("http://www.x1fingers.me");
            WebElement href = browser.findElement(By.id("profile-name"));

            System.out.println("href.getText() === ".concat(href.getText()));

            assertThat(href.getText(), is("YOUNG-JIN,OH"));

            browser.findElement(By.cssSelector("#nav-header > .container .fa")).click();
            browser.findElement(By.cssSelector("#nav-header .search")).sendKeys("java", Keys.RETURN);

            WebElement article = browser.findElement(By.tagName("Article"));
            String postTitle = article.findElement(By.cssSelector(".post-title")).getText();

            System.out.println(postTitle);
            
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            browser.close();
        }
    }
}

테스트 코드를 실행하면 브라우저가 저절로 하나 띄워지면서 화면 상단에 “Chrome이 자동화된 테스트 소프트웨어에 의해 제어되고 있습니다.” 라는 문구가 표시되고 코드에 따라 테스트가 진행되고 종료되는 것을 알 수 있습니다.

당연하지만, 실행되는 과정에서 다른 데를 사용자가 임의로 클릭하거나 입력하면 문제가 발생할 수 있는데요. 화면에 보이지 않도록 하려면 아래 처럼 옵션을 설정해주면 됩니다.

        var service = ChromeDriverService.createDefaultService();
        var options = new ChromeOptions().addArguments("headless");
        browser = new ChromeDriver(service, options);

You may also like...

1 Response

  1. 2019-02-22

    […] 화면 테스트를 위한 Selenium 설정 및 Crawling […]

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.