반응형

자바 selenium 사용시 새탭을 열고 싶은 경우가 있다.

 

 

탭을 여는 방법은 여러가지 있는데 키보드 이벤트를 이용한 경우와 자바스크립트를 이용하는 경우가 있다.

 

자바스크립트를 이용하는 경우

((JavascriptExecutor) driver).executeScript("window.open()");

위의 방식으로 새탭을 열고, 새탭의 브라우저도 컨트롤 하고 싶은 경우 tab 을 이동해야 한다.

탭을 이동하는 방법은

ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles()); // 탭리스트 가져오기
driver.switchTo().window(tabs.get(1)).navigate().to("https://www.naver.com");

getWindowHandles 로 탭 리스트를 가져와서 원하는 탭 index 로 이동하면 된다. 탭을 새로 만들었으면 

driver.switchTo().window(tabs.get(1)).navigate().to("https://www.naver.com"); // 방금만든 1번 탭으로 이동

로 탭 이동 후 새로운 탭에서 이동하고자 하는 url 로 이동하자.

 

샘플코드

예시로 탭을 새로 만들고 이미 요청했던 화면을 닫는 코드.

System.setProperty(WEB_DRIVER_ID, WEB_DRIVER_PATH);
//Driver SetUp
ChromeOptions options = new ChromeOptions();
options.setHeadless(true);
options.setCapability("ignoreProtectedModeSettings", true);

driver = new ChromeDriver(options);
// driver 는 알아서 생성하자.

RemoteWebDriver driver = webdriverExecutor.getWebDriver();

for(int i = 1; i < 100; i ++) {
  driver.get("https://juntcom.tistory.com/" + i);
  ((JavascriptExecutor) driver).executeScript("window.open()"); // 새로운 탭 열기
  driver.close(); // 포커스가 첫번째 탭이므로 첫번째 탭이 닫힌다.
  ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles()); // 탭리스트
  driver.switchTo().window(tabs.get(0)).navigate().to("https://www.naver.com"); 
  // 탭이 2개였지만 close로 한개가 없으므로 현재 탭은 1개 그러므로 0번 탭으로 포커스 후 url 이동하자
}

여기서 driver.close 를 하지 않으면 계속해서 새탭이 만들어질 것이다.

get() 메소드는 현재탭에서 url 변경이다.

 

키 이벤트로 열기

// Open a new tab
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");

컨트롤 T 로 탭을 열 수 있어, 다음과 같이 사용할 수 있다.

 

반대로 탭을 키 이벤트로 닫을 수도 있다.

Actions action = new Actions(driver);
// Close the newly opened tab
action.keyDown(Keys.CONTROL).sendKeys("w").perform();
// Switch back to original
action.keyDown(Keys.CONTROL).sendKeys("1").perform();

컨트롤 W 는 현재 포커스의 브라우저를 닫는 단축키

컨프롤 숫자는 해당 번호의 순서 탭으로 이동하는 단축키이다.

 

또한 탭이 많을 경우 제어가 힘들수도 있는데, 원래 탭으로 돌아갈 수 도 있다.

// I had to grab the original handle
String originalHandle = driver.getWindowHandle();

// And switch back to the original handle. I am not sure why, but
// it just did not work without this, like it has lost the focus
driver.switchTo().window(originalHandle);

 

 

stackoverflow.com/questions/17547473/how-to-open-a-new-tab-using-selenium-webdriver[새탭열기 및 이동]

반응형
반응형

자바로 크롤링을 하려면 SSR - 서버사이드 렌더링 인 경우 url 에 로 http 리퀘스트 해서 받아온 응답을

element 를 찾아 파싱만 하면 된다.

 

하지만 문제가 CSR - 클라이언트사이드 렌더링 의 경우 크롤링을 하기 어렵다.

뿐만 아니라 로그인 및 기타 인증이 필요한 사이트일 수록 크롤링을 하기 어렵다.

 

그래서 브라우져를 프로그래밍으로 조작해서 필요한 데이터만 추출하는 라이브러리를 사용해야 한다.

라이브러리는 Selenium 라이브러리다.

 

Selenium?

: Selenium은 주로 웹앱을 테스트하는데 이용하는 프레임워크이다. ebdriver라는 API를 통해 운영체제에 설치된 Chrome등의 브라우저를 제어하게 된다.

spring boot 를 활용해서 maven 으로 pom.xml 에 다음과 같이 추가한다.

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>3.3.1</version>
</dependency>

 

브라우져의 드라이버도 각자 받아야한다.

유의해야 할 것은 크롬의 경우 사용자가 사용하는 브라우져의 크롬 버젼을 확인해서 같은 버젼의 드라이버를 받아야 한다.

설정 > chrome 정보 에서 버젼을 확인한다.

 

드라이버 세팅

public class Webdriver {

    //WebDriver 설정
    private WebDriver driver;

    //Properties 설정
    public static String WEB_DRIVER_ID = "webdriver.chrome.driver";
    public static String WEB_DRIVER_PATH = "/Users/chromedriver"; // 다운받은 크롬드라이버 경로


    public Webdriver() {
        //System Property SetUp

        chrome();
        //firefox();
    }
    
    private void chrome(){
        System.setProperty("webdriver.chrome.driver", DRIVER_PATH);
		ChromeOptions options = new ChromeOptions();
		options.setHeadless(true);
		options.addArguments("--lang=ko");
	    options.addArguments("--no-sandbox");
	    options.addArguments("--disable-dev-shm-usage");
		options.addArguments("--disable-gpu");
        options.setCapability("ignoreProtectedModeSettings", true);


	    ChromeDriver driver = new ChromeDriver(options);
	    driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
    }
    
    private void firefox() {
        System.setProperty("webdriver.gecko.driver", "/Users/eomjuntae/develop/spring/crawling/src/main/resources/geckodriver");
        driver = new FirefoxDriver();
    }
    ...
    
    public void useDriver(String url) {
    	driver.get(url);	
    }
}    

위와 같이 크롬 드라이버에 관한 세팅을 하자. 

파이어폭스 드라이버 메소드도 만들었다. 위의 경로 설정으로 사용하면 된다.

 

드라이버를 생성후 get 메소드를 사용하면 된다.

Webdriver webdriver = new Webdriver();
webdriver.useDriver("https://juntcom.tistory.com");

 

드라이버 close 및 quit

브라우저를 띄우게 되면 항상 close 를 시켜줘야 한다. 하지 않으면 메모리만 잡아먹게 된다.

close() 메소드와 quit() 메소드의 차이는

quit 는 브라우져 종료

close 는 탭 종료 이다.

더이상 사용하지 않을 경우 quit() 메소드로 종료 시켜야 한다.

반응형

+ Recent posts