본문 바로가기

자동화/Selenium

간단한 네이버 메일 자동화로 보내기 (With Selenium, Python)

728x90

이번에 해볼 자동화는 네이버 메일 보내기입니다.

네이버 로그인 부터 메일 보내기 성공 화면까지 볼 수 있는 자동화를 구현해보았습니다.

 

메일 URL로 바로 접근하여 네이버 로그인을 할 수 있게 코드를 작성하였습니다.

모두 ID값을 가지고 있어서 쉬운 코드를 작성할 수 있었습니다.

 

driver.get('https://mail.naver.com')

driver.find_element(By.ID, 'id').send_keys(ID입력창)
driver.find_element(By.ID, 'pw').send_keys(PW입력창)
driver.find_element(By.ID, 'log.login').click()

 

최대한 시간을 줄이고자 time.sleep보다는 wait를 자주 사용하여 빠르게 시간을 단축할 수 있도록 구현하였습니다.

아래는 로그인 후 메일 쓰기 > 주소 입력창이 뜰때까지 대기하는 코드입니다.

 

driver.implicitly_wait(5)
driver.find_element(By.CLASS_NAME, 'item.button_write').click()

wait = WebDriverWait(driver, 5)
wait.until(EC.element_to_be_clickable((By.ID, 'user_input_1')))

 

보낼메일 주소와 메일 제목 입력하는 동작을 send_keys 기능을 통해 구현하였습니다.

반복해서 코드를 실행하면 가끔씩 메일주소 입력하는 동작이 제대로 동작하지 않고 바로 넘어가는 경우가 발견되어 그 부분을 방지하고자

메일주소 입력하는 element를 click하는 코드를 추가하여 동작이 실패하지 않도록 구현하였습니다.

(이렇게 하니 10번 시도했을 때 실패가 없었습니다.)

 

driver.find_element(By.ID, 'user_input_1').click()
driver.find_element(By.ID, 'user_input_1').send_keys(보낼메일주소)
driver.find_element(By.ID, 'subject_title').send_keys(메일제목)

 

메일 본문 내용을 작성하기 위해 확인해보니 frame을 변경해야 하는 상황이었습니다.

메일 쓰기에 사용되는 iframe 수는 총 7개였는데 해당 프레임 코드를 살펴보니 ID값 등 특정 속성값으로 코드를 구현하기 어려움이 있었습니다.

그래서 숫자를 통해 특정 프레임으로 이동하는 코드를 사용하였습니다. [switch_to.frame(4)]

 

프레임을 이동하기 전 wait를 사용하였는데 반복시 정상 동작하지 않을 수도 있어서 그럴때에는 time.sleep 기능을 사용하면 해결이 됩니다.

 

메일 본문 작성 후 parent_frame으로 다시 상위 프레임으로 돌아와 보내기 버튼을 누르는 코드를 작성하였습니다.

 

driver.implicitly_wait(3)
#time.sleep(2)

driver.switch_to.frame(4)
driver.find_element(By.CLASS_NAME, 'workseditor-content').send_keys('test1 test2 test3')

driver.switch_to.parent_frame()
driver.find_element(By.CLASS_NAME, 'button_write_task').click()

 

전체 코드입니다. 해당 코드 실행시 10초 정도로 메일 보내기를 자동화를 통해 편리하게 보낼 수 있음을 확인할 수 있었습니다.

 

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

driver.get('https://mail.naver.com')

# 네이버 로그인
driver.find_element(By.ID, 'id').send_keys(ID입력창)
driver.find_element(By.ID, 'pw').send_keys(PW입력창)
driver.find_element(By.ID, 'log.login').click()

# 보내기 버튼 클릭
driver.implicitly_wait(5)
driver.find_element(By.CLASS_NAME, 'item.button_write').click()

wait = WebDriverWait(driver, 5)
wait.until(EC.element_to_be_clickable((By.ID, 'user_input_1')))

driver.find_element(By.ID, 'user_input_1').click()
driver.find_element(By.ID, 'user_input_1').send_keys(보낼메일주소)
driver.find_element(By.ID, 'subject_title').send_keys(메일제목)

driver.implicitly_wait(3)
#time.sleep(2)

# 프레임 변경 후 본문 작성
driver.switch_to.frame(4)
driver.find_element(By.CLASS_NAME, 'workseditor-content').send_keys('test1 test2 test3')

# 상위 프레임 이동 후 메일 보내기
driver.switch_to.parent_frame()
driver.find_element(By.CLASS_NAME, 'button_write_task').click()

# 성공 화면 보기
time.sleep(3)
print("메일 보내기 성공!")
driver.close()

 

728x90