개발 이야기/Python

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

농개 2019. 3. 16. 23:46
반응형

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

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


자동화에 대해서 검색하던 중 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.. 잘 다루면 업무 효율이 치솟아 오를...수도 있을 것 같습니다.

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




반응형