파이썬으로 시작하는 셀레니움 - 07
파이썬으로 셀레니움을 사용할 수 있다.
파이썬으로 시작하는 셀레니움 - 07
[프레임과 팝업 처리]
웹 페이지에서는 <iframe>
을 통해 외부 페이지가 삽입되거나, 경고창(alert), 새 창/탭 등이 열리는 경우가 있다.
이 장에서는 이러한 특수한 구조를 제어하는 방법을 다룬다.
1. iframe 접근
HTML 문서 안에 또 다른 HTML 문서를 삽입할 수 있는 <iframe>
은 다른 DOM(Document Object Model) 을 가지기 때문에, iframe 내부 요소에 접근하려면 반드시 frame 전환이 필요하다.
1
2
3
4
5
6
7
8
9
10
from selenium.webdriver.common.by import By
# iframe 요소로 전환 (id 또는 요소 객체로 지정 가능)
driver.switch_to.frame("iframe-id")
# 전환 후 내부 요소에 찾기
inner_element = driver.find_element(By.ID, "inside-frame")
# 다시 기본 페이지(메인 프레임)로 전환
driver.switch_to.default_content()
방법 | 설명 |
---|---|
driver.switch_to.frame(“id”) | iframe의 id 속성값으로 전환 |
driver.switch_to.frame(0) | 첫 번째 iframe으로 전환 (index로 지정) |
driver.switch_to.frame(요소) | 먼저 찾은 iframe 요소(WebElement)로 전환 |
프레임 내부 작업이 끝나면, 반드시
driver.switch_to.default_content()
로 메인 프레임으로 돌아와야 다른 요소에 접근할 수 있다.
2. 알림창 처리
웹 페이지에서 자바스크립트를 통해 띄우는 알림창은 HTML DOM에 존재하지 않기 때문에 find_element()로는 찾을 수 없다.
Selenium에서는 Alert 클래스를 사용해 제어한다.
1
2
3
4
5
6
7
from selenium.webdriver.common.alert import Alert
# 알림창이 나타났을 때 전환
alert = Alert(driver)
# 확인(OK) 클릭
alert.accept()
알림창 종류 | 메서드 사용 예시 |
---|---|
alert | alert.accept() |
confirm | alert.accept() 또는 alert.dismiss() |
prompt | alert.send_keys(“입력값”) 후 alert.accept() |
알림창이 뜨기 전에 접근하려 하면 NoAlertPresentException 예외가 발생한다.
상황에 따라 WebDriverWait으로 alert가 나타날 때까지 기다리는 것이 좋다.
3. 새 창/탭 전환
웹사이트에서 링크를 클릭하면 새로운 창이나 탭이 열리는 경우가 있다.
Selenium은 기본적으로 원래 창에서 작업을 계속하므로, 새 창으로 전환해서 작업한 뒤, 다시 원래 창으로 돌아오는 과정이 필요하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from selenium.webdriver.common.by import By
# 현재 창의 핸들(ID) 저장
main_window = driver.current_window_handle
# 새 창을 여는 버튼 클릭
driver.find_element(By.ID, "open-window-btn").click()
# 모든 창의 핸들 목록 가져오기
window_handles = driver.window_handles
# 마지막에 열린 창으로 전환
driver.switch_to.window(window_handles[-1])
# 새 창에서 작업 수행
print("새 창 제목:", driver.title)
# 작업 후 다시 원래 창으로 돌아가기
driver.switch_to.window(main_window)
메서드 | 설명 |
---|---|
driver.current_window_handle | 현재 활성화된 창의 고유 ID 반환 |
driver.window_handles | 모든 열린 창(탭)의 ID 리스트 반환 |
driver.switch_to.window(handle) | 지정한 창으로 포커스를 전환 |
새 창에서 작업을 수행할 경우,
WebDriverWait
을 이용해 새 창의 로딩이 완료된 후 작업하는 것이 좋다.
This post is licensed under CC BY 4.0 by the author.