使用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
相关产品推荐
相关产品推荐

