셀레니움을 이용해서 웹브라우저 자동화를 만들때에 예상치 못합 팝업창이 떠서 내가 생각한 자동화 로직이 깨질때가 있습니다. 이럴 때는 팝업창을 감지해서 팝업창을 닫아줘야 합니다. 요즘은 팝업창이 자주 발생하지는 않지만
새로운 팝업창 감지는
먼저 새로운 팝업을 알아내려면 이전까지의 브라우저
이렇게 하면 현재 열려있는 브라우저의 탭을 가져올 수 있습니다. tabs는 리스트이며, 현재 탭이 2개라면 2개의 핸들이 들어있게 됩니다. 이렇게 탭이 2개 일 경우 코드를 실행하면 리스트로 된 탭 값을 얻을 수 있습니다.
새로운 팝업, 탭이 오픈이 된 것은
0를 실행하여서 종료시킵니다. 그리고 나서 저장해둔 현재 핸들로 전환 후 원하는 코드를 실행 하면 됩니다. selenium 강의 보고서 진행하다보니, 저는 프로그램이 정상적으로 종료되면 크롬창도 닫혀 버립니다. cslose() 나 quit()를 사용하지 않아도 그러는데 프로그램이 종료되어도 유지되도록 할 순 없나요? 구글에서 검색해보니 사용하는 크롬과 크롬드라이버 버전이 다르면 그럴수 있다고 해서 확인해보니 둘 다 79. 으로 시작하는 버전을 사용하고 있습니다. Selenium에서 종료하는 명령어는 총 3가지가 있습니다.
driver.Dispose(); driver.Close(); driver.Quit();
다 종료하다는 의미를 가지고 있는데 그 차이가 무엇인지 오늘 알아보고, 프로그램 종료 후 Selenium 서비스를 완전히 종료하는 법을 알려드리겠습니다.
우선 Selenium 종료를 위해 driver.Close()를 시행해봅니다.
Selenium이 컨트롤 하고있는 웹 브라우저는 꺼지지만 다음과 같은 콘솔 창이 남아있게 됩니다. 이것으로 알 수 있는건 driver.Close()는 현재 Selenium이 컨트롤하고 있는 (활성화된) 창을 닫는 기능을 한다는 걸 알 수 있습니다.
웹 브라우저가 꺼진 이유는 제가 창을 하나만 열어놔서 그렇습니다. 탭을 여러 만들면 활성화된 창 하나만 딱 종료됩니다.
활성화된 창만 닫기 때문에 현재 창을 닫고 새로 창을 만들어서 재활용이 가능합니다. 즉 Selenium 서비스가 메모리에 그대로 상주하고 있습니다. 만약 Selenium을 완벽히 제거하기 위해선 close()를 사용해선 안됩니다.
그다음은 driver.Quit()입니다. 시행 시 웹 드라이버, 열린 모든 창을 닫습니다. 아까 같은 콘솔 창이 남아있지 않고 같이 종료된 것을 확인 가능합니다.
driver.Quit()이 작동하게 되면 driver.Dispose()를 호출합니다. driver.Dispose()의 역할은 웹 드라이버, 열린 모든 창을 닫습니다.
즉 driver.Quit()의 역할, driver.Dispose()의 역할은 동일하다고 볼 수 있습니다.
정리driver.Close()는 현재 Selenium이 작업하는 활성화된 창 하나를 종료함 (실제로 웹 드라이버는 종료되지 않고 메모리에 그대로 상주하기 때문에 웹 드라이버를 계속 재활용 가능함.)
창 하나에서만 작업한 경우 언뜻 보면 Quit()과 동일해 보이나 Selenium 서비스가 완전하게 종료되지 않는다. 즉 이것으로 종료됐다고 생각하고 웹 드라이버를 계속 선언하면 메모리에 계속 쌓이기 때문에 메모리 누수 문제가 발생할 수 있다.
driver.Quit() = driver.Dispose()로 브라우저에서 열린 모든 창, 웹 드라이버를 종료함
결론
프로그램 종료 시에 Selenium을 깔끔하게 지우고 싶다면 위 코드 driver.Quit()을 이용하세요. (대부분 dispose가 아니라 quit을 많이 사용하는듯함.)
공유하기 게시글 관리 구독하기파일의 IT 블로그저작자표시 비영리 변경금지
'프로그래밍 > C#' 카테고리의 다른 글[C#] 자연스러운 정렬(natural sort) 사용하기 (0)2020.09.16[C#] Selenium IEDRIVER이 작동하지 않을때 해결법 (0)2020.03.23[C#] 음성인식 검색기 만들기 0편. 구상 (0)2020.03.23[C#] NAUDIO 로 마이크 볼륨레벨 가져오기 (0)2020.03.21[C#] 구글 API를 이용한 마이크 음성인식 (0)2020.03.20 |