1. 동작 시퀀스와 그 순서
자동화 시퀀스를 계획하기 시작할 때, 동화처럼 간단한 것부터 복잡한 것까지 진행해야 한다는 것을 이해하는 것이 중요해. 당신의 스크립트가 웹사이트의 페이지를 탐험하는 영웅이라고 상상해봐. 각 단계는 신중하게 계획되고 조정되어 길을 벗어나지 않도록 하지.
자동화 시퀀스 단계별 생성
계획 작성부터 시작해야 해. 무엇을 달성하고 싶은가? 페이지 로드, 폼 작성, 버튼 클릭? "계획 없는 자는 실패를 계획한다"고 하잖아. 실패를 원하지 않으니, 예상 단계를 나열해보자.
from selenium import webdriver
from selenium.webdriver.common.by import By
# 드라이버 인스턴스를 생성합니다. 브라우저에 적합한 드라이버를 사용하세요.
driver = webdriver.Chrome()
# 페이지 열기
driver.get('https://example.com/login')
# 로그인 입력
driver.find_element(By.NAME, 'username').send_keys('my_username')
# 비밀번호 입력
driver.find_element(By.NAME, 'password').send_keys('my_secure_password')
# 로그인 버튼 클릭
driver.find_element(By.ID, 'login-button').click()
이렇게 해서 우리의 춤이 시작돼. 시퀀스의 각 단계를 순서대로 실행하여 스크립트가 쉽게 웹사이트를 탐색할 수 있도록 해줘.
단계별 실행 로그 작성
모든 존중할 만한 영웅처럼, 우리의 스크립트도 흔적을 남겨야 해, 우리가 어디에 있었고 무엇을 했는지 알 수 있도록. 로그 작성은 스크립트의 일기장 같은 거야. 단계 실행을 추적하고, 무언가 잘못되었을 때 오류를 식별하는 데 도움이 돼.
import logging
# 로그 설정
logging.basicConfig(level=logging.INFO)
# 동작 로그 예제
logging.info("로그인 페이지 열기")
driver.get('https://example.com/login')
로그는 디버깅을 돕는 것뿐만 아니라, 스크립트가 각 단계를 올바르게 수행하고 있음을 알려줘서 안심할 수 있게 해줘. 만약 무언가 잘못되면, 어느 시점에서 문제가 발생했는지 확인할 수 있어.
2. 읽기와 수정 용이성을 위한 코드 구조화
시퀀스가 더 복잡해지면, 코드를 잘 정리해두는 것이 중요해. 많은 손님과 음식이 있는 기념일 축하를 상상해봐. 모든 것이 제자리에 있지 않으면 혼란이 생기겠지. 우리의 경우, 코드의 혼란이야.
코드 구조 설정
코드를 최소한의 노력으로 변경하려면 잘 정리되어 있어야 해. 양말 정리자와 같이 모든 것을 체계적으로 정리해야 해. 반복적인 작업을 기능으로 분리하여 독립된 블록으로 만들어.
def login_to_site(driver, username, password):
logging.info("로그인 입력")
driver.find_element(By.NAME, 'username').send_keys(username)
logging.info("비밀번호 입력")
driver.find_element(By.NAME, 'password').send_keys(password)
logging.info("로그인 버튼 클릭")
driver.find_element(By.ID, 'login-button').click()
# 로그인 함수 사용
login_to_site(driver, 'my_username', 'my_secure_password')
함수 사용은 코드를 더 정리되게 만들고, 예를 들어 로그인 버튼의 ID
가 변경되면, 코드 전체를 수정하지 않고 단일 함수만 변경하면 돼.
3. 예제: 웹사이트에서 구매 과정 자동화
웹사이트에서 구매 과정을 자동화해야 한다고 상상해보자. 다음 단계가 포함돼:
- 웹사이트 열기 및 계정 로그인.
- 상품 카탈로그로 이동하여 상품을 장바구니에 추가.
- 장바구니로 이동하여 구매 완료.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 설정으로 드라이버 초기화
def initialize_driver():
driver = webdriver.Chrome()
driver.implicitly_wait(10) # 암시적 대기
return driver
# 계정 로그인 함수
def login(driver, username, password):
driver.get("https://example.com")
driver.find_element_by_id("username").send_keys(username)
driver.find_element_by_id("password").send_keys(password)
driver.find_element_by_id("login_button").click()
# 상품 카탈로그로 이동하고 상품을 장바구니에 추가하는 함수
def add_product_to_cart(driver):
driver.get("https://example.com/catalog")
product = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "product_item"))
)
product.click()
add_to_cart_button = driver.find_element_by_id("add_to_cart")
add_to_cart_button.click()
# 장바구니로 이동하고 구매 완료하는 함수
def checkout(driver):
driver.get("https://example.com/cart")
checkout_button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.ID, "checkout"))
)
checkout_button.click()
# 드라이버 종료 함수
def close_driver(driver):
driver.quit()
# 작업 시퀀스를 수행하는 메인 스크립트
def main():
# 데이터 설정
username = "myusername"
password = "mypassword"
# 드라이버 초기화
driver = initialize_driver()
try:
# 사이트 로그인
login(driver, username, password)
# 카탈로그로 이동하고 상품을 장바구니에 추가
add_product_to_cart(driver)
# 장바구니로 이동하고 구매 완료
checkout(driver)
finally:
# 드라이버 종료
close_driver(driver)
# 메인 스크립트 실행
main()
함수 설명
-
initialize_driver()
— 웹드라이버를 초기화하는 함수야. 모든 요소에 대한 암시적 대기를 설정하고 드라이버 객체를 반환해. -
login()
— 웹사이트에 로그인하는 함수야. 이 함수는 폼을 작성하고 버튼을 클릭하기 위해username
과password
를 받아. -
add_product_to_cart()
— 카탈로그로 이동하고 상품을 선택한 뒤 장바구니에 추가하는 함수야. -
checkout()
— 장바구니로 이동하고 구매를 완료하는 함수야. -
close_driver()
— 드라이버와의 작업을 종료하는 함수야. -
main()
— 작업 순서를 제어하는 메인 함수야. 모든 단계를 호출하며 로그인 데이터도 여기에 있어.
이 접근 방식의 장점
-
읽기 쉬움
— 각 단계가 독립적인 함수로 작성되어 코드 이해가 쉬워. -
재사용 가능성
— 특정 함수는 사이트에서 별도의 작업을 수행하기 위해 독립적으로 사용할 수 있어. -
테스트 용이성
— 각 단계를 별도로 테스트하여 모든 것이 올바르게 작동하는지 확인할 수 있어. -
유연성
— 필요할 경우 다른 함수를 추가하거나main()
에서 작업 순서를 변경할 수 있어.
GO TO FULL VERSION