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

使用Selenium Python点击按钮遇NoSuchElementException,求解决方案

问题描述

尝试用Selenium Python实现按钮点击功能,编写了如下代码:

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

options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument('--ignore-ssl-errors')
path = 'C:/Users/chromedriver-win64/chromedriver.exe'

cService = Service(path)
driver = webdriver.Chrome(service = cService)

url = 'https://kavirtire.ir/esale/login'
driver.get(url)
search_box = driver.find_element(By.CLASS_NAME,'form-control')
search_box.click()
search_box.send_keys('2948608910')
#search_box.send_keys(Keys.ENTER)
frame = driver.find_elements(By.TAG_NAME, 'iframe')
driver.switch_to.frame(frame[0])
driver.find_element(By.CLASS_NAME, 'recaptcha-checkbox-border').click()
time.sleep(2)

button = driver.find_element(By.XPATH,"/html/body/div[1]/div/div/div/div[1]/div[2]/div/form/div[3]/button").click()
time.sleep(5)

执行代码时出现如下错误:

raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such
element: Unable to locate element: {"method":"xpath","selector":"/html/body/div[1]/div/div/div/div[1]/div[2]/div/form/div[3]/button"
(Session info: chrome=123.0.6312.86)

解决方案

出现这个问题的核心原因是操作完reCAPTCHA后未切回主页面上下文,同时绝对XPath稳定性差,可按以下步骤修复:

  • 切回主文档上下文:操作iframe内的reCAPTCHA后,必须调用driver.switch_to.default_content()回到主页面,否则Selenium会一直停留在iframe的上下文里,无法定位主页面的元素。
  • 替换绝对XPath为相对定位:绝对XPath依赖页面的完整层级结构,一旦页面微调就会失效,改用基于元素属性或文本的相对定位更稳定。
  • 用显式等待替代硬sleep:time.sleep()是固定时长等待,容易因页面加载慢导致失败,用WebDriverWait等待元素可点击/出现,可靠性更高。

优化后的代码:

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
from selenium.webdriver.chrome.service import Service

options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument('--ignore-ssl-errors')
path = 'C:/Users/chromedriver-win64/chromedriver.exe'

cService = Service(path)
driver = webdriver.Chrome(service = cService)

url = 'https://kavirtire.ir/esale/login'
driver.get(url)

# 等待并输入账号
search_box = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CLASS_NAME, 'form-control'))
)
search_box.send_keys('2948608910')

# 处理reCAPTCHA
frame = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.TAG_NAME, 'iframe'))
)
driver.switch_to.frame(frame)
recaptcha_checkbox = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.CLASS_NAME, 'recaptcha-checkbox-border'))
)
recaptcha_checkbox.click()

# 切回主页面
driver.switch_to.default_content()

# 等待并点击登录按钮(用相对定位,适配页面结构变化)
login_button = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, 'form button[type="submit"]'))
)
login_button.click()

# 后续操作完成后关闭浏览器
driver.quit()

补充说明:

  • 如果按钮有明确文本,也可以用(By.XPATH, '//button[contains(text(), "登录")]')定位,需根据页面实际文本调整。
  • 确保ChromeDriver版本与Chrome浏览器版本匹配,版本不兼容也可能导致元素定位异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 12:43:14