공부/QA

[QA] Python Selenium 웹 테스트 자동화

narlo 2025. 12. 5. 15:36

Selenium 설치

pip install selenium

 

 

Selenium

  • 사람이 직접 조작하지 않고도 웹사이트를 자동으로 움직이게 하는 도구
  • 테스트에서 사람이 할 수 있는 거의 모든 동작은 Selenium으로 자동화 할 수 있음
  • WebDriver는 Selenium이 브라우저와 상호작용 할 수 있도록 도와주는 중간 매개체 역할
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.selenium.dev/selenium/web/web-form.html")

title = driver.title
driver.implicitly_wait(0.5)

text_box = driver.find_element(by=By.NAME, value="my-text")
submit_button = driver.find_element(by=By.CSS_SELECTOR, value="button")

text_box = driver.find_element(by=By.NAME, value="my-text")
submit_button = driver.find_element(by=By.CSS_SELECTOR, value="button")

message = driver.find_element(by=By.ID, value="message")
text = message.text

driver.quit()

 

요소 선택하는 방법

  1. By.TAG_NAME
  2. By.ID
  3. By.CLASS_NAME
  4. By.CSS_SELECTOR
  5. By.XPATH
  6. By.NAME
  7. By.LINK_TEXT
  8. By.PARTIAL_LINK_TEXT

 

XPath가 어렵다면

F12로 개발자 도구를 켜고, Elements 탭에 들어가서

원하는 요소 우클릭 => Copy => Copy XPath

ID - 한 페이지에 하나만 존재하는 유일한 값
Class - 여러 요소가 같은 class를 가질 수 있음
Name - 입력 필드에서 많이 사용됨

1. ID가 있으면 ID 사용
2. Class는 동일한 요소가 여러 개 있을 때 사용
3. Name은 폼 입력 요소에서 자주 사용
4. ID나 Class, Name이 없어서 인덱싱하기 어려운 경우 CSS Selector나 XPath 사용

CSS Selector - 빠르고 간결한 문법, 복잡한 요소 선택이 어려움
XPath - 복잡한 요소도 정교하게 선택 가능, 성능이 CSS Selector보다 느릴 수 있

 

 

요소 선택 함수

driver.find_element(By.ID, 'username')
driver.find_elements(By.CLASS_NAME, 'red')
  • find_element : 하나의 요소만 선택, 여러 개가 있다면 일치하는 요소 중 가장 첫 번째 요소 선택
  • find_elements: 일치하는 요소들을 모두 선택

 

기능 조작

  • 클릭 : .click()
  • 키 입력 : .send_keys()

출처: 위키독스(https://wikidocs.net/149358)

 

  • 속성 가져오기 : .get_attribute()
i.get_attribute("href") # i의 href 속성 값 가져오기
img.get_attribute("src") # img의 src 속성 값 가져오기
i.get_attribute("style") # i의 style 속성 가져오기

 

WebDriverWait

  • 웹 페이지가 완전히 로드되기 전에 요소를 찾으려고 하면 'NoSuchElementException' 오류 발생
  • 요소가 나타날 때까지 기다리는 함수
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

search_box = WebDriverWait(driver, 10).until(
  EC.presense_of_element_located((By.ID, "searchBox"))
)

 

  • element_to_be_clickable : 요소가 클릭 가능해질 때까지 대기
  • visibility_of_element_located: 요소가 화면에 표시될 때까지 대기
  • presense_of_element_located : 요소가 HTML에 추가될 때가지 대기 (표시 여부 상관없음)

 

드롭다운 옵션 선택

from selenium.webdriver.support.ui import Select

dropdown = Select(driver.find_element(By.ID, "city"))
dropdown.select_by_value("seoul") # value 기준 선택

 

  • select_by_visible_text()
  • select_by_index()

이 함수들로도 옵션 선택 가능

 

CSV 파일 저장

items = driver.find_elements(By.CLASS_NAME, "item")

with open(csv_file_path, "w", newline="", encoding="utf-8") as file:
  writer = csv.writer(file)
  writer.writerow(["텍스트"])
  for item in items:
    writer.writerow([item.text])
    
driver.quit()
print(f"데이터가 {csv_file_path} 파일로 저장되었습니다.")

 

자바스크립트 실행

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

driver.execute_script("window.scrollBy(0, 500);")

# 숨겨진 요소 강제로 보이게 만들기
hidden_input = driver.find_element(By.ID, "hidden_input")
driver.execute_script("arguments[0].style.display = 'block';", hidden_input)

 

팝업 창 처리

 WebDriverWait(driver, 5).until(EC.alert_is_present())
 alert = driver.switch_to.alert
 print(alert.text)
 
 alert.accept() # 팝업 닫기
  • alert : 확인 버튼만 있는 경고창
    • alert.accpet()
  • confirm : 확인/취소 버튼이 있는 알림창
    • alert.accept()
    • alert.dismiss()
  • prompt : 사용자 입력을 요구하는 알림창
    • alert.send_keys("입력값")
    • 입력값을 보낸 뒤 alert.accept()

새로고침

driver.refresh()

 

UI 요소 확인

# element.is_displayed() : 요소가 화면에 표시되는지 확인
# element.is_enabled() : 버튼 또는 입력 필드가 활성화되어 있는지 확인

button = driver.find_element(By.ID, "submit_button")

if button.is_displayed():
  print("버튼이 화면에 표시됨")
if button.is_enabled():
  print("버튼이 활성화됨")

 

스크린샷 찍기

driver.save_screenshot("before.png")

image1 = Image.open("before.png")
image2 = Image.open("after.png")

diff = ImageChops.difference(image1, image2)
if diff.getbbox():
  print("UI 변경이 감지됨")

 

로그 작성

  • 로그 : 테스트 과정에서 발생한 이벤트(성공/실패/오류 등)를 기록하는 파일
import logging

logging.basicConfig(filename="test_results.log", level=logging.INFO, format="%(asctime)s - %(message)s")

logging.info("✅ UI 테스트 시작")
logging.warning("⚠️ 예상과 다른 UI 요소 발견")
logging.error("❌ 버튼이 클릭되지 않음")
logging.info("✅ UI 테스트 종료")

 

쿠키 가져오기

driver.get("https://example.com")
cookies = driver.get_cookies()
for cookie in cookies:
  print(cookie)
  
driver.add_cookie({"name" : "user_session", "value" : "abc123", "domain" : "example.com"})

driver.delete_cookie("value")
driver.delete_all_cookies()
  • get_cookies() : 현재 페이지의 모든 쿠키를 리스트 형태로 가져오기
  • get_cookie(name) : 특정 이름의 쿠키만 가져오기
  • add_cookie(cookie_dict) : 브라우저에 새로운 쿠키 추가
  • delete_cookie(name) : 특정 쿠키 삭제
  • delete_all_cookies() : 모든 쿠키 삭제

 

'공부 > QA' 카테고리의 다른 글

[QA] Selenium XPath svg 태그 찾기  (0) 2025.12.16
[QA] pytest  (0) 2025.12.13
[QA] Jenkins CI/CD 특강 정리  (0) 2025.12.08
[QA] Selenium clear()가 안되는 현상 해결 방법  (0) 2025.12.08
[QA] 선택자(CSS Selector, XPath)  (0) 2025.11.28