Python Selenium运行登录脚本时出现NoSuchElementException错误怎么办
问题原因及修复方案
1. 核心报错NoSuchElementException的原因及修复
- id属性包含空格导致定位失败
HTML规范中id属性不允许包含空格,你传入的SignIn Form_email中的空格会被Selenium识别为分隔符,最终生成的选择器根本匹配不到对应元素。
修复方案:- 先打开目标页面按F12检查对应输入框的实际id值,大概率是你填写错误,正确id通常是下划线分隔的
SignIn_Form_email这类格式 - 如果确认id确实包含空格(不符合规范但部分网站会这么写),改成属性全匹配的定位方式:
from selenium.webdriver.common.by import By # css属性全匹配写法 user_id = driver.find_element(By.CSS_SELECTOR, '[id="SignIn Form_email"]') # 或者xpath全匹配写法 user_id = driver.find_element(By.XPATH, '//*[@id="SignIn Form_email"]') - 先打开目标页面按F12检查对应输入框的实际id值,大概率是你填写错误,正确id通常是下划线分隔的
- 页面未加载完成就查找元素
调用driver.get(url)后页面还在渲染的过程中,直接查找元素会找不到,建议添加显式等待:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 最多等待10秒,元素加载完成就继续执行 wait = WebDriverWait(driver, 10) user_id = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '[id="SignIn Form_email"]')))
2. 废弃告警的修复
你使用的是Selenium 4+版本,旧的find_element_by_*、executable_path写法已经被废弃,改成新标准写法即可:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By # 修复chromedriver初始化写法 s = Service(r"C:\CustomDrivers\chromedriver_win32\chromedriver.exe") driver = webdriver.Chrome(service=s)
完整修复参考代码
import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC url = "https://someurl.com" # 初始化driver s = Service(r"C:\CustomDrivers\chromedriver_win32\chromedriver.exe") driver = webdriver.Chrome(service=s) # 全局隐式等待,可配合显式等待使用 driver.implicitly_wait(10) driver.get(url) print(driver.title) # 定位账号输入框,注意替换为你实际的正确id user_id = driver.find_element(By.CSS_SELECTOR, '[id="SignIn Form_email"]') user_id.send_keys("admin@web.com") # 定位密码输入框 user_password = driver.find_element(By.CSS_SELECTOR, '[id="SignIn Form_password"]') user_password.send_keys("web$$DD") # 点击登录按钮 driver.find_element(By.XPATH, "//*[@id='SignIn Form']/div[3]/div/div/div/button").click() print(driver.title) time.sleep(5) driver.quit()
内容的提问来源于stack exchange,提问作者Atharva
相关产品推荐
相关产品推荐

