개발로 자기계발
728x90

Selenium

웹 페이지를 자동화하여 사용자가 직접 실행하는 것과 같은 테스트를 수행할 수 있다.

 

Selenium은 다양한 언어를 지원하며, 특히 Java, Python, Ruby, C# 등의 언어에서 많이 사용된다.

Selenium WebDriver를 사용하면 자동화된 테스트를 실행할 수 있으며,

Selenium Grid를 사용하면 여러 브라우저에서 동시에 테스트를 실행할 수 있다.

또한 Selenium IDE를 사용하면 브라우저에서 리코딩 기능을 사용하여 테스트를 작성할 수 있다.

* 레코딩: 사용자가 브라우저에서 수행하는 모든 작업을 기록하고 해당 작업들을 자동화된 테스트로 바꿀 수 있는 기능

 

1) 버전차이

Selenium은 4 버전 이후로 문법이 변경되었다.

 

Selenium 3.xx버전

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

# Chrome 드라이버 설치 및 구성
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)

# 구글 홈페이지로 이동
driver.get("https://www.google.com/")

# 검색어 입력 후 검색 실행
search_box = driver.find_element_by_name("q")
search_box.send_keys("Selenium 예제")
search_box.submit()

# 브라우저 닫기
driver.quit()

 

Selenium 4.xx버전

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager

# Chrome 드라이버 설치 및 구성
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)

# 구글 홈페이지로 이동
driver.get("https://www.google.com/")

# 검색어 입력 후 검색 실행
search_box = WebDriverWait(driver, 5).until(
    EC.presence_of_element_located((By.NAME, "q"))
)
search_box.send_keys("Selenium 예제")
search_box.submit()

# 브라우저 닫기
driver.quit()

 

2) Selenium Option 종류

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager

# Chrome 드라이버 설치 및 구성
service = Service(ChromeDriverManager().install())
options = Options()
options.add_argument('--headless') # 헤드리스 모드 설정
options.add_argument('--disable-gpu') # GPU 가속 비활성화
options.add_argument('--window-size=1920,1080') # 브라우저 창 크기 설정
options.add_argument('--disable-extensions') # 확장 프로그램 비활성화
options.add_argument('--no-sandbox') # 보안 기능 비활성화
options.add_argument('--disable-dev-shm-usage') # DevShm 사용 비활성화
options.add_argument('--disable-logging') # 로깅 비활성화
options.add_argument('--disable-popup-blocking') # 팝업 차단 비활성화
options.add_argument('--disable-infobars') # 인포바 표시 비활성화
options.add_argument('--incognito') # 시크릿 모드
options.add_argument('--disable-notifications') # 알림 비활성화
options.add_argument('--disable-geolocation') # 위치 정보 비활성화
options.add_argument('--ignore-certificate-errors') # SSL 인증서 오류 무시
driver = webdriver.Chrome(service=service, options=options)

# 구글 홈페이지로 이동
driver.get("https://www.google.com/")

# 브라우저 닫기
driver.quit()

 

3) Selenium Webdriver 객체 함수 종류(태그 찾는 함수는 제외)

# WebDriver 객체 함수
driver.get(url)  # 페이지로 이동
driver.back()  # 이전 페이지로 이동
driver.forward()  # 다음 페이지로 이동
driver.refresh()  # 페이지 새로고침
driver.quit()  # 브라우저 종료
driver.close()  # 현재 창 닫기
driver.execute_script(script)  # 자바스크립트 실행
driver.switch_to.frame(frame_reference)  # 프레임으로 전환
driver.switch_to.default_content()  # 프레임에서 빠져나오기
driver.switch_to.window(window_name)  # 윈도우로 전환
driver.switch_to.alert()  # 경고창으로 전환
driver.title  # 현재 페이지 제목
driver.current_url  # 현재 페이지 URL
driver.page_source  # 현재 페이지 소스코드

 

4) Implicit Wait(암묵적 대기)

반드시 해당 시간을 기다리는 것이 아니라, 로딩이 다 될 때까지의 한계 시간의 의미를 가진다.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager


with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
    driver.get("https://indistreet.com/live?sortOption=startDate%3AASC")
    driver.implicitly_wait(10)
    a = driver.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[2]/div/div[4]/div[1]/div[2]/div/a/div[2]/p[1]')
    print(a.text)

 

5) Explicit Wait(명시적 대기)

일정 시간동안 특정 조건을 만족할 때까지 기다리는 방법, Implicit Wait과는 달리, 코드 상에서 명시적으로 대기할 조건을 설정하여 해당 조건이 만족될 때까지만 기다린다.

Explicit Wait를 사용하기 위해서는 WebDriverWait 객체를 생성하고, until 메서드를 사용하여 조건을 만족할 때까지 기다린다.

* until_not은 until 기능의 반대

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
    driver.get("https://indistreet.com/live?sortOption=startDate%3AASC")
    element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="__next"]/div/main/div[2]/div/div[4]/div[1]/div[2]/div/a/div[2]/p[1]')))
    print(element.text)

 

비교점

Explicit Wait는 Implicit Wait과 달리, 코드 상에서 명시적으로 대기할 조건을 설정하므로, 정확하게 원하는 시점까지 대기할 수 있다.

이를 통해 안정적인 테스트 코드를 작성할 수 있다.

 

6) 마우스 이벤트 처리하기

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://hashcode.co.kr/")
driver.implicitly_wait(2)

button = driver.find_element(By.XPATH, '//*[@id="main-app-gnb-header"]/div/div/div[1]/div/div[2]/div/div/div[1]/span[1]/a[1]')
ActionChains(driver).click(button).perform()

 

7) 키보드 이벤트 처리하기

from selenium import webdriver
from selenium.webdriver import ActionChains
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.actions.action_builder import ActionBuilder
from selenium.webdriver import Keys, ActionChains
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By


import time

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://hashcode.co.kr/")
time.sleep(1)


button = driver.find_element(By.XPATH, '//*[@id="main-app-gnb-header"]/div/div/div[1]/div/div[2]/div/div/div[1]/span[1]/a[1]')
ActionChains(driver).click(button).perform()

id_input = driver.find_element(By.XPATH, '//*[@id="main-app-account"]/div/div[2]/div/div[2]/div[1]/div/div[2]/div[2]/input')
ActionChains(driver).send_keys_to_element(id_input, "{아이디}").perform()


pw_input = driver.find_element(By.XPATH, '//*[@id="main-app-account"]/div/div[2]/div/div[2]/div[1]/div/div[2]/div[4]/input')
ActionChains(driver).send_keys_to_element(pw_input, "{비밀번호}").perform()

button = driver.find_element(By.XPATH, '//*[@id="main-app-account"]/div/div[2]/div/div[2]/div[1]/div/div[2]/button')
ActionChains(driver).click(button).perform()
728x90
SMALL
profile

개발로 자기계발

@김잠봉

틀린부분이나 조언이 있다면 언제든 환영입니다:-)