[Selenium] Selenium 을 이용하여 복권 구매 자동화 만들어보기 #3

 오늘은 동행복권 사이트 로그인 기능을 만들어 보려합니다. 로그인 과정에 필요한 기능은 간단하게 아래와 같습니다.


1. 버튼 클릭 기능

2. input 에 텍스트 입력 기능


이전 단계에서 팝업 닫고 메인 페이지로 돌아오도록 하였습니다. 로그인 단계를 selenium 단계로 보면 아래와 같습니다. 


1. 메인페이지에서 로그인 버튼 찾기

2. 로그인 버튼 클릭

3. 아이디 input 찾기

4. 아이디 입력

5. 비밀번호 input 찾기

6. 비밀번호 입력

7. 엔터키 입력



위 작업은 간단하기 때문에 사전에 필요한 작업을 먼저 하겠습니다.


python-dotenv 설치


pip install python-dotenv


python-dotenv 의 역할은 .env 파일을 읽어올 수 있게 합니다.



클릭 함수 작성

def click(element):
    element.click()


위 함수는 보이시는대로 element 를 넘겨주면 클릭하는 함수입니다.



문자 입력 함수 작성

def send_keys(element, text):
    element.send_keys(text)


위 코드도 보이시는대로 문자를 입력하는 함수입니다. 처음 보면 생소할 수 있지만 selenium 에서는 send_keys 를 사용하여 문자를 입력합니다.



환경 변수 읽어오기

from dotenv import load_dotenv
import os

load_dotenv()



상단에 위 코드를 넣어줍니다. 그러면 아래 코드처럼 환경 변수 파일인 .env 파일을 불러올 수 있습니다.

os.environ.get('ID')

 

.env 파일을 만들어서 관리하는 이유는 이 프로젝트가 private repository 이면 상관이 크게 없을 수 있지만 public 하면 .env 로 계정 정보를 나만 알 수 있도록 관리하는 것이 필요합니다. 또한 때에 따라 다를 수 있지만 .env 에 중요한 계정 정보나 키를 넣어 놓게 되면 관리에 유용하기에 환경 변수 파일을 자주 생성해서 관리합니다.

.env 파일은 KEY=VALUE 형식으로 ID=FOO 라고 입력하고 os.environ.get('ID') 의 출력 결과는 FOO 가 나오게 됩니다.

print(os.environ.get('ID')) #FOO



이제 사전 작업이 끝났습니다. 사전 작업이 끝나면 이후 작업 또한 거의 끝났습니다. 


1. 메인페이지에서 로그인 버튼 찾기

크롬 개발자 도구를 통해 로그인 버튼을 찾고 xpath 를 복사하였습니다.








2. 로그인 버튼 클릭
1번 과정에서 복사한 xpath 를 이용하여 버튼 코드를 작성합니다.
click(driver.find_element(By.XPATH, '/html/body/div[1]/header/div[2]/div[2]/form/div/ul/li[1]/a'))


find_element에서 쓰인 By 의 경우는 selenium 에서 제공합니다. 불과 몇달 전만해도 find_element_by_id 등으로 사용했지만 By 를 사용하여 element 를 찾는 함수를 하나로 줄일려고 하는 것 같습니다.


3. 아이디 input 찾기

아이디 input 의 경우는 #userId 로 id 가 존재하는 것을 확인했습니다. 



4. 아이디 입력
send_keys(driver.find_element(By.ID, 'userId'), os.environ.get('ID'))



5. 비밀번호 input 찾기





비밀번호 input 의 경우는 id 가 없어서 name 을 가지고 찾아야할 것 같습니다.


6. 비밀번호 입력
비밀번호의 경우 id 가 없기 때문에 name 으로 찾아 입력해보겠습니다.

send_keys(driver.find_element(By.NAME, 'password'), os.environ.get('PW'))



7. 엔터키 입력
로그인 버튼을 찾아서 클릭해도 되지만 다양한 상황을 적고 싶어서 엔터키를 입력하는 방식을 선택하였습니다. 엔터키하면 다른 selenium 의 기능이 쓰일 것 같지만 그렇지 않고 send_keys 로 처리가 됩니다. By 처럼 selenium 에서 제공하는 Keys 를 사용하면 됩니다. 

send_keys(driver.find_element(By.NAME, 'password'), Keys.ENTER)


유의할 점은 엔터를 입력한다는 것은 특정 element 에 엔터키를 입력한다는 것 입니다.  만약 비밀번호 input 에 엔터를 입력하는 것이 아니라 다른 영역에 엔터키를 입력하면 아무 반응이 일어나지 않을 것 입니다. 이처럼 어떤 곳에 엔터키를 입력할 것인지 확인해야합니다.


전체 코드

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

from dotenv import load_dotenv
import os

load_dotenv()


def create_driver():
    return webdriver.Chrome(service=Service('./driver/chromedriver_mac64_m1_97'))


driver = create_driver()
driver.get('https://dhlottery.co.kr/common.do?method=main')


def get_main_handle(main_url):
    for window_handle in driver.window_handles:
        driver.switch_to.window(window_handle)

        print(f'현재 핸들러 name : {driver.current_window_handle}')
        print(f'현재 url :  {driver.current_url}')
        print('')

        if main_url in driver.current_url:
            return window_handle
    raise '메인 핸들러 찾지 못함'


def close_windows_if_not_main_url(main_url):
    main_handle = get_main_handle(main_url)

    for window_handle in driver.window_handles:
        if main_handle != window_handle:
            driver.switch_to.window(window_handle)
            driver.close()

    driver.switch_to.window(main_handle)


def send_keys(element, text):
    element.send_keys(text)


def click(element):
    element.click()


close_windows_if_not_main_url('common.do?method=main')

click(driver.find_element(By.XPATH, '/html/body/div[1]/header/div[2]/div[2]/form/div/ul/li[1]/a'))

send_keys(driver.find_element(By.ID, 'userId'), os.environ.get('ID'))
send_keys(driver.find_element(By.NAME, 'password'), os.environ.get('PW'))
send_keys(driver.find_element(By.NAME, 'password'), Keys.ENTER)







오늘은 환경 변수, element 를 id, name, xpath 를 이용하여 찾기와 클릭에 관하여 알아보았습니다. 쉬운 이해가 되기를 바라면서 글을 쓰는데 어떻게 읽힐지 모르겠습니다. 최대한 노력해보면서 글 쓰기도 성장해보겠습니다. 







댓글

이 블로그의 인기 게시물

[INTELLIJ] 인텔리제이 폴더 안 보이고 파일만 보이는 버그 해결 방법

[생활] 짝눈(부동시)로 신체검사 4급(공익) 받은 방법.

[스프링부트] @Mapper import 실패시(빨간줄) 해결 방법