如何解决Selenium的NoSuchElementException元素定位失败问题
修复Selenium登录ytmonster.net的错误问题
问题代码
# Importing everything # from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys import time # PATH + Driver Setup # PATH = "C:\Program Files (x86)\chromedriver.exe" driver = webdriver.Chrome(PATH) # Getting All Requirements # driver.get("https://ytmonster.net/login") time.sleep(5) imputUsername = driver.find_element(By.ID, "inputUsername") imputPassword = driver.find_element(By.ID, "inputPassword") linkClick = driver.find_element(By.CLASS_NAME, "btn btn-success") # Executing script # imputUsername.send_keys("mymail@gmail.com") imputPassword.send_keys("mypassword") linkClick.click
错误信息
C:\Users\Xera\Desktop\YtMonster Bot.py:9: DeprecationWarning: executable_path has been deprecated, please pass in a Service object driver = webdriver.Chrome(PATH) DevTools listening on ws://127.0.0.1:51847/devtools/browser/a848e7ed-d31d-4415-96c5-1a28a4729a17 [8664:1220:0815/155348.366:ERROR:device_event_log_impl.cc(214)] [15:53:48.364] Bluetooth: bluetooth_adapter_winrt.cc:1074 Getting Default Adapter failed. Traceback (most recent call last): File "C:\Users\Xera\Desktop\YtMonster Bot.py", line 16, in <module> linkClick = driver.find_element(By.CLASS_NAME, "btn btn-success") File "C:\Users\Xera\AppData\Local\Programs\Python\Python310\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 856, in find_element return self.execute(Command.FIND_ELEMENT, { File "C:\Users\Xera\AppData\Local\Programs\Python\Python310\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 434, in execute self.error_handler.check_response(response) File "C:\Users\Xera\AppData\Local\Programs\Python\Python310\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 243, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".btn btn-success"} (Session info: chrome=104.0.5112.81) Stacktrace: Backtrace: Ordinal0 [0x00CA78B3+2193587] Ordinal0 [0x00C40681+1771137] Ordinal0 [0x00B541A8+803240] Ordinal0 [0x00B824A0+992416] Ordinal0 [0x00B8273B+993083] Ordinal0 [0x00BAF7C2+1177538] Ordinal0 [0x00B9D7F4+1103860] Ordinal0 [0x00BADAE2+1170146] Ordinal0 [0x00B9D5C6+1103302] Ordinal0 [0x00B777E0+948192] Ordinal0 [0x00B786E6+952038] GetHandleVerifier [0x00F50CB2+2738370] GetHandleVerifier [0x00F421B8+2678216] GetHandleVerifier [0x00D317AA+512954] GetHandleVerifier [0x00D30856+509030] Ordinal0 [0x00C4743B+1799227] Ordinal0 [0x00C4BB68+1817448] Ordinal0 [0x00C4BC55+1817685] Ordinal0 [0x00C55230+1856048] BaseThreadInitThunk [0x766A6739+25] RtlGetFullPathName_UEx [0x779F90AF+1215] RtlGetFullPathName_UEx [0x779F907D+1165]
修复方案
1. 解决executable_path弃用警告
Selenium 4.x已弃用直接传入驱动路径的方式,需用Service类加载驱动:
- 导入
from selenium.webdriver.chrome.service import Service - 实例化
Service对象并传入驱动路径,再传给webdriver.Chrome
2. 修复按钮元素定位失败问题
By.CLASS_NAME仅支持单个类名匹配,无法处理空格分隔的多类名(btn btn-success是两个独立类),需改用:
By.CSS_SELECTOR,语法为.btn.btn-success(点号连接多个类)- 或
By.XPATH,语法为//button[@class='btn btn-success']
3. 修复点击方法调用错误
linkClick.click是方法引用,需添加括号执行调用:linkClick.click()
4. 替换不可靠的固定延迟(推荐)
用显式等待替代time.sleep,确保元素加载完成后再操作,提升稳定性:
- 导入
from selenium.webdriver.support.ui import WebDriverWait和from selenium.webdriver.support import expected_conditions as EC
修复后的完整代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.service import Service from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 驱动路径与Service设置,加r避免转义字符问题 PATH = r"C:\Program Files (x86)\chromedriver.exe" service = Service(PATH) driver = webdriver.Chrome(service=service) driver.get("https://ytmonster.net/login") # 显式等待元素加载,超时时间10秒 wait = WebDriverWait(driver, 10) imputUsername = wait.until(EC.presence_of_element_located((By.ID, "inputUsername"))) imputPassword = wait.until(EC.presence_of_element_located((By.ID, "inputPassword"))) linkClick = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".btn.btn-success"))) # 执行登录操作 imputUsername.send_keys("mymail@gmail.com") imputPassword.send_keys("mypassword") linkClick.click() # 操作完成后记得关闭驱动 # driver.quit()
内容的提问来源于stack exchange,提问作者Xera
相关产品推荐
相关产品推荐

