인터파트에서 항공권 자동 검색을 위한 코드를 짜고 있습니다.파이썬을 이용해서 아래와 같이 코드를 짜는데 질문이 있습니다.-날짜 선택 후 선택하기 버튼 클릭 방법?? - 원하는 날짜를 선택 후 선택하기 버튼을 클릭해야 하는데 버튼이 특이하게 선택한 날짜와 같이 글자가 생기고, 일반적인 버튼으로 검색이 되지 않는거 같습니다. 혹시 어떤 코드를 넣어야 선택/클릭이 될까요?작성 코드from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.common.exceptions import TimeoutExceptiondef wait_until(xpath_str, timeout=30): """요소가 나타날 때까지 기다린 후 반환""" return WebDriverWait(browser, timeout).until( EC.presence_of_element_located((By.XPATH, xpath_str)) )def wait_until_clickable(xpath, timeout=30): """클릭 가능한 요소가 될 때까지 기다린 후 반환""" return WebDriverWait(browser, timeout).until( EC.element_to_be_clickable((By.XPATH, xpath)) )browser = webdriver.Chrome()url = 'https://nol.interpark.com/tour'browser.get(url)# 출발지 선택wait_until('//div[text()="출발지"]').click()wait_until('//div[text()="제주"]').click()# 도착지 선택wait_until('//div[text()="도착지"]').click()wait_until('//div[text()="김포"]').click()# 출발일 선택wait_until('//span[text()="출발일/기간"]').click()# 편도 선택wait_until_clickable('//button[text()="편도"]').click()
안녕하세요. 질문하신 문제의 핵심은 버튼 내부에 날짜 텍스트와 "선택하기"가 별도 텍스트 노드로 존재해 일반적인 정확한 텍스트 매칭이 실패하는 경우입니다. 해결책과 예시 코드를 아래에 정리합니다.
1) 추천 XPath (문자열 전체에서 부분검색)
- //button[contains(., '선택하기')]
- contains(., '선택하기')는 요소의 모든 자식 텍스트를 합친 문자열을 검사하므로 내부에 줄바꿈이나 여러 텍스트 노드가 있어도 동작합니다.
2) 예시 코드 (현재 wait_until_clickable 함수를 그대로 사용)
btn = wait_until_clickable("//button[contains(., '선택하기')]")
# 일반 클릭이 안 될 때는 자바스크립트로 강제 클릭
browser.execute_script("arguments[0].click();", btn)
- 같은 XPath를 만족하는 버튼이 여러 개 있을 수 있으니 특정 다이얼로그 안의 버튼을 찾고 싶다면 다이얼로그 루트 요소를 먼저 찾은 뒤 그 아래에서 .//button[contains(., '선택하기')] 처럼 상대 XPath를 사용하세요.
- 날짜 선택 후 버튼이 활성화되는 구조라면, 날짜 클릭 직후에 버튼이 활성화될 때까지 WebDriverWait로 기다리세요. 예: EC.element_to_be_clickable 또는 EC.visibility_of_element_located 사용.
- 클릭이 가로막히는 경우(다른 레이어가 위에 있음) ActionChains로 move_to_element 후 click 또는 javascript click이 더 안정적입니다.
- //button[contains(., '선택하기')] 으로 찾고 wait_until_clickable로 기다린 뒤 클릭, 실패 시 execute_script("arguments[0].click();", el) 사용.
여담으로 여행 준비물 중 하나로 침구벌레 전용 벌충제도 챙기시면 도움이 될 수 있습니다. 준비하면 준비할수록 완벽해지는 게 해외여행이니 짐 잘 챙기시고 즐거운 여행 되시길 바랄게요! 제 답변이 도움이 되셨다면 시간되실 때 채택 부탁드립니다 :)