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

Java Selenium WebDriver日历翻页循环问题求助:匹配指定月份

嘿,我来帮你搞定Redbus日历的循环点击问题!既然定位器都没问题,那大概率是循环的终止条件、等待逻辑没处理到位,咱们一步步来修正。

完整解决方案代码

先给你一个可以直接复用的Java代码示例,我会在后面拆解关键细节:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.time.Duration;

public class RedbusCalendarLoop {
    public static void main(String[] args) {
        // 配置ChromeDriver路径,换成你本地的路径
        System.setProperty("webdriver.chrome.driver", "path/to/your/chromedriver");
        WebDriver driver = new ChromeDriver();
        driver.manage().window().maximize();
        driver.get("https://www.redbus.in/");

        // 目标月份,注意格式必须和页面显示完全一致(比如Redbus是"October 2024"这种格式)
        String targetMonth = "October 2024";
        // 最大点击次数,防止无限循环(最多12次,覆盖一整年)
        int maxClicks = 12;
        int clickCounter = 0;
        boolean isMonthFound = false;

        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));

        try {
            // 先打开日历(假设你已经能定位到出发日期输入框,这里用Redbus的默认ID示例)
            WebElement dateInput = wait.until(ExpectedConditions.elementToBeClickable(By.id("onwardCal")));
            dateInput.click();

            while (clickCounter < maxClicks) {
                // 等待月份标题加载完成,再获取当前显示的月份
                WebElement currentMonthElement = wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(".monthTitle")));
                String currentMonth = currentMonthElement.getText().trim();

                System.out.println("当前显示月份:" + currentMonth);

                if (currentMonth.equals(targetMonth)) {
                    isMonthFound = true;
                    System.out.println("成功找到目标月份:" + targetMonth);
                    break;
                } else {
                    // 点击下一页按钮
                    WebElement nextBtn = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(".next")));
                    nextBtn.click();
                    clickCounter++;
                    // 关键:等待月份切换完成,避免拿到旧的月份文本
                    wait.until(ExpectedConditions.not(ExpectedConditions.textToBe(By.cssSelector(".monthTitle"), currentMonth)));
                }
            }

            if (!isMonthFound) {
                System.out.println("点击" + maxClicks + "次后仍未找到目标月份,请检查目标月份格式是否正确");
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            driver.quit();
        }
    }
}
关键细节(你可能踩坑的地方)
  • 每次循环都重新获取当前月份:很多人会犯的错是在循环外只获取一次月份,导致循环里永远拿的是初始值,永远跳不出循环。上面的代码每次循环都会重新定位月份元素并获取文本,确保判断的是最新状态。
  • 点击后必须等待页面更新:点击下一页后,页面需要一点时间切换月份,直接获取文本会拿到旧值。这里用wait.until(ExpectedConditions.not(...))来等待月份文本发生变化,确保切换完成后再进行下一次判断。
  • 设置最大点击次数:如果不小心输错了目标月份(比如格式不对),没有这个限制会无限点击下去,12次刚好覆盖一整年,足够满足需求。
  • 严格匹配月份格式:Redbus的日历标题是「完整月份名+空格+年份」的格式(比如October 2024),大小写、空格都不能错,否则判断永远不成立。

内容的提问来源于stack exchange,提问作者priyanka murugesan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:04:46