파이썬 selenium 브라우저 종료 - paisseon selenium beulaujeo jonglyo

셀레니움을 이용해서 웹브라우저 자동화를 만들때에 예상치 못합 팝업창이 떠서 내가 생각한 자동화 로직이 깨질때가 있습니다. 이럴 때는 팝업창을 감지해서 팝업창을 닫아줘야 합니다. 요즘은 팝업창이 자주 발생하지는 않지만

 

새로운 팝업창 감지는 WebDriverWaitexpected_conditions를 통해서 알 수 있습니다. 해당 기능을 통해서 페이지의 로딩, 경고창 등 역시 감지 할 수 있습니다.

 

먼저 새로운 팝업을 알아내려면 이전까지의 브라우저 handles을 알아야 합니다. 팝업이란 것 역시 새로운 창 handle이기 때문입니다.

 

browser = webdriver.Chrome(ChromeDriverManager().install())
tabs = browser.window_handles

이렇게 하면 현재 열려있는 브라우저의 탭을 가져올 수 있습니다. tabs는 리스트이며, 현재 탭이 2개라면 2개의 핸들이 들어있게 됩니다.

파이썬 selenium 브라우저 종료 - paisseon selenium beulaujeo jonglyo
파이썬 selenium 브라우저 종료 - paisseon selenium beulaujeo jonglyo

이렇게 탭이 2개 일 경우 코드를 실행하면 리스트로 된 탭 값을 얻을 수 있습니다.

#이전 까지의 핸들리스트를 넣어준다. 따로 저장을 해두던지 지정한 코드 전에 현재 핸들로 체크한다.
window_handles = browser.window_handles

# ...자동화 코드 실행...

# 팝업이 있는지 체크
new_popup = WebDriverWait(browser, 2).until(EC.new_window_is_opened(window_handles))

새로운 팝업, 탭이 오픈이 된 것은 expected_conditions을 통해서 알 수 있다고 했습니다. 조건은 new_window_is_opened입니다. 여기에는 이전 핸들리스트를 넣어주면됩니다. 저는 카페 가입을 하고나서 가입 인사 팝업이 발생하여서 해당 코드를 추가했습니다. 최초에 설정한 핸들 리스트를 저장해두고 코드 실행 후 팝업 체크때 사용했습니다.

current_handle = browser.current_window_handle;
browser.switch_to.window('새로운 팝업 핸들')
browser.close()
browser.switch_to.window(current_handle)

current_window_handle로 현재 브라우저 핸들을 저장해 두고 팝업의 핸들을 찾아서 전환한 다음

#이전 까지의 핸들리스트를 넣어준다. 따로 저장을 해두던지 지정한 코드 전에 현재 핸들로 체크한다.
window_handles = browser.window_handles

# ...자동화 코드 실행...

# 팝업이 있는지 체크
new_popup = WebDriverWait(browser, 2).until(EC.new_window_is_opened(window_handles))
0를 실행하여서 종료시킵니다. 그리고 나서 저장해둔 현재 핸들로 전환 후 원하는 코드를 실행 하면 됩니다.

selenium 강의 보고서 진행하다보니, 저는 프로그램이 정상적으로 종료되면 크롬창도 닫혀 버립니다.

cslose() 나 quit()를 사용하지 않아도 그러는데 프로그램이 종료되어도 유지되도록 할 순 없나요?

구글에서 검색해보니 사용하는 크롬과 크롬드라이버 버전이 다르면 그럴수 있다고 해서 확인해보니 둘 다 79. 으로 시작하는 버전을 사용하고 있습니다.

Selenium에서 종료하는 명령어는 총 3가지가 있습니다.

 

driver.Dispose();

driver.Close();

driver.Quit();

 

다 종료하다는 의미를 가지고 있는데 그 차이가 무엇인지 오늘 알아보고,

프로그램 종료 후 Selenium 서비스를 완전히 종료하는 법을 알려드리겠습니다.

 

 

      IWebDriver driver = new InternetExplorerDriver(); //선언
      
         private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            driver.Close();
        }

우선 Selenium 종료를 위해 driver.Close()를 시행해봅니다.

 

파이썬 selenium 브라우저 종료 - paisseon selenium beulaujeo jonglyo

Selenium이 컨트롤 하고있는 웹 브라우저는 꺼지지만 다음과 같은 콘솔 창이 남아있게 됩니다.

이것으로 알 수 있는건 driver.Close()는 현재 Selenium이 컨트롤하고 있는 (활성화된) 창을 닫는 기능을 한다는 걸 알 수 있습니다.

 

웹 브라우저가 꺼진 이유는 제가 창을 하나만 열어놔서 그렇습니다. 탭을 여러 만들면 활성화된

창 하나만 딱 종료됩니다.

 

활성화된 창만 닫기 때문에 현재 창을 닫고 새로 창을 만들어서 재활용이 가능합니다.

즉 Selenium 서비스가 메모리에 그대로 상주하고 있습니다. 

만약 Selenium을 완벽히 제거하기 위해선 close()를 사용해선 안됩니다.

 

 

      IWebDriver driver = new InternetExplorerDriver(); //선언
      
         private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            driver.Quit();
        }

그다음은 driver.Quit()입니다.

시행 시 웹 드라이버, 열린 모든 창을 닫습니다. 아까 같은 콘솔 창이 남아있지 않고 같이 종료된 것을 확인 가능합니다.

 

driver.Quit()이 작동하게 되면 driver.Dispose()를 호출합니다.

driver.Dispose()의 역할은 웹 드라이버, 열린 모든 창을 닫습니다.

 

즉 driver.Quit()의 역할, driver.Dispose()의 역할은 동일하다고 볼 수 있습니다.

 

정리

driver.Close()는 현재 Selenium이 작업하는 활성화된 창 하나를 종료함 

(실제로 웹 드라이버는 종료되지 않고 메모리에 그대로 상주하기 때문에 웹 드라이버를 계속 재활용 가능함.)

 

창 하나에서만 작업한 경우 언뜻 보면 Quit()과 동일해 보이나 Selenium 서비스가 완전하게 종료되지 않는다.

즉 이것으로 종료됐다고 생각하고 웹 드라이버를 계속 선언하면 메모리에 계속 쌓이기 때문에

메모리 누수 문제가 발생할 수 있다.

 

driver.Quit() = driver.Dispose()로 브라우저에서 열린 모든 창, 웹 드라이버를 종료함

 

결론

      IWebDriver driver = new InternetExplorerDriver(); //선언
      
         private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            driver.Quit();
        }

프로그램 종료 시에 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