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

Selenium自动化选August 23却跳至September的问题求助

问题排查与修复方案

核心问题分析

  1. 额外点击导致月份跳过头:循环内连续执行了两次click()操作(一次是显式等待后的点击,一次是重新定位元素后的点击),每次循环会切换两次月份,最终导致跳过目标月份。
  2. 循环条件错误导致日志无输出:你要定位的是August,但循环判断条件是检查月份是否包含"April"——如果当前月份在April之后(比如页面默认显示当前月),循环根本不会进入,所以System.out.println没有执行机会。
  3. 日期选择逻辑与目标不符:代码里选的是"19",但你需要的是"23"。

修正后的代码

WebDriver driver = new ChromeDriver();
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
driver.manage().window().maximize();

driver.get("https://www.path2usa.com/travel-companions");

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.scrollBy(0,800)");

// 用显式等待替代Thread.sleep,更可靠
wait.until(ExpectedConditions.elementToBeClickable(By.id("form-field-travel_comp_date"))).click();

// 修正循环条件:目标月份改为August
while (!driver.findElement(By.xpath("//span[@class='cur-month']")).getText().contains("August")) {
    String currentMonth = driver.findElement(By.xpath("//span[@class='cur-month']")).getText();
    System.out.println("Current month: " + currentMonth);
    // 只点击一次下一月按钮,避免跳过头
    WebElement nextMonthBtn = wait.until(ExpectedConditions.elementToBeClickable(
        By.xpath("//span[@class='flatpickr-next-month']//*[local-name()='svg']")
    ));
    nextMonthBtn.click();
    // 等待月份切换完成后再进行下一次判断
    wait.until(ExpectedConditions.not(ExpectedConditions.textToBe(
        By.xpath("//span[@class='cur-month']"), currentMonth
    )));
}

// 选择23号日期,过滤掉前后月份的日期元素
List<WebElement> dates = wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(
    By.xpath("//span[contains(@class, 'flatpickr-day') and not(contains(@class, 'prev-month') or contains(@class, 'next-month'))]")
));
for (WebElement date : dates) {
    String text = date.getText();
    if (text.equalsIgnoreCase("23")) {
        date.click();
        break;
    }
}

// 记得关闭驱动
driver.quit();

关键修改说明

  • 移除重复点击:删除多余的driver.findElement(...).click(),确保每次循环只切换一次月份。
  • 修正循环条件:将判断目标从"April"改为"August",让循环逻辑匹配你的需求。
  • 增加月份切换等待:在点击下一月后,等待月份文本变化,避免循环判断时页面还未完成切换。
  • 优化日期定位:过滤掉前后月份的日期元素,只定位当前显示月份的日期,避免误点非目标月日期。
  • 替换Thread.sleep:用显式等待替代固定休眠,提升代码稳定性和执行效率。
  • 修正日期选择值:将"19"改为"23",匹配你的目标日期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 16:27:40