본문 바로가기
● 크롤링, 자동화/Selenium

[김플 스튜디오] 구글 로그인, 메일 보내기 자동화 (selenium, webdriver, actionchains)

by 0ver-grow 2020. 5. 6.
반응형

실습 전 할 것

1. 내 크롬브라우저에 맞는 크롬드라이버를 다운

2. 실습하고자 하는 파이썬 파일에 해당 크롬 드라이버를 넣고 실습시작

=> 실습(실행)파일과 동일한 루트에 넣으면 따로 루트 지정필요없이

=> driver = webdriver.Chrome()만으로 실행가능

 

다음 코드를 입력

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains # 쭉 연결할 수 있게함

import time

driver = webdriver.Chrome()

url = "https://google.com"
driver.get(url)
# driver.maximize_window() # 최대창 실행
action = ActionChains(driver) # action변수로 driver제어

로그인 버튼 클릭하기

클래스,id 둘 다 있기 때문에 클래스보다 우선하는 id를 사용해서 클릭하도록 다음 코드 추가

driver.find_element_by_css_selector('#gb_70').click()

 

로그인 창, 아이디 입력하기

action변수를 이용한 로그인 창에서 아이디입력하기

action.send_keys('아이디').perform() # 아이디 입력후 바로 실행가능위해 perform()을 썼음
action.reset_actions() # 중복입력방지, 사용된 action이 다시 입력되는 것을 방지함

 

로그인 창, 다음 버튼 클릭하기

다음버튼의 class는 위와 같다. 상위 클래스인 CwaK9을 써도 된다.

driver.find_element_by_css_selector('.CwaK9').click()

 

지금까지의 코드

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

import time

driver = webdriver.Chrome()
url = "https://google.com"
driver.get(url)
# driver.maximize_window() # 최대창 실행
action = ActionChains(driver) # action변수로 driver제어

driver.find_element_by_css_selector('#gb_70').click() # 로그인 버튼 클릭

action.send_keys('study2025').perform() # 아이디입력
action.reset_actions()
driver.find_element_by_css_selector('.CwaK9').click() # 다음클릭

 

문제발생

다음버튼을 누를 순 있으나 진행이 불가함

로그인할 수 없습니다. 브라우저 또는 앱이 안전하지 않을 수 있습니다. 자세히 알아보기다른 브라우저를 사용해 보세요. 이미 지원되는 브라우저를 사용 중이면 화면을 새로고침한 후 로그인을 다시 시도해 보세요.

자동화 테스트 SW로 제어되는 브라우저라 안됨 



구글 로그인, 비밀번호 입력 후 다음버튼입력하기

 

time.sleep(2) # 소요시간 예상 텀주기

driver.find_element_by_css_selector('.whs0nd.zHQkBf').send_keys('비밀번호') # 비밀번호 입력

driver.find_element_by_css_selector('.CwaK9').click() # 다음버튼클릭

time.sleep(2) # 소요시간을 고려해야 엉뚱한 클래스로 들어가지 않음

 

로그인 후, 지메일로 들어가기

driver.get('https://mail.google.com/mail/u/0/?tab=wm&ogbl#inbox')

time.sleep(2)

편지쓰기클래스를 활용한 편지쓰기

driver.find_element_by_css_selector('.T-I.J-J5-Ji.T-I-KE.L3').click()

time.sleep(1)

 

실행결과화면

위와 같은 새 메일 창이 뜨면, 다른 키 쓰지 않고 바로 수신자 입력이 가능하다.

즉, 액션체인으로 다룰수있다는것!

고로 action키를 써서 코드를 작성하자

수신자메일 입력하기

action.send_keys('수신자메일').key_down(Keys.TAB).key_down(Keys.TAB).send_keys('제목입니다.').key_down(Keys.TAB).send_keys('내용은 여기에').perform()

# tab키 2번 쓰기.
왜 tab이냐? tab키를 2번 누르면 수신자 입력란에서 제목 입력란으로 넘어가기 때문

# 이어서 send_keys('')를 통해 바로 제목입력하기
actionChain이 가능하기에 바로 이어서 쓴 것

# tab키를 누른 후 내용 작성 후 실행하기

전체코드

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

import time

driver = webdriver.Chrome()
url = "https://google.com"
driver.get(url)
# driver.maximize_window() # 최대창 실행
action = ActionChains(driver) # action변수로 driver제어

driver.find_element_by_css_selector('#gb_70').click()

# 로그인 아이디 입력 후 다음 버튼 클릭
time.sleep(2) # 로그인시 시간 지연 될 수 있기에 텀주기
action.send_keys('로그인아이디').perform() # actionChain사용, 로그인 아이디입력
action.reset_actions() # 한 번 액션 후, 이 코드를 넣어줘야 앞서 사용한 action 재사용방지가능
driver.find_element_by_css_selector('.CwaK9').click()

# 비밀번호 입력 후 다음 버튼 클릭
time.sleep(2) # 소요시간 예상 텀주기
driver.find_element_by_css_selector('.whs0nd.zHQkBf').send_keys('비밀번호') # 비밀번호 입력
driver.find_element_by_css_selector('.CwaK9').click() # 다음버튼클릭
time.sleep(2) # 소요시간을 고려해야 엉뚱한 클래스로 들어가지 않음

# 지메일로 이동
driver.get('https://mail.google.com/mail/u/0/?tab=wm&ogbl#inbox') 
time.sleep(2)

# 메일보내기 클릭
driver.find_element_by_css_selector('.T-I.J-J5-Ji.T-I-KE.L3').click() 
time.sleep(1)

# 메일 내용 입력, 이메일, 제목, 내용
# 한줄코드가 긴 경우 ()를 통해 한줄처럼 인식가능
(
action.send_keys('수신자메일').key_down(Keys.TAB).key_down(Keys.TAB)
.send_keys('제목입니다.').key_down(Keys.TAB)
.send_keys('내용은 여기에')
.perform()
)

만약 내용을 쓸 때 다음줄에 입력을 하고 싶다면 다음과 같이 코드를 작성할 것

(
action.send_keys('수신자메일').key_down(Keys.TAB).key_down(Keys.TAB)
.send_keys('제목입니다.').key_down(Keys.TAB)
.send_keys('내용은 여기에').key_down(Keys.ENTER) # 다음 줄 입력이므로 ENTER
.key_down(Keys.SHIFT).send_keys('abcde') # SHIFT를 사용하여 대문자로. ABCDE가 작성됨
.key_up(Keys.SHIFT) # 다시 소문자로 전환
.perform()
)

여기서도 코드가 길기 때문에 pause(2)코드를 추가하여 잠시 텀을 주도록 하자.

(
action.send_keys('수신자메일').pause(2).key_down(Keys.TAB).key_down(Keys.TAB)
.send_keys('제목입니다.').pause(2).key_down(Keys.TAB)
.send_keys('내용은 여기에').pause(2).key_down(Keys.ENTER) # 다음 줄 입력이므로 ENTER
.key_down(Keys.SHIFT).send_keys('abcde') # SHIFT를 사용하여 대문자로. ABCDE가 작성됨
.key_up(Keys.SHIFT).pause(2) # 다시 소문자로 전환
.perform()
)

메일 보내기 버튼을 클릭하자

보내기 버튼과 관련된 여러 클래스명이 있는데, 이 중 보내기 버튼의 최상위 클래스명을 사용한다.

다음코드를 추가하자

send_button = driver.find_element_by_css_selector('.gU.Up') # 보내기 버튼을 변수를 지정하자

.move_to_element(send_button).click() # 이 코드를 쓰면 이 위치로 이동하여 클릭하게 된다.

최종 코드

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

import time

driver = webdriver.Chrome()
url = "https://google.com"
driver.get(url)
# driver.maximize_window() # 최대창 실행
action = ActionChains(driver) # action변수로 driver제어

driver.find_element_by_css_selector('#gb_70').click()

# 로그인 아이디 입력 후 다음 버튼 클릭
time.sleep(2) # 로그인시 시간 지연 될 수 있기에 텀주기
action.send_keys('로그인아이디').perform() # actionChain사용, 로그인 아이디입력
action.reset_actions() # 한 번 액션 후, 이 코드를 넣어줘야 앞서 사용한 action 재사용방지가능
driver.find_element_by_css_selector('.CwaK9').click()

# 비밀번호 입력 후 다음 버튼 클릭
time.sleep(2) # 소요시간 예상 텀주기
driver.find_element_by_css_selector('.whs0nd.zHQkBf').send_keys('비밀번호') # 비밀번호 입력
driver.find_element_by_css_selector('.CwaK9').click() # 다음버튼클릭
time.sleep(2) # 소요시간을 고려해야 엉뚱한 클래스로 들어가지 않음

# 지메일로 이동
driver.get('https://mail.google.com/mail/u/0/?tab=wm&ogbl#inbox') 
time.sleep(2)

# 메일보내기 클릭
driver.find_element_by_css_selector('.T-I.J-J5-Ji.T-I-KE.L3').click() 
time.sleep(1)

send_button = driver.find_element_by_css_selector('.gU.Up') # 보내기 버튼을 변수를 지정하자

# 메일 내용 입력, 이메일, 제목, 내용
# 한줄코드가 긴 경우 ()를 통해 한줄처럼 인식가능
(
action.send_keys('수신자메일').pause(2).key_down(Keys.TAB).key_down(Keys.TAB)
.send_keys('제목입니다.').pause(2).key_down(Keys.TAB)
.send_keys('내용은 여기에').pause(2).key_down(Keys.ENTER) # 다음 줄 입력이므로 ENTER
.key_down(Keys.SHIFT).send_keys('abcde') # SHIFT를 사용하여 대문자로. ABCDE가 작성됨
.key_up(Keys.SHIFT).pause(2) # 다시 소문자로 전환
.move_to_element(send_button).click() # 이 코드를 쓰면 이 위치로 이동하여 클릭하게 된다.
.perform()
)

 

학습 : https://www.youtube.com/watch?v=2EBrICPZVLY

번외 : 네이버 자동 로그인 하기

반응형