无法点击MakeMyTrip网站Book按钮:Selenium自动化执行异常
问题分析与解决方案
核心问题:动态ID导致定位失效
你代码中使用的Book按钮ID是动态生成的(包含随机字符串RKEY:501c58c8-7838-4305-9a7f-68744ae5903d:25_0),这类ID会在每次页面加载、会话刷新时改变,这就是之前代码能运行、现在突然失效的根本原因。
具体修复步骤
1. 替换动态ID为稳定定位器
改用基于按钮文本、通用类名的相对XPath或CSS选择器,避免依赖动态变化的属性:
- 按按钮文本定位:
//button[contains(text(), 'Book Now')] - 按通用类名定位:
//button[contains(@class, 'bookBtn')](需根据页面实际class调整,比如MMT的Book按钮可能带有book-button这类通用标识)
示例替换代码:
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); WebElement bookBtn = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//button[contains(text(), 'Book Now')]"))); bookBtn.click(); // 补充点击操作,原代码仅获取元素未执行点击
2. 修正错误的窗口切换逻辑
你代码中执行了driver.switchTo().newWindow(WindowType.TAB),这会打开空白新标签页,但Book按钮在原搜索结果页面内,这一步操作完全错误,会导致后续代码在空白页执行,必然找不到元素,直接删除该行即可。
3. 用显式等待替换Thread.sleep
Thread.sleep是固定时长等待,易受网络、页面加载速度影响,建议全部替换为WebDriverWait的显式等待,比如:
// 等待出发城市输入框可交互 wait.until(ExpectedConditions.elementToBeClickable(By.id("fromCity"))).sendKeys("IXC");
4. 排查iframe与元素遮挡问题
如果上述方法仍无效:
- 检查Book按钮是否嵌套在iframe中,若存在需先切换到iframe再定位:
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("target-iframe-id"))); WebElement bookBtn = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//button[contains(text(), 'Book Now')]"))); driver.switchTo().defaultContent(); // 操作完成后切回主文档
- 确认是否有弹窗、广告遮挡Book按钮,先关闭遮挡元素再执行点击操作。
优化后的关键代码片段
// 选择航班后,等待Book按钮并点击 WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(15)); WebElement bookBtn = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//button[contains(text(), 'Book Now')]"))); bookBtn.click(); // 填写乘客信息(确保在正确页面执行) wait.until(ExpectedConditions.elementToBeClickable(By.className("addTravellerBtn"))).click(); wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("tvlrInput"))).sendKeys("person"); // 后续乘客信息填写逻辑...
内容的提问来源于stack exchange,提问作者Bug Hunter
相关产品推荐
相关产品推荐

