본문 바로가기
개발 이야기/Python

Selenium으로 웹브라우저 테스트 자동화

by 농개 2019. 3. 16.

요즘 회사에서 일하다 보면 무언가 자동화 하고 싶은 작업들이 간간히 생깁니다.

특히 웹을 통한 단순 반복 작업(?)과 같은 것들은 따분하고 재미없어서 후딱후딱 해버리고 싶습니다.


자동화에 대해서 검색하던 중 Selenium이라는 것을 알게 되었습니다.

브라우저를 자동화하는 일종의 라이브러리입니다.. 주로 웹어플리케이션 테스트 자동화에 쓰이구요.

하지만 웹 기반 관리 작업을 자동화하는데도 사용 될 수 있다고 합니다.


Selenium 어떻게 사용하는지 몇가지 케이스를 중심으로 소개해봅니다.



01. 준비(라이브러리 및 프로그램 설치)

일단 파이썬으로 진행 할 것입니다. OS는 windows 10 입니다. 브라우저는 Chrome을 사용합니다.
파이썬은 미리 설치를 했구요.

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 제어

나중에 잘 쓰면 유용할 것 같다. 맛보기로 잠깐 해보자.
ActionsChains이라는 객체를 사용하면 마우스 움직임, 키 누르기 같은 저수준의 상호작용을 자동화 하여 수행할 수 있다.
잘 쓰면 복잡한 작업도 자동화 가능하다.

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

4,5: Keys와 ActionChains 객체를 import 합니다.
15: 또 다시 새 탭을 열고
21: window 스위치해주고
23: ActionChains 객체를 생성하고
24: key_down(Keys.CONTROL)로 ctrl 키를 누릅니다.(눌러진 상태입니다.)
그리고 send_keys로 v를 입력한다는 겁니다.
마지막으로 perform으로 일련의 action을 실행시킵니다.



python 실행전에 클립보드에 '캡틴 마블' 을 ctrl + c 로 복사 했었습니다.

코드 실행하니 위처럼 ctrl + v가 실행 된것을 확인 할 수 있습니다.



Selinium.. 잘 다루면 업무 효율이 치솟아 오를...수도 있을 것 같습니다.

또한 테스트 자동화 도구로서도 좋을듯 합니다.