Python Selenium中获取日历正确XPATH以定位指定日期的问题
解决Selenium定位日历指定日期的问题
问题根源
你之前的代码中,calendarMonth.find_element(By.XPATH, "//div[text()='{selectDay}']") 使用了//div,这是从整个文档根节点开始搜索匹配元素,所以会优先找到默认显示的8月日历中的日期,而非目标9月日历内的日期。
解决方案
方案1:修正相对路径定位
在子元素搜索时使用.//而非//,表示从当前元素(目标月份标题)的上下文范围内查找,而非整个文档:
import calendar from datetime import datetime from selenium import webdriver from selenium.webdriver.common.by import By dt_now = datetime.now() selectMonth = 9 # 要定位的月份(9代表9月) selectDay = "3" test = f'{calendar.month_name[selectMonth]} {dt_now.year}' # 定位目标月份的标题元素 calendarMonth = wb.find_element(By.XPATH, f"//b[text()='{test}']") # 使用相对路径搜索当前月份容器下的日期div calendarMonth.find_element(By.XPATH, f".//div[text()='{selectDay}']").click()
方案2:使用完整XPATH直接关联月份与日期
利用HTML结构中月份标题和日期同属一个tbody的特点,直接写一条XPATH一次性定位目标日期,无需分步查找:
import calendar from datetime import datetime from selenium import webdriver from selenium.webdriver.common.by import By dt_now = datetime.now() selectMonth = 9 selectDay = "3" test = f'{calendar.month_name[selectMonth]} {dt_now.year}' # 直接定位到目标月份所在tbody下的指定日期 target_day = wb.find_element(By.XPATH, f"//b[text()='{test}']/ancestor::tbody//div[text()='{selectDay}']") target_day.click()
如果需要更精准(避免页面其他无关div干扰),可以加上日期单元格的类名限制:
target_day = wb.find_element(By.XPATH, f"//b[text()='{test}']/ancestor::tbody//td[contains(@class, 'dayCell')]/div[text()='{selectDay}']")
为什么你之前的完整XPATH写法无效?
你尝试的//b[text()='{test}']//div[text()='{selectDay}'] 无法找到元素,是因为月份标题的<b>标签的后代节点中没有日期div——日期div在<b>所在行的下一行<tr>里,两者属于同一个<tbody>的兄弟节点,所以必须先定位到共同的父容器<tbody>,再在其中查找日期元素。
内容的提问来源于stack exchange,提问作者bigCredi
相关产品推荐
相关产品推荐

