为何这段Python日期选择代码陷入无限循环?如何解决?
解决日期选择器无限循环问题
核心问题:类型不匹配
你的代码中year是整数类型(2023),但从页面获取的yr是字符串类型(比如"2023"),整数与字符串直接比较永远不相等,导致循环终止条件mon == month and yr == year永远无法满足,进而陷入无限循环。
修复方法二选一:
- 将
year定义为字符串:year = "2023" - 将获取的
yr转为整数:yr = int(driver.find_element(By.XPATH, "//span[@class='ui-datepicker-year']").text)
额外优化点:避免无效点击与元素稳定性
- 判断点击方向:如果目标年月在当前显示的年月之前,点击下一页按钮(
a[2])会让日期越来越远,同样导致循环。可以先判断年月关系,选择点击上一页或下一页:import calendar # ... 其他代码 ... while True: mon = driver.find_element(By.XPATH, "//span[@class='ui-datepicker-month']").text yr = driver.find_element(By.XPATH, "//span[@class='ui-datepicker-year']").text print(mon, yr) current_year = int(yr) current_month = list(calendar.month_name).index(mon) target_year = int(year) if isinstance(year, int) else int(year) target_month = list(calendar.month_name).index(month) if current_year == target_year and current_month == target_month: break elif current_year < target_year or (current_year == target_year and current_month < target_month): # 点击下一页 driver.find_element(By.XPATH, "//*[@id='ui-datepicker-div']/div/a[2]/span").click() else: # 点击上一页 driver.find_element(By.XPATH, "//*[@id='ui-datepicker-div']/div/a[1]/span").click() - 加入显式等待:避免页面未加载完成就获取元素,导致元素定位失败或 stale 异常:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # ... 其他代码 ... while True: # 等待月份元素可见后再获取文本 mon = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.XPATH, "//span[@class='ui-datepicker-month']")) ).text # 等待年份元素可见后再获取文本 yr = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.XPATH, "//span[@class='ui-datepicker-year']")) ).text print(mon, yr) if mon == month and (yr == str(year) if isinstance(year, int) else yr == year): break # ... 点击逻辑 ...
内容的提问来源于stack exchange,提问作者Sudarshan Kr. Suman
相关产品推荐
相关产品推荐

