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

使用Selenium WebDriver无法选择MakeMyTrip出发城市问题咨询

我之前也碰到过MakeMyTrip这个城市选择的坑,它的前端组件设计有点特殊,不是普通的下拉框,咱们一步步来排查和解决:

解决MakeMyTrip出发城市选择失败的问题

可能踩中的坑

  • 你可能没先触发城市选择弹窗,就直接定位选项(必须先点击出发城市输入框,让弹窗加载出来)
  • 用了动态变化的ID/class做定位器,导致找不到元素
  • 仅依赖隐式等待不够灵活,弹窗加载慢的时候容易超时

修正后的代码示例

import java.util.List;
import java.util.concurrent.TimeUnit;
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;

public class Makemytrip {
    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver", "D:\\Selenium\\chromedriver_win32\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        driver.manage().window().maximize();
        // 隐式等待做基础保障,配合显式等待处理动态元素
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        
        try {
            driver.get("https://www.makemytrip.com/");
            
            // 先处理首页可能出现的广告弹窗,避免干扰后续操作
            try {
                WebElement adCloseBtn = driver.findElement(By.cssSelector(".commonModal__close"));
                if (adCloseBtn.isDisplayed()) {
                    adCloseBtn.click();
                }
            } catch (Exception e) {
                // 没有广告弹窗就跳过
            }
            
            // 1. 点击出发城市输入框,唤起选择弹窗
            WebElement fromCityInput = driver.findElement(By.cssSelector("input[placeholder='From']"));
            fromCityInput.click();
            
            // 2. 显式等待城市选项列表加载完成,确保元素可见后再操作
            WebDriverWait wait = new WebDriverWait(driver, 15);
            WebElement cityListContainer = wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(".react-autosuggest__suggestions-list")));
            
            // 3. 遍历选项,定位目标城市并点击(示例选"Delhi",可替换成你需要的城市)
            List<WebElement> cityOptions = cityListContainer.findElements(By.cssSelector("li"));
            for (WebElement option : cityOptions) {
                String cityName = option.getText().trim();
                if (cityName.equals("Delhi")) {
                    option.click();
                    break;
                }
            }
            
            // 验证是否成功选中
            String selectedCity = fromCityInput.getAttribute("value");
            System.out.println("已选中的出发城市:" + selectedCity);
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // driver.quit(); // 测试完成后可打开该行关闭浏览器
        }
    }
}

关键优化点

  • 用稳定的定位器:优先选择input[placeholder='From']这类不会动态变化的属性,避免依赖随机生成的ID
  • 处理干扰元素:首页广告弹窗会挡住操作,加了异常捕获来兼容有无广告的情况
  • 显式等待替代单一隐式等待:针对弹窗加载这种动态场景,显式等待能确保元素处于可操作状态后再执行点击,大幅降低失败概率
  • 注意元素层级:城市选项嵌套在弹窗列表里,先定位列表容器再找选项,不要全局盲目查找

如果还是失败,可以检查:

  • ChromeDriver版本和Chrome浏览器版本是否匹配(这是很容易忽略的隐性问题)
  • 浏览器是否缩放导致元素不可点击(代码里加了窗口最大化来避免)
  • 目标城市的显示文本是否和你判断的一致(比如有的城市显示是"New Delhi"而非"Delhi",需要核对)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:10:56