You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何这段Python日期选择代码陷入无限循环?如何解决?

解决日期选择器无限循环问题

核心问题:类型不匹配

你的代码中year是整数类型(2023),但从页面获取的yr是字符串类型(比如"2023"),整数与字符串直接比较永远不相等,导致循环终止条件mon == month and yr == year永远无法满足,进而陷入无限循环。

修复方法二选一:

  1. 将year定义为字符串:
    year = "2023"
    
  2. 将获取的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 02:25:29