웹 인터페이스를 사용하는 보안 솔루션을 이용하는데, 매일 전날 일일 통계 보고서를 출력해야 하는 일이 생겼다.
그래서 '한 번 자동화로 구현해보자'라는 생각을 가지게 되었고, 언제나 그랬듯이 신입은 시간이 매우 널널하다..
바로 구현을 해봤다.
selenium 선택 이유
선택 이유는 아래 2가지다. 다른 언어로는 어떻게 해야할지 감도 오지 않았다.
1. 개발 언어 중 파이썬을 그나마 사용할 줄 안다.
2. 웹 페이지 대상 QA 자동화를 혼자 selenium으로 사용해봤다.
준비
1. python - selenium
설치는 매우매우 간단하다. 파이썬을 먼저 깔고 환경변수까지 설정해준다. 설치할 때 환경변수까지 등록해주는 옵션을 선택하면 좋다.
pip install selenium |
만약 ssl 에러가 계속 발생한다면 아래의 명령어를 한 번 쳐보세용.
pip install —trusted-host=pypi.org —trusted-host=files.pythonhosted.org —user 패키지이름 |
2. chromedriver
자신이 사용하고 있는 크롬 버전에 맞춰서 설치해줘야 합니다.
버전은 아래처럼 확인이 가능합니다.
이건 제가 전에 올린 게시글인데요, 처음 설치할 때 발생했던 에러에 대해 써놔서 다시 첨부합니다.
selenium으로 네이버 열기 (tistory.com)
정상적으로 설치가 끝났으면 준비 끝입니다.
코드를 짜기 전에...
목표했던 결과물을 얻기 위해서 제가 반복적으로 하는 행위는 아래와 같습니다.
1. 계정 로그인
2. 메뉴 및 분류 옵션 선택
3. 날짜 조정
4. 조회
5. 파일로 저장
저의 경우에는 모두 버튼을 누르는 형식으로 이루어져 있어서 그나마 손쉽게 작성할 수 있었습니다.
한가지 껄끄러웠던 것은 조회를 누르면 파일을 받을 수 있는 새로운 팝업 창이 등장했다는 것입니다.
처음에는 url을 따로 지정할 생각을 했는데, selenium은 switch_to.window라는 아주아주 좋은 함수가 있어서 쉽게 구현할 수 있었습니다.
코드 짜기
사실 핵심이라고 할 것도 없는 간단한 코드지만, 그럼에도 소개해드리자면...
1. 버튼 누르기
아주 간단합니다. 저는 xpath를 이용해서 구현했습니다.
제가 원했던 버튼 누르기, 값 입력하기를 하기 위해 전부 xpath를 사용했습니다.
xpath 확인하기 크롬에서 F12를 통해 개발자도구로 들어간 뒤 빨간색 표시된 버튼을 눌러줍니다. 그리고 xpath를 확인하고자 하는 요소를 클릭하면? 선택한 요소의 코드가 하이라이팅 됩니다. 그 코드를 [우클릭 - copy - xpath] 해주면 끝입니다. |
xpath까지 확인했다면 클릭하는 코드에 넣어줍시다!
아주아주 간단합니다.
driver.find_element("xpath", '복사한 xpath').click
2. 내가 원하는 내용 입력하기
코드를 작성하기에 앞서 새로운 함수를 사용하기 위해 준비가 필요합니다.
from selenium.webdriver.common.keys import Keys
우리는 send_keys라는 함수를 이용해 글자를 입력할 것입니다.
똑같이 xpath로 경로를 찾아주고 거기에 send_key를 추가해주면 끝입니다.
inputid = driver.find_element("xpath", 'id 입력 창의 xpath')
# 문자열을 하드코딩 하는 경우
inputid.send_keys('id')
# 변수를 사용하는 경우
id = "아이디"
inputid.send_keys(id)
3. 날짜 입력하기
보고서를 출력하기 위해 시작 날짜와 종료 날짜를 지정해줘야 했습니다.
[yyyymmdd] ~ [yyyymmdd]의 형식으로 입력해줘야 했고 시작과 종료 2번 입력이 필요했습니다.
오늘을 기준으로 전날의 보고서를 출력해야됐기 때문에 전날의 날짜를 구할 수 있는 기능을 찾아보았습니다.
파이썬은 기능이 매우매우매우 많기 때문에 무조건 있겠구나 하고 찾았습니다.
datetime이라는 라이브러리를 사용하면 아주아주 쉽게 구할 수 있었습니다.
from datetime import datetime
# 오늘 날짜
datetime.today()
# 오늘 연도
datetime.today().year
# 오늘 월
datetime.today().month
# 오늘 일
datetime.today().day
# 오늘 시간
datetime.today().hour
실행하면 아래처럼 나옵니다.
year, month, day를 +로 붙여서 넘겨버릴 생각을 했는데 month가 한자리숫자인 경우에는 넘길 수 없어서 앞을 0으로 채워줘야 했습니다.
찾아보니 'zfill()'이라는 함수로 쉽게 0을 채울 수 있었습니다. 하지만 zfill 함수는 문자열인 경우에만 가능하기 때문에 형변환 과정을 거쳐줘야 했습니다.
아래는 예시로 작성했으며 mon이라는 변수에는 [datetime.today().month]가 들어있습니다.
월, 일 모두 zfill을 통해 한자리의 경우에 앞에 0을 채워버렸고 결과적으로는 yyyymmdd의 형식으로 날짜를 뽑아낼 수 있었습니다.
위에 써놓은 것과 같이 send_key를 이용해 값을 넘겨주었고, 이번에는 변수를 넘겨줬습니다.
마치며
자동화로 구현했습니다만,, 너무 느립니다.
솔루션 관리자 페이지 자체가 무한 새로고침이 될때도 있고 오류가 심하며 속도가 너무너무 느립니다.
뭔가 웹 인터페이스를 조작하지 않고 http request로만 조작해 받을 수 있는 방법을 찾아봐야겠습니다.
전체 코드 내용은 회사에서 사용하는 계정 정보, url이 들어있어서 올리지 않습니다.
'프로그래밍 > 파이썬' 카테고리의 다른 글
enumerate로 인덱스 번호 붙이기 (0) | 2023.09.21 |
---|---|
파이썬 함수에서 return (0) | 2023.08.24 |
django.db에 데이터 추가하기 (0) | 2022.07.09 |
selenium으로 네이버 열기 (0) | 2022.07.08 |
unittest를 이용한 코드 테스트 (0) | 2022.07.07 |
댓글