요즘 회사에서 일하다 보면 무언가 자동화 하고 싶은 작업들이 간간히 생깁니다.
특히 웹을 통한 단순 반복 작업(?)과 같은 것들은 따분하고 재미없어서 후딱후딱 해버리고 싶습니다.
자동화에 대해서 검색하던 중 Selenium이라는 것을 알게 되었습니다.
브라우저를 자동화하는 일종의 라이브러리입니다.. 주로 웹어플리케이션 테스트 자동화에 쓰이구요.
하지만 웹 기반 관리 작업을 자동화하는데도 사용 될 수 있다고 합니다.
Selenium 어떻게 사용하는지 몇가지 케이스를 중심으로 소개해봅니다.
01. 준비(라이브러리 및 프로그램 설치)
1 2 | PS C:\> python --version Python 3.7.2 | cs |
다음으로 Selenium을 설치해봅시닷.
1 | PS C:\> pip install selenium | cs |
Power shell 열때는 관리자 권한으로 열기 해야 설치됩니다.
그리고 webdriver란 놈을 설치해야됩니다.
Selenium은 webdriver 실행파일이 있어야 브라우저를 자동으로 실행시키고 여러 작업을 수행시킬 수 있습니다.
https://sites.google.com/a/chromium.org/chromedriver/downloads <-- 여기서 다운로드 가능
저는 C:\chromedriver.exe 형태로 저장했습니다.
이제 코딩 준비 끝.
02. 네이버 접속해보기
1 2 3 4 5 6 7 8 9 10 11 12 13 | from selenium import webdriver from time import sleep driver = webdriver.Chrome(r'C:\chromedriver.exe') ## webdriver 경로 설정 driver.implicitly_wait(3) ## 암시적 대기? driver.get('https://www.naver.com') ## 네이버 접속 print(driver.title) sleep(5) driver.quit() | cs |
코드를 위와 같이 작성하였습니다.
4: webdriver 객체를 이용해서 앞서 다운 받았던 chromedriver.exe 경로 설정해주고
6: 3초동안 DOM을 폴링하도록 설정
8: 네이버 url 설정
실행해보겠습니다.
1 2 3 4 5 6 | PS C:\mynode\test\selenium_test> python test.py DevTools listening on ws://127.0.0.1:7757/devtools/browser/블라블라~ KLIB_SelfTest return : KLR_OK NAVER | cs |
아래처럼 브라우저가 자동으로 똭 띄워집니다. 콘솔은 위와 같이 출력 되었구요.
03. 검색 해보기
코드 분석전에 html요소를 확인하려면 chrome에서 F12(개발자도구) 연 다음 html 코드 확인 가능합니다.
위의 버튼 클릭 후, 알고싶은 영역을 찍어주면 아래에 html코드가 잡히게 되고, id 또는 class 등의 정보 확인 가능합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | from selenium import webdriver from time import sleep from selenium.webdriver.common.by import By driver = webdriver.Chrome(r'C:\chromedriver.exe') driver.implicitly_wait(3) driver.get('https://www.naver.com') elm = driver.find_elements(By.ID, 'query')[0] elm.send_keys('개봉영화') btn_elm = driver.find_elements(By.ID, 'search_btn')[0] btn_elm.click() sleep(10) driver.quit() | cs |
11: find_elements로 id='query인 html 요소를 불어옵니다. find_element_by_id로 대체 가능합니다.
또는 classname, tag같은 걸로도 html요소를 불러올수 있습니다. find_elements(By.CLASS_NAME, 'query') 요런식으로.
12: 개봉영화라는 텍스트를 위의 html요소에 입력합니다.
14: 버튼 요소도 가져와서
15: 클릭 수행 시켜줍니다.
실행 시켜보면, 자동으로 naver.com 접속해서 검색란에 '개봉영화' 입력하고, 검색 버튼 까지 누르는 작업을 할 수 있는걸 확인 할 수 있을 겁니다.ㅎㅎ
04. 새 탭 열기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | from selenium import webdriver from time import sleep from selenium.webdriver.common.by import By driver = webdriver.Chrome(r'C:\chromedriver.exe') driver.implicitly_wait(3) driver.get('https://www.naver.com') elm = driver.find_elements(By.ID, 'query')[0] elm.send_keys('개봉영화') btn_elm = driver.find_elements(By.ID, 'search_btn')[0] btn_elm.click() driver.execute_script( "(function() { " + "window.open('https://www.naver.com', 'second');" + "})();" ) driver.switch_to.window("second") elm = driver.find_elements(By.ID, 'query')[0] elm.send_keys('개봉예정영화') btn_elm = driver.find_elements(By.ID, 'search_btn')[0] btn_elm.click() sleep(10) driver.quit() | cs |
18: execute_script 함수는 javascript를 수행한다.
20: window.open으로 새창을 띄우고, window이름은 second라고 설정했다.
24: driver 객체의 window를 스위치 해주자. 그래야 다음 코드들을 수행할수 있다.
26: 이번에는 '개봉예정영화' 입력 후 검색
위 같이 새창 띄우고 작업을 이어갈 수 있다.
05. ActionChains로 Ctrl과 같은 key 제어
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | from time import sleep from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome(r'C:\chromedriver.exe') driver.implicitly_wait(3) driver.get('https://www.naver.com') ...(생략) driver.execute_script( "(function() { " + "window.open('https://www.naver.com', 'third');" + "})();" ) driver.switch_to.window("third") actions = ActionChains(driver) actions.key_down(Keys.CONTROL).send_keys('v').perform() ...(생략) | cs |
python 실행전에 클립보드에 '캡틴 마블' 을 ctrl + c 로 복사 했었습니다.
코드 실행하니 위처럼 ctrl + v가 실행 된것을 확인 할 수 있습니다.
Selinium.. 잘 다루면 업무 효율이 치솟아 오를...수도 있을 것 같습니다.
또한 테스트 자동화 도구로서도 좋을듯 합니다.
'개발 이야기 > Python' 카테고리의 다른 글
Python으로 웹 크롤링(Crawling ) (0) | 2019.07.19 |
---|---|
Python Script 작성시 argument 여러개 받기 (0) | 2019.07.16 |
Python_bson을 json으로 바꾸는 방법 (0) | 2019.02.14 |
Python_pymongo 간단 사용법 (0) | 2019.02.12 |
Python_Flask app에서 filter 만들기 (0) | 2018.11.26 |