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

使用Selenium定位按钮遇NoSuchElementException问题求助

解决Selenium点击谷歌地图路线按钮时的NoSuchElementException问题

问题描述

尝试点击下图中红色标记的路线按钮,但Selenium始终返回NoSuchElementException:

红色标记为我尝试访问的按钮

原代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time

# Set up driver and remove weird error message that doesn't matter
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(options=options)

# Get the webpage to interact with
driver.get('https://maps.google.com')

# Find search box and type into it
to_des = driver.find_element(By.ID, "searchboxinput").send_keys('McHenry Library')
enter = driver.find_element(By.ID, "searchboxinput").send_keys(Keys.ENTER)
# Line below should be clicking the button
directions = driver.find_element(By.XPATH, '//*[@id="QA0Szd"]/div/div/div[1]/div[2]/div/div[1]/div/div/div[4]/div[1]/button').click()
walking = driver.find_element(By.XPATH, '//*[@id="omnibox-directions"]/div/div[2]/div/div/div/div[4]/button').click()
from_des = driver.find_element(By.CLASS_NAME, 'tactile-searchbox-input')[2].send_keys('Oakes College')

错误原因

  • 硬编码XPATH过于脆弱:谷歌地图的DOM结构会频繁更新,固定层级的XPATH很容易失效。
  • 缺少等待机制:页面加载、搜索结果渲染需要时间,直接执行查找元素的操作时,目标元素可能还未出现在DOM中。
  • 元素选择错误:find_element(By.CLASS_NAME, ...)[2]写法错误,find_element只返回单个元素,要获取多个元素需用find_elements。

修复方案

使用显式等待替代固定等待,同时改用更稳定的元素定位方式(比如通过元素的aria-label、文本内容或更简洁的XPATH):

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

# 配置浏览器驱动
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(options=options)
wait = WebDriverWait(driver, 10)  # 最多等待10秒

# 打开谷歌地图
driver.get('https://maps.google.com')

# 输入目的地并搜索
search_box = wait.until(EC.presence_of_element_located((By.ID, "searchboxinput")))
search_box.send_keys('McHenry Library')
search_box.send_keys(Keys.ENTER)

# 点击路线按钮(通过aria-label定位,更稳定)
directions_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//button[@aria-label="路线"]')))
directions_btn.click()

# 点击步行选项
walking_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//button[@aria-label="步行"]')))
walking_btn.click()

# 填写起点(获取第三个搜索框)
from_input = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'tactile-searchbox-input')))[2]
from_input.send_keys('Oakes College')

关键优化点

  • 显式等待:WebDriverWait会等待元素出现并可点击后再执行操作,避免因页面未加载完成导致的错误。
  • 稳定定位器:用aria-label代替固定层级的XPATH,谷歌地图的无障碍标签通常不会轻易变更,定位更可靠。
  • 修正元素获取方式:用find_elements获取多个同class的元素,再通过索引访问第三个输入框。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:15:40