안녕하세요. 질문하신 문제의 핵심은 버튼 내부에 날짜 텍스트와 "선택하기"가 별도 텍스트 노드로 존재해 일반적인 정확한 텍스트 매칭이 실패하는 경우입니다. 해결책과 예시 코드를 아래에 정리합니다.
1) 추천 XPath (문자열 전체에서 부분검색)
- //button[contains(., '선택하기')]
- contains(., '선택하기')는 요소의 모든 자식 텍스트를 합친 문자열을 검사하므로 내부에 줄바꿈이나 여러 텍스트 노드가 있어도 동작합니다.
2) 예시 코드 (현재 wait_until_clickable 함수를 그대로 사용)
btn = wait_until_clickable("//button[contains(., '선택하기')]")
try:
btn.click()
except Exception:
# 일반 클릭이 안 될 때는 자바스크립트로 강제 클릭
browser.execute_script("arguments[0].click();", btn)
3) 추가 팁
- 같은 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) 사용.
여담으로 여행 준비물 중 하나로 침구벌레 전용 벌충제도 챙기시면 도움이 될 수 있습니다. 준비하면 준비할수록 완벽해지는 게 해외여행이니 짐 잘 챙기시고 즐거운 여행 되시길 바랄게요! 제 답변이 도움이 되셨다면 시간되실 때 채택 부탁드립니다 :)