최근 상품권을 대량으로 구매해서 등록해야하는 경우가 있었다. 

여러 개(보통 5만 원권 40개)를 구매해서 pin번호를 하나하나 입력하다 보니 여간 귀찮은 일이 아니었다.
(중간에 가상키보드로 입력해야 하는 영역도 있음… ㅡ.ㅡ) 

 

몇개 입력하다가 그만두고 검색을 해봤다. ‘상품권 번호 자동입력’이라고 하니까 나오더라 (역시.. )

하지만 public 하게 배포되는 프로그램(https://auto.ddart.net/xe/help/239)은 Windows 용이라서 사용할 수 없었고 Mac용으로 찾다가 결국 그냥 내가 만들어보자 라는 결심 하게 되었다.

 


설계한 프로세스는 간단했다.

1. 웹페이지(충전 페이지)를 크롤링.
2. Input 영역(번호입력칸)에 value(번호) 입력.
3. action (충전 버튼 클릭)
4. 1~3 반복

해본 적은 없었지만 python과 selenium 이용하면 구현이 가능해 보였다.


개발기

여러 블로그를 참고했고 작은 step으로 쪼개서 개발을 진행했다.


Step1

필요한 라이브러리가 뭔지 확인하고 환경을 세팅했다.

 

Selenium version은 4.9.1 - default가 최신이라 선택.

Python version은 3.11 - 3.9를 사용하다가 호환성 문제로 최신버전으로 upgrade.

Chromedriver(브라우저를 handling 하는 용도) version은 113 - 내 pc에서 사용 중인 chrome버전에 맞는 것을 선택.


Step2

브라우저에 페이지를 띄워보는 것으로 시작했다.

 

브라우저를 띄우기 위해선 사용하는 브라우저 드라이버를 설치해야 했다.

익숙한 Chrome을 선택했고 현재 pc에서 사용 중인 버전에 맞는 driver를 설치했다. 

Help > About Google Chrome 에서 113 버전을 사용하고 있는 것을 확인할 수 있음

아래와 같은 로직을 작성해서 페이지를띄울 수 있었다.

특정 페이지를 띄운 다음 10초간 sleep 시키는 코드


Step3

번호 입력 기능을 만들기 전, 우선 ID, PW를 입력받아 로그인 성공까지 처리하는 프로세스를 개발해 보았다. 

실제 비밀번호가 아니니 시도하지 않았으면 한다!

하지만, 입력하고 로그인 버튼을 눌렀는데 되지 않았다. 

 

알고 보니 패스워드 부분은 가상키보드를 이용한 입력이 필요했다. (가볍게연습해보려고했는데… 따흑…)

가상키보드 입력 폼

다행히 javascript 속성을 이용해서 처리하는 방법으로 금방 해결할 수 있었다.

 

Img alt 속성 입력문자 매핑시키는 방식으로 작업한 코드는 아래와 같다.

특수문자 입력 때문에 예외처리 로직도 추가했다.

가상키보드 처리 함수

 

정상적으로 동작하는 것을 확인할 수 있었다.

작업한 로직이 동작하는 영상

Step4

다음으로 번호입력 프로세스 개발을 진행했다.

 

로그인을 구현했으니 금방 될 줄 알았는데... 이슈가 나왔다.(쉽게 되면 재미없지 그래...)

가상키보드 alt 속성과 입력값 매핑 규칙이 번호입력 키보드에선 적용 되지 않았다.

 

첫번째 칸의 가상키보드

 

첫번째 칸의 가상키보드 javascript
두번째 칸의 가상키보드
두번째 칸의 가상키보드 javascript

첫 번째 가상키보드에서 2는 alt = 3과 3은 alt = 4와 매핑이 된다.
하지만 두 번째 가상키보드에서는 2는 alt = 2과 3은 alt = 3과 매핑이 된다. 
키 위치가 계속 변하고 alt 값도 고정되지 않다 보니 매핑기준을 찾을 수 없었다. 

 

OCR 라이브러리 도입방법까지 찾아보았지만 가볍지 않은 느낌이라 PASS 했다.

 

여러 삽질(?) 끝에 당장의 해결책을 찾았을 수 있었는데 MoblieWeb 화면에서는 숫자와 alt값을 동일하게 사용할 수 있었다.


Step5

한 개의 상품권 번호 입력을 성공했으니 여러 개 상품권번호 입력은 반복문을 이용해서 구현 하면 끝이라고 생각했다. 근데….

(역시나?) 첫 번째 상품권 입력 후 두 번째 상품권의 번호를 입력할오류가 발생했다.

 

 

다시 한번 가상키보드 입력값 처리 함수에서 원인을 찾아 보았다.

Line1: xPath를 이용해서 target을 alt값으로 가지는 element 찾는다.

Line2~3: 해당 element의 부모의 부모(조부모) element에서 click event 처리를 한다.

 

먼저 element의 innerHtml을 출력했다.

첫번째 번호 입력할때 출력한 innerHtml
두번째 번호 입력할때 출력한 innerHtml

출력 결과를 보니 두 번째 번호 입력할 때 element를 잘못 찾고 있었다.

활성화되지 않은 첫 번째 가상키보드를 선택해서 에러가 발생한 것으로 보였다.

 

그래서 우선 활성화된 가상키보드의 div 영역을 명시해서 찾고, 그 내부에 있는 alt값으로 매핑처리 하도록 수정했다. 

하지만 이 코드 또한 동일하게 오류가 발생했다. 😭😭

 

결과적으로 찾아낸 원인은 xPath 문법 오류 였다.

나는 '//'가 현재 node를 기준으로 matching 되는 것을 찾는 걸로 이해했는데 그게 아니었다.

 

내가 작성한 로직에서 "//img [@alt='{}']" 부분이 전체 document에서 일치하는 node를 찾다 보니 계속 첫 번째 가상키보드를 찾았던 것이다.

 

func_nn = func_p.find_element(By.XPATH, ".//img[@alt='{}']".format(target))

수정하고 나니 원하는 대로 잘 동작하는 것을 확인할 수 있었다

 


마무리

역시 목마른 사람이 우물을 파는구나 싶었다. 필요하니 만들게 되더라.

오랜만에 업무 말고 다른 개발을 하면서 refresh 되는 느낌을 받았다.

 

간단하게 생각했던 것에서 장애물들이 계속 나와 처음엔 당황스러웠지만 나중엔 오기가 생겼고 게임에서 미션 깨는 느낌으로 재밌게 만들었다.

파이썬을 잘 활용하면 여러 곳에서 활용할 만한 서비스를 만들어볼 수 있겠다고 몸소 느낄 수 있었다.

 

다음엔 어떤 우물을 파볼까~


참고 블로그

https://kookhh0827.tistory.com/entry/Development-%EC%BB%AC%EC%B3%90%EB%9E%9C%EB%93%9C-%ED%95%80%EB%B2%88%ED%98%B8-%EC%9E%90%EB%8F%99-%EB%8C%80%EB%9F%89-%EB%93%B1%EB%A1%9D%EA%B8%B0-%EB%A7%8C%EB%93%A4%EA%B8%B0

 

[Coding] 컬쳐랜드 핀번호 자동, 대량 등록기 만들기

컬쳐랜드 핀번호를 대량으로 입력할때 하나하나 입력해야 하는게 너무 귀찮았다. 그래서 컬쳐랜드 핀번호를 입력하면 자동으로 validation을 해주는 프로그램을 만들어 보았다. 만들던 도중 한가

kookhh0827.tistory.com

https://www.softwaretestinghelp.com/selenium-python-tutorial/

+ Recent posts