Selenium WebDriver 새로운 창/팝업 기다리고 인식시키기
numberOfWindowsToBe
Wait until Selenium recognizes that there are now a total of two windows.
서론&오류발생
프로젝트를 진행하며 대법원 크롤링을 위해 아래 프로세스로 진행하는데
1. 필수데이터 입력 & 캡챠 이미지 사용자에게 전송
2. 사용자로부터 캡챠 문자 입력받아 입력시키기
3. 사건조회
이 3번부분에서 사건 조회 시 새 창으로 열리는 형식으로 되어있었습니다.
그래서 단순히 getWindowHandles 와 switchTo 를 이용하여 새롭게 띄워진 창에 포커스를주고 바로 크롤링을 진행하려하였지만
driver.getWindowHandles()
driver.switchTo()
처음에는 신규 팝업이 정상적으로 실행이 되었지만 간헐적으로 팝업을 인식못하는 문제가 발생하였습니다.
오류원인
이에 원인을 확인해보니 사이트 내부적인 문제로 팝업이 열리기전에 지연현상이 발생하는 걸 확인하고
해당 지연되는걸 잡기위해 확인하던 중 아래 함수를 발견하였습니다.
(https://stackoverflow.com/questions/58304316/wait-for-child-window-in-selenium-webdriver-using-java)
아래는 ExpectedConditions 클래스의 numberOfWindowsToBe 함수내용
public static ExpectedCondition<Boolean> numberOfWindowsToBe(final int expectedNumberOfWindows) {
return new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver driver) { //창 개수와 사용자가 원하는 창 개수가 일치한지 확인
try {
//일치여부 확인
return driver.getWindowHandles().size() == expectedNumberOfWindows;
} catch (WebDriverException var3) {
return null;
}
}
public String toString() {
return "number of open windows to be " + expectedNumberOfWindows;
}
};
}
numberOfWindowsToBe (사용법 포함)
단순히 열려있는 창의 개수(getWindowHandles)가 들어오는 파라메터(int)의 값과 동일한지 체크하게 해주는 함수인데
return 값이 ExpectedCondition<Boolean> 이기에 WebDriverWait 와 연계하여 아래와 같이 사용해주어
new WebDriverWait(driver,30).until(ExpectedConditions.numberOfWindowsToBe(2));
팝업이 실행되기 전 까지는 함수내부에서 getWindowHandles를 통하여도 그 값이 1이기에 기다리다가
팝업 열리는게 완료되면서 카운트가 2가되어 정상적으로 인식되며 대기가 종료되는걸 확인할 수 있었습니다.