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

Selenium首次运行无法定位元素 二次手动执行正常问题咨询

问题成因

首次执行代码报错、手动单跑点击代码正常的核心原因是页面加载时序问题:
driver.get()触发页面跳转后不会等页面所有元素渲染完成才执行下一行代码,你紧接着写的定位语句执行时,目标cookie授权按钮还没被加载到DOM树里,自然会抛出NoSuchElementException。
在Spyder里手动单独执行点击代码时,从打开页面到你手动运行代码的间隔已经足够让页面完成全部渲染,元素已经存在,所以可以正常点击。
另外你当前用的CSS选择器容错性很差:严格匹配class属性的完整字符串,只要网站调整class顺序、新增/删除一个关联class,就会直接定位失败。

修复方案
  • 弃用无意义的硬等待,使用Selenium内置的显式等待逻辑:设置最长等待时长,持续检测目标元素状态,一旦元素满足可点击条件就立刻执行操作,兼顾稳定性和执行效率。
  • 优化元素选择器,改用class包含匹配的写法,不用严格对齐完整class字符串,降低定位逻辑的脆弱性。

修正后的可运行代码如下,注意提前导入依赖模块:

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

options = webdriver.ChromeOptions()
options.add_argument('--disable-notifications')

driver = webdriver.Chrome('chromedriver.exe', options=options)
driver.get('https://www.ossiam.com/EN/')
driver.maximize_window()

# 最长等待10秒,直到目标按钮可点击
wait = WebDriverWait(driver, 10)
confirm_btn = wait.until(EC.element_to_be_clickable(
    (By.CSS_SELECTOR, 'label.btn.btn-outline-success')
))
confirm_btn.click()

上述选择器只会校验元素是否携带btn、btn-outline-success两个核心class,不会要求class的书写顺序、也不会因为元素多了其他业务class就定位失败,稳定性比全字符串匹配高很多。

如果遇到网络极差的场景,可以在显式等待前加一步检测页面加载完成状态,常规网络环境下上面的代码已经可以完全复现你手动执行时的效果,不会再出现首次运行找不到元素的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:54:16