본문 바로가기
Python/Selenium

[Selenium] 메일 자동화 iframe 제어 방법

by 미눅스[멘토] 2024. 10. 12.
728x90

https://deahan.tistory.com/439

 

[Selenium] 메일 자동화 새창 제어 방법

우선 완성된 코드이다 복붙하기 편하게 맨위로from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.common.keys import Keysimport pyperclipimport timeuser_id = "alsdnvkdlxj"user_pw = "!Ehfdl22gh"#

deahan.tistory.com

여기까지 봤다면 이제는 메일 보내기까지 해야하지만 여기서 오류가 났을것이다

그것을 해결해보자.

 

 

우선 복붙 신공 하기 위한 최종코드

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import pyperclip
import time

user_id = "아이디"
user_pw = "비밀번호"

# 드라이버 생성
driver = webdriver.Chrome()
driver.maximize_window()

# 1. 로그인 페이지 이동
time.sleep(2)

# 2. 아이디 입력
id = driver.find_element(By.CSS_SELECTOR, "#id")
pyperclip.copy(user_id)
id.send_keys(Keys.CONTROL, 'v')
time.sleep(2)

# 3. 비밀번호 입력
pw = driver.find_element(By.CSS_SELECTOR, "#pw")
pyperclip.copy(user_pw)
pw.send_keys(Keys.CONTROL, 'v')
time.sleep(2)

# 4. 로그인 버튼 클릭
driver.find_element(By.CSS_SELECTOR, ".btn_login").click()

# 만약 이상한 기기등록 팝업창이 나온다면 네이버 메인 페이지로 이동한다
# driver.get("https://nid.naver.com/")

# 드롭다운 메뉴 클릭
driver.find_element(By.CSS_SELECTOR, "#account > div.MyView-module__my_menu___eF24q > div > div > ul > li:nth-child(1) > a > span.MyView-module__item_text___VTQQM").click()
time.sleep(1)

# 메일함 버튼 클릭
driver.find_element(By.CSS_SELECTOR, "#account > div.MyView-module__layer_menu_service___NqMyX > div.MyView-module__service_sub___wix9p > div.MyView-module__sub_left___AIWHR > a").click()

# 현재 열려있는 창 확인
driver.window_handles

# 새창으로 전환
driver.switch_to.window(driver.window_handles[1])
time.sleep(2)

# 메일쓰기 버튼 클릭
driver.find_element(By.CSS_SELECTOR, "#root > div > nav > div > div.lnb_header > div.lnb_task > a.item.button_write").click()
time.sleep(1)

# 받는 사람 입력
driver.find_element(By.CSS_SELECTOR, "#recipient_input_element").send_keys('minino0220@gmail.com')
time.sleep(1)

# 제목 입력
driver.find_element(By.CSS_SELECTOR, "#subject_title").send_keys('메일 자동화 테스트')
time.sleep(1)

iframe = driver.find_element(By.CSS_SELECTOR, "#content > div.contents_area > div > div.editor_area > div > div.editor_body > iframe")
driver.switch_to.frame(iframe)

# 본문 입력
driver.find_element(By.CSS_SELECTOR, "body > div > div.workseditor-content").send_keys('사실 너무 재미있음')
time.sleep(1)

# driver제어 이전화면으로 돌아오기
driver.switch_to.default_content()

# 보내기 버튼 클릭
driver.find_element(By.CSS_SELECTOR, "#content > div.mail_toolbar.type_write > div:nth-child(1) > div > button.button_write_task").click()

 

 


코드 풀이

 

# 받는 사람 입력
driver.find_element(By.CSS_SELECTOR, "#recipient_input_element").send_keys('user@gmail.com')

 

# 제목 입력
driver.find_element(By.CSS_SELECTOR, "#subject_title").send_keys('메일 자동화 테스트')

 

# 본문 입력
driver.find_element(By.CSS_SELECTOR, "body > div > div.workseditor-content").send_keys('사실 너무 재미있음')

 

여기서 # 본문 입력 코드를 돌려보면 아래와 같이 오류가 나는 것을 볼 수 있음 

이것은 driver는 하나의 페이지만 제어가 가능한데 이 본문을 입력하는곳은 메인 페이지 안에 itrame으로 2개의 페이지인것을 확인할 수 있다.

 

 

그래서 본문 입력하기 전에 driver의 제어를 ifram으로 바꿔줄 필요가 있다.

우선 iframe을 찾아 driver.switch_to.frame()함수로 제어를 바꿔주면 된다.

iframe = driver.find_element(By.CSS_SELECTOR, "#content > div.contents_area > div > div.editor_area > div > div.editor_body > iframe")
driver.switch_to.frame(iframe)

 

그리고 다시 본문 입력을 해보면 정상 작동하는 것을 볼 수 있다.

 

# 보내기 버튼 클릭
driver.find_element(By.CLASS_NAME, "#content > div.mail_toolbar.type_write > div:nth-child(1) > div > button.button_write_task").click()

 

여기서 다시 보내기 버튼을 클릭하면 또다시 오류가 나는데 그 이유는

보내기버튼은 iframe밖에있어 다시 제어를 전화면으로 돌아가야한다. 하지만 이번에는

귀찮게 css셀렉터 안쓰고 아래 간단한 명령어로 돌아올 수 있다.

# driver제어 이전화면으로 돌아오기
driver.switch_to.default_content()