Post

데브코스 TIL - 셀레니움

셀레니움 (Selenium)

https://selenium.dev

selenium automates browsers.

브라우저 자동화 도구

✅ 셀레니움 구성요소

Selenium Web Driver

  • 브라우저 자동화 드라이버
  • 크롬과 같은 브라우저들에 대한 라이브러리를 제공
  • 이를 사용해서 사용자와 브라우저와 인터렉션하는 것을 자동화하는 도구

Selenium IDE

  • 웹-사용자 상호작용을 기록(녹화)하고 테스트 자동화에 활용
  • 크롬 및 파이어폭스의 익스텐션으로 설치하고 이용
  • 사용자가 브라우저를 사용하는 것을 테스트하는데 사용

Selenium grid

  • 분산 환경을 구성하여 hub가 요청을 수신, node 들에 테스트 수행을 분배하고 결과를 수집
  • webdriver 스크립트를 다수의 테스트 머신에 병렬 적용하여 테스트를 가속하고 효율화
  • 여러 개의 브라우저를 테스트할 때 한개의 머신을 사용하는 것보다는 여러개의 머신을 이용하는 것이 더 효율적이기 때문에 이를 이용하여 분산 환경을 구성하고 테스트 함

✅ 셀레니움 학습용 실습

실습 내용 및 실습환경

💡 Docker 이용한 selenium standalone (hub+node)를 실행

  • 이미지: selenium/standalone-chrome
  • 서비스 노출: 4444

ARM 기반 환경에서는 VNC를 이용한 원격 데스크톱이 올바르게 동작하지 않음 => seleniarm/stanalone-chromium를 이용할 것

💡 파이썬 테스트 클라이언트로 테스트 실행

  • selenium python 라이브러리 설치
  • 파이썬 테스트 클라이언트 설치
  • 간단한 테스트 코드 작성
  • docker에서 실행 중인 셀레니움 web driver에 연결하여 테스트 실행
  • 브라우저 콘솔에서 확인

1. 도커에서 셀레니움 이미지 다운받고 실행시키기

1
docker run -d --rm -p 4444:4444 /dev/shm:/dev/shm selenium/standalone-chrome

윈도우에서는 위와 같은 명령어를 입력했을 때 다음과 같은 오류가 발생할 수 있음

docker: invalid reference format.

도커가 이미지를 올바르게 해석하지 못한 오류. 컨테이너 이미지 이름 또는 태그를 지정하는데 문제가 있는 경우 발생

나의 경우에는 /dev/shm:/dev/shm이 docker volume을 설정하는 사용되는 옵션때문에 발생

해당 옵션을 제거하고 명령어를 실행시키면 정상적으로 작동함

--shm-size=2g: 크롬 브라우저가 사용할 공유 메모리 크기

1
2
3
4
5
6
7
8
9
docker run -d --rm -p 4444:4444 --shm-size=2g selenium/standalone-chrome

Unable to find image 'selenium/standalone-chrome:latest' locally
latest: Pulling from selenium/standalone-chrome
bccd10f490ab: Already exists
...
Digest: sha256:7d4de26ab7a568bbe82855d7e1f435755705c1e07be834fae0c59746bba17753
Status: Downloaded newer image for selenium/standalone-chrome:latest
dec356bcf759fc671a44f511d34c1bf3116ca59e8478e609de625dfdf8565865
  • 제대로 설치되었는지 확인
1
2
3
4
docker ps

ONTAINER ID   IMAGE                        COMMAND                   CREATED             STATUS             PORTS                              NAMES
dec356bcf759   selenium/standalone-chrome   "/opt/bin/entry_poin…"   41 seconds ago      Up 37 seconds      0.0.0.0:4444->4444/tcp, 5900/tcp   gallant_engelbart
  • localhost:4444로 접속하면 다음과 같은 화면이 렌더됨

selenium

2. 파이썬 라이브러리 설치

https://www.selenium.dev/documentation/webdriver/getting_started/install_library/

1
pip install selenium

만약 파이썬이 설치되어있지 않다면 다음과 같은 오류가 발생

‘pip’은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다.

https://www.python.org/downloads/windows/에서 파이썬을 먼저 설치한 후 다음 단계로 진행해야함, 만약 시스템 변수가 설정되어 있지 않으면 파이썬을 설치해도 pip 명령어가 실행되지 않음

pip 명령어

겨우 pip 명령어를 사용하여 selenium을 설치하고 강의를 다시 재생했더니, 4.17.2버전으로 맞추자고 하셨다. 버전이 맞지않으면 오류가 발생할 수도 있다고…

하지만 강의는 23년 12월에 제작되었고 나는 24년 3월에 강의를 듣기 때문에 혹시나 하는 마음으로 확인을 해보았다. 나는 강사님보다 더 최신 버전의 파이썬과 셀레니움 파이썬 라이브러리를 사용하기 때문에 강사님과 버전을 맞출 필요가 없었다.

셀레니움 버전

3. 테스트 코드 작성

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
35
36
37
38
39
40
41
# 조금 전 설치한 라이브러리부터 webdriver를 활용
from selenium import webdriver
import time

print("Test Execution Started")

# webdriver가 실행할 옵션 지정
options = webdriver.ChromeOptions()
options.add_argument('--ignore-ssl-errors=yes')
options.add_argument('--ignore-certificate-errors')

# 셀레니움 endpoint를 지정하고 크롬 옵션을 적용하여 원격 webdriver를 생성
driver = webdriver.Remote(
    command_executor='http://localhost:4444/wd/hub',
    options=options
)

# maximize the window size
# 브라우저 자동화에 의한 실행 과정을 눈으로 모니터링해 보기 위해서 시간 지연을 삽입
driver.maximize_window()
time.sleep(10)

# navigate to the notes app
# 지정된 URL의 페이지로드 (GET 요청을 보내는 것과는 다름)
driver.get("https://notes.prgms-fullcycle.com")
time.sleep(10)

# click on the Get started for free button
# HTML 요소를 선택하고 여기에 클릭 이벤트를 발생시킴 (클릭 동작을 실행시킨다고 보는게 맞음)
driver.find_element("link text", "무료로 시작하기").click()
time.sleep(10)

# close the browser
# 테스트가 종료될 때 셀레니움 세션을 닫기 전에 대기하기 위하여 input을 이용하여 사용자 입력을 요구
s = input("Done: ")

# 드라이버를 닫고 테스트를 마침
driver.close()
driver.quit()

print("Test Execution Successfully Completed!")

4. 테스트 실행

1
python first_test.py

명령어를 입력하여 테스트를 실행하면 localhost:4444의 셀레니움 그리드에 테스트가 실행되는 것을 확인할 수 있음

This post is licensed under CC BY 4.0 by the author.