Python selenium 탭 닫기 - Python selenium taeb dadgi

def close_new_tabs(driver):
    tabs = driver.window_handles
    while len(tabs) != 1:
        driver.switch_to.window(tabs[1])
        driver.close()
        tabs = driver.window_handles
    driver.switch_to.window(tabs[0])

driver.window_handles 에는 default 창을 포함한 창들이 저장되어있다.

while 문을 통해 첫번째 tab[0] 창을 제외한 모든 창을 닫는다.  

마지막으로는 반드시 switch_to.window 로 첫번째 창으로 돌아와야한다.

selenium 새 탭 열기

실제 사람이 인터넷에서 새로운 탭을 열기 위해서는 Ctrl + Mouse Click으로 새탭을 엽니다.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

browser = webdriver.Chrome()
browser.get("http://www.google.com")

# 본인이 클릭하고 싶은 것 클릭
target = browser.find_element_by_css_selector("div.gb_e a")
# window 새로운 탭 열기
target.send_keys(Keys.CONTROL + "\n")
mac 새로운 탭 열기
# target.send_keys(Keys.COMMAND +"\n")

Python selenium 탭 닫기 - Python selenium taeb dadgi

target에 send_keys를 이용해 a tag에 Ctrl + Click을 보내어 새로운 탭을 열게됩니다.
mac의 경우에는 Ctrl + Click이 아닌 Command + Click을 보내야 합니다.


Python selenium 탭 닫기 - Python selenium taeb dadgi

send_keys는 현재 browser 초점이 맞춰진 요소에 대해 키값을 보냅니다.
send_keys 매개변수로 Keys class에 선언되어 있는 상수들을 넣으시면 됩니다.

Python selenium 탭 닫기 - Python selenium taeb dadgi

target.send_keys(Keys.CONTROL + "\n")를 살펴보면

Keys.CONTROL은 selenium 상에서 Ctrl 키이며 \n은 엔터를 의미합니다.
엔터(\n)는 클릭과 동일하기 때문에 Ctrl + Click을 하라는 의미가 됩니다.


target.send_keys(Keys.COMMAND + "\n")를 살펴보면
위와 동일하게 Command + Click을 하라는 의미입니다.

Python selenium 탭 닫기 - Python selenium taeb dadgi

google -> gmail click(새로운 탭)

Python selenium 탭 닫기 - Python selenium taeb dadgi

selenium 탭 전환

Python selenium 탭 닫기 - Python selenium taeb dadgi

새로운 탭을 열었을 시 selenium은 default로 parent window 창을 초점으로 잡고 있기에 탭 전환이 필요합니다.


Python selenium 탭 닫기 - Python selenium taeb dadgi

selenium 탭을 전환하기 위해서는 switch_to_window()를 사용해야 합니다.

매개변수로 window_name을 넣어야하는데
각 window 별 name은 selenium의 window_handles 함수로 알 수 있습니다.


window_handles

Python selenium 탭 닫기 - Python selenium taeb dadgi

현재 활성화 된 window_name를 list 형식으로 반환합니다.

print(browser.window_handles)

# 출력
# [ 'CDwindow-6FE9F5DBE81F5896CC9B47271CED490E',
# 'CDwindow-3D485A02396414CCD1189B3A01AA72D1' ]

탭을 연 순서에 따라 0, 1의 인덱스를 가지며
ex) 3개의 탭이 열려있다면 순서대로 0, 1, 2의 인덱스를 가집니다.


새로운 탭으로 초점을 전환
browser.switch_to_window(browser.window_handles[1])


새로운 탭을 열더라고 selenium은 parent window 창을 초점으로 잡고 있으니 탭을 전환합니다.

browser.window_handles[1]을 사용해서 2번째 탭으로 이동하라고 명시했습니다.

2번째 탭 활성화

Python selenium 탭 닫기 - Python selenium taeb dadgi

browser 종료

# 현재 탭 종료
browser.close()
# 첫번째 탭으로 전환
browser.switch_to_window(browser.window_handles[0])

현재 browser의 초점이 맞춰진 해당 탭만 닫습니다.
사용 중인 탭을 닫더라도 browser의 초점이 자동으로 이동하지 않습니다.
사용할 탭을 다시 지정해주어야 합니다.


# 모든 탭 종료
browser.quit()

close()와 quit()의 차이점이 궁금하신 분은 아래의 링크를 참조하세요.
selenium close와 quit의 차이점
https://daeunginfo.blogspot.com/2019/06/python-selenium-close-quit.html

전체코드

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

browser = webdriver.Chrome()
browser.get("http://www.google.com")

# 본인이 클릭하고 싶은 것 클릭
target = browser.find_element_by_css_selector("div.gb_e a")
# window 새로운 탭 열기
target.send_keys(Keys.CONTROL + "\n")
mac 새로운 탭 열기
# target.send_keys(Keys.COMMAND +"\n")

# window_name 출력
print(browser.window_handles)

# 새로운 탭으로 초점을 전환
browser.switch_to_window(browser.window_handles[1])
# 현재 탭 종료browser.close()
# 첫번째 탭으로 전환
browser.switch_to_window(browser.window_handles[0])

# 모든 탭 종료
# browser.quit()

참고문헌

  • https://m.blog.naver.com/PostView.nhn?blogId=kiddwannabe&logNo=221449593300&proxyReferer=https%3A%2F%2Fwww.google.com%2F
  • https://selenium-python.readthedocs.io/api.html#selenium.webdriver.remote.webdriver.WebDriver.window_handles
  • https://www.techbeamers.com/switch-between-windows-selenium-python/

https://daeunginfo.blogspot.com/2019/05/python-selenium.html