Completion over Perfection

파이썬(Python)으로 로또 매일 1개씩 자동구매하기 (2-3탄 - 개발 구현) 본문

파이썬 (Python)

파이썬(Python)으로 로또 매일 1개씩 자동구매하기 (2-3탄 - 개발 구현)

난차차 2020. 7. 4. 12:42
반응형

 파이썬(Python)으로 로또 매일 1개씩 자동구매하기 (2-3탄 - 개발 구현)

 

 

지난 포스팅에 이어서 작성합니다.

지난 글을 보시려면 아래 링크로 이동해 주세요~

 

2-1) 동행복권 사이트 자동으로 띄우기 보러가기

2-2) 자동으로 팝업창 닫고 로그인 시키기 보러가기

 

 

파이썬(Python)으로 로또 매일 1개씩 자동구매하기 (2-2탄 - 개발 구현)

파이썬(Python)으로 로또 매일 1개씩 자동구매하기 (2-2탄 - 개발 구현하기) 지난 포스트 2-1탄에 이어서 작성합니다. (2-1탄 보러 가기) 2-1탄에서는 실제 로또 구매 사이트인 동행복권 온라인 페이지�

nanchachaa.tistory.com

 

지난 시간에 로그인까지 자동으로 시켜봤고,

실제 구매를 하는 팝업창까지 띄워보았습니다.

띄워진 팝업창은 아래 스크린샷 처럼 생겼었죠.

 

로또를 구매하기 위한 팝업창

여기에서 저희는 자동번호발급을 선택하겠습니다.

그런데....

 

그란데 말입니다

예상치 못한 에러가 발생합니다.

 

팝업창에서 자동번호발급 버튼은 xpath 보기로 해봤을 때 아래와 같습니다.

 

driver.find_element_by_xpath('//*[@id="num2"]').click()

 

f12 개발자도구를 통해 xpath를 확인하자

 

이렇게 실행하면 element를 찾을 수 없다고 나옵니다.

 

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="num2"]"}

  (Session info: chrome=83.0.4103.116)

 

이유가 뭐지???

하고 찾아보니 화려한 iframe으로 감싸져있네요.

 

힌트는 바로 이곳! iframe으로 감싸져 있었다

 

Selenium webdriver로 iframe창을 전환해보자

 

iframe이란 창 속의 창 이라고 생각하시면 됩니다.

우리가 보기에는 하나의 창으로 보이지만

사실 저 팝업창은 2개의 창이 하나의 창처럼 보여지고 있는 겁니다.

 

우리가 위에서 로그인 후에 로또 6/45버튼을 눌렀을 때 뜨는 창을 A라고 하고,

저 자동번호발급버튼이 들어있는 창을 B라고 하면

우리는 A창을 제어하고 있으므로 B창에 있는 버튼을 못찾겠다고 에러가 뜨는겁니다.

 

 

대충 이런식으로 되어 있다고 보면 된다

그래서 해줘야하는 작업은,

셀레니움 selenium 에서 B창으로 제어하려는 창을 옮기고 난 뒤에

자동번호발급 버튼을 클릭해줘야 합니다.

 

그럼 한번 옮겨보고 버튼도 클릭해보도록 하겠습니다.

 

B창으로 옮기려면 해당 창의 이름을 알아야 합니다.

이름을 알기 위해서 아래와 같이 코드를 짜고 확인해보도록 하겠습니다.

 

iframes = driver.find_elements_by_css_selector('iframe') #iframe이 여러개 있을 경우를 대비
for iframe in iframes:
    print(iframe.get_attribute('name')) #iframe들의 이름을 프린트

 

나온 결과를 살펴보겠습니다.

 

ifrm_tab

 

콘솔창에 이렇게 찍혔습니다.

B창의 이름은 "ifrm_tab" 이라네요.

그럼 저 이름의 창으로 제어창을 옮겨주면 되겠습니다.

 

아래와 같이 코드를 짜줍니다.

 

driver.switch_to.frame('ifrm_tab')

 

그런 뒤에 아까 실행했을 때 에러가 났던

자동번호발급 element를 선택해보도록 하겠습니다.

 

driver.switch_to.frame('ifrm_tab')
driver.find_element_by_xpath('//*[@id="num2"]').click()
# 자동으로 구매하기 버튼 클릭하기

 

클릭이 잘 된다!!

성공했습니다!

클릭이 잘 되네요~

 

구매수량은 1개이니 그대로 놔두면 되고,

확인 버튼을 누르고 우측에 있는 구매하기 버튼을 누르면 끝이 날 것 같습니다.

 

아래와 같이 코드를 짜주니 구매하기 버튼까지 잘 클릭이 됩니다.

 

driver.find_element_by_xpath('//*[@id="btnSelectNum"]').click() # 확인버튼 클릭하기_좌측창
driver.find_element_by_xpath('//*[@id="btnBuy"]').click()
#구매하기 버튼 클릭하기_우측창

 

모두 잘 클릭되었다!

실행해보니 잘 돌아가는데 마지막 관문이 기다리고 있네요.

 

Selenium webdriver에서 얼럿 Alert 창 컨트롤 하기

 

구매하기 버튼만 누르면 끝날 줄 알았는데,

마지막으로 얼럿창으로 확인을 해주네요.

 

"구매하시겠습니까?"

 

이 얼럿창에서 확인 버튼을 눌러줘야 됩니다.

 

alert창을 컨트롤하는 방법은

위에서 iframe 창을 컨트롤했을 때와 마찬가지로

driver.switch_to.alert 함수를 써서 제어하려는 창을 선택해줘야 합니다.

 

아래와 같이 코드를 짜고 실행해보겠습니다.

 

#얼럿창을 함수에 담기

alert = driver.switch_to.alert 

#얼럿창의 메세지를 msg변수에 담기

msg = alert.text

#msg 변수 출력하기

print(msg)

 

결과는 아래와 같이 나옵니다.

 

구매하시겠습니까? 메세지가 출력된다.

 

그럼 팝업창도 정상적으로 선택이 되니, 확인 버튼을 눌러주도록 하겠습니다.

확인 버튼을 누르는 방법은 alert.accept()를 추가해주면 됩니다.

 

#얼럿창 확인버튼 누르기

alert.accept()

 

구매가 정상적으로 완료되었다!

 

정상적으로 구매가 완료되었네요!

 

 

자동구매 프로젝트를 마무리하며..

 

사실 시작할때는 간단할 거라 생각했는데 

iframe창도 존재하고 있었고,

팝업창도 있어서 단순하지만은 않았습니다.

 

자동화를 진행하시다보면 많이 마주치는 상황이기 때문에

iframe전환과 얼럿창 처리는 꼭 같이 숙지하시기 바랍니다.

 

다음 포스팅에서는 위에 짠 파이썬 코드를

매일매일 자동으로 돌아가도록 하는 스케쥴러 세팅을 한번 해보도록 하겠습니다.

 

집에 놀고있는 라즈베리파이가 있어서

라즈베리파이로 세팅을 할 예정입니다.

 

그럼 다음 포스팅에서 뵈요~

 

 

반응형
Comments