문제 발생
Selenum으로 A URL -> B URL 이동 후 현재 URL 값을 구하고자 했다.
Java에서는
driver.getCurrentUrl()
현재 URL에 접근할 수 있다.
따라서 A URL -> B URL 이동 후 getCurrentUrl() 사용시 B URL이 반환 될 것이라 기대했다.
하지만 결과는 A URL 이었다.
원인 파악
내가 간과했던 점은 URL 이동 동작 방식을 정확히 인지하지 못했다는 점이다.
URL 동작 방식에는
- 현재 페이지에서 해당 URL로 이동
- 추가 페이지를 생성 [ TAB ]
2가지 경우가 있다. 그리고 나는 2번째였다.
B URL로 이동하는 WebElements를 클릭했을 때 A -> B로 변환되는 것이 아니라 A는 그대로 있고 B가 추가로 생성되었다.
WebDriver는 여전히 A를 바라보고 있었고 따라서 getCurrentUrl() 시 결과 값이 A였던 것이다.
.
문제 해결
// Tab 목록 조회
Set<String> tabSet = driver.getWindowHandles();
// Set 조회를 위한 Iterator 생성
Iterator<String> it = tabSet.iterator();
// Set -> List로 변환
List<String> tabList = new ArrayList<>();
while (it.hasNext()) {
tabList.add(it.next());
}
// tab List : [CDwindow-E54311E271EF8049EE0901CFE172BF4B, CDwindow-CC66C40C1F65C87F300BBAD45376FAA3]
// 2번째 탭으로 이동 [지도]
driver.switchTo().window(tabList.get(1));
코드 설명
1. driver.getWindowHandles()로 Tab 리스트 데이터를 조회한다.
2. driver.switchTo().window()로 WebDriver가 2 번째 페이지 즉 B URL을 바라볼 수 있도록 한다.
3. driver.getCurrentUrl()로 현재 URL을 조회한다.
생각해 볼 점
나는 크롤링을 할 때
options.addArguments("--disable-popup-blocking"); //팝업안띄움
options.addArguments("--disable-gpu"); //gpu 비활성화
options.addArguments("--blink-settings=imagesEnabled=false"); //이미지 다운 안받음
options.addArguments("--headless");
options.addArguments("--no-sandbox"); // linux 용
options.addArguments("--disable-dev-shm-usage"); //linux 용
해당 옵션으로 실제 화면이 출력되는 것을 지양해왔다. ( 테스트 시 시간이 오래 걸리므로 )
하지만 해당 이유로 원인분석에 상당한 시간이 걸렸다.
크롤링 시에는 시간이 좀 걸리더라도 내가 의도한대로 동작하는지 창을 확인하면서 개발하는게 좋지 않을까 생각해본다.