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

使用Python Selenium自动化MakeMyTrip时,逐个点击导航标签失败求助

问题分析与修复方案

原代码核心问题

  • 逻辑冗余:已经通过find_elements获取了全部导航标签列表,却额外用错误的XPATH去获取循环次数,完全没必要
  • XPATH语法错误:span[2]['+str(numberofpages)+']不符合XPATH规范,XPATH索引从1开始,不能嵌套索引
  • 未处理页面状态:MakeMyTrip首页常有弹窗,且页面加载有延迟,直接操作会导致元素定位失败
  • 元素失效问题:点击导航后页面跳转,原页面的导航元素会失效,循环内重复用旧定位会报错

修复后的代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.makemytrip.com/")

try:
    # 关闭首页弹窗(如果存在)
    close_btn = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, "//span[@class='commonModal__close']"))
    )
    close_btn.click()
except:
    pass

# 等待导航栏加载完成,获取所有导航元素
nav_count = len(WebDriverWait(driver, 10).until(
    EC.presence_of_all_elements_located((By.XPATH, "//nav[@class='flex items-center gap-4']//li/span/a"))
))

# 逐个点击导航标签
for index in range(nav_count):
    # 每次点击前重新定位当前导航(页面跳转后原元素失效)
    current_nav = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, f"(//nav[@class='flex items-center gap-4']//li/span/a)[{index+1}]"))
    )
    current_nav.click()
    print(f"已点击第{index+1}个导航标签")
    
    # 等待页面加载,时间可按需调整
    time.sleep(2)
    
    # 返回首页,继续处理下一个导航
    driver.back()
    # 等待首页导航栏重新加载
    WebDriverWait(driver, 10).until(
        EC.presence_of_all_elements_located((By.XPATH, "//nav[@class='flex items-center gap-4']//li/span/a"))
    )

driver.quit()

关键修复说明

  • 显式等待:确保元素完全加载后再操作,避免页面延迟导致的定位失败
  • 弹窗处理:提前关闭首页干扰弹窗,防止遮挡导航元素
  • 元素重定位:每次返回首页后重新获取导航元素,解决页面跳转后的元素失效问题
  • 正确索引:使用XPATH的(xpath)[n]语法定位,XPATH索引从1开始,符合规范

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 12:45:55