Selenium을 사용하며 배운 것
E2E 테스트를 위한 Selenium
Selenium
웹 애플리케이션 동작을 자동화하여 테스트하는 오픈 소스 라이브러리
왜 Selenium을 선택했는가?
원래는 42서울 과제인 ft_transcendence에서 짧게나마 사용한 Playwright를 사용할 생각이었다.
하지만 이 프로젝트에서는 사람들이 많이 사용하는 걸 써보고 싶다는 생각이 들었다(그래서 프론트를 일부러 리액트로 작성하기도 했다).
구글 트렌드나 GPT에게 물어봤을 때 사람들이 많이 사용하는 건 Selenium 같았고, 예시를 보아하니 코드를 이해하는 데에도 큰 문제가 없었기 때문에 선택하였다.
Selenium의 특징
- 다양한 웹 브라우저 지원(chrome, firefox, safari 등)
- 크로스 브라우저 테스트 가능
- 헤드리스 브라우저 지원
- 여러 프로그래밍 언어 지원
- 병렬 실행 지원(Selenium Grid)
Selenium 개념: Driver
공식 문서: https://www.selenium.dev/documentation/webdriver/drivers/
driver
의 세션을 시작하고 종료하는 것은 브라우저를 열고 닫는 것과 같다.
driver
는 브라우저와 연결되어 자동으로 페이지를 열거나 닫고, 특정 요소를 클릭하거나 입력을 하는 등의 작업을 수행한다.
비동기와 Selenium
웹 애플리케이션을 개발하면서 나는 비동기를 자주 사용했고, 이를 테스트할 때 이런 의문이 들었다.
“비동기로 상태를 업데이트하면 어떻게 순차적으로 변하는 상태의 값을 검증하지?”
이런 비동기의 문제를 해결하기 위해 Selenium에서는 여러 함수와 클래스를 지원한다.
WebDriverWait
공식 문서: https://www.selenium.dev/documentation/webdriver/waits/#explicit-waits
wait = WebDriverWait(driver, timeout=2)
wait.until(lambda d : revealed.is_displayed())
사용 예시:
WebDriverWait(driver, 10).until(
ec.visibility_of_element_located((By.CLASS_NAME, 'choice-ratio'))
)
WebDriverWait
은 명시적 기다림(Explicit waits)으로 특정 조건이 참이 되도록 애플리케이션에 요청을 보내 검증하는 코드가 추가된 반복문이다.
만약 조건이 timeout
내로 만족되지 않으면 TimeoutException
을 발생시킨다.
추가로 내가 특정 조건을 검증하기 위해 ec
라는 걸 썼는데, ec
는 expected_condition
이다.
expected_condition
공식 문서: https://www.selenium.dev/documentation/webdriver/support_features/expected_conditions/
expected_condition
은 Explicit Waits와 함께 사용한다.
위의 WebDriverWait
의 사용 예시처럼 람다식 대신 특정 조건을 만족하는지 검증하는 함수를 사용할 수 있다.
예시에서는 .choice-ratio
라는 클래스를 가진 요소가 화면에 보이는지를 검증한 것이다.
driver.implicitly_wait
공식 문서: https://www.selenium.dev/documentation/webdriver/waits/#implicit-waits
selenium엔 implicit wait
라는 요소를 자동으로 기다리는 내장 방식이 있다.
모든 세션에서 모든 요소에 적용되는 전역 설정이다.
만약 요소를 찾지 못했을 때 에러를 반환해야 하지만, implicit wait
가 설정되어 있으면 에러를 반환하기 전에 driver
는 주어진 값 만큼 대기한다.
찾으려는 요소가 배치된 순간, driver
는 요소 참조를 반환하고 코드를 계속 실행한다.
implicit wait
와 explicit wait
를 섞어서 사용하지 말 것. implicit wait
가 10초, explicit wait
가 15초면 20초 후에 타임아웃이 발생할 수 있다.
댓글남기기