Selenium使用By.CLASS_NAME定位元素时NoSuchElementException的解决方法
解决Selenium NoSuchElementException 定位元素失败问题
原代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service s=Service("C:\selenium driver\chromedriver.exe") driver = webdriver.Chrome(service=s) driver.get("https://www.selenium.dev/selenium/web/web-form.html") driver.implicitly_wait(5) submit_button = driver.find_element(By.CLASS_NAME, "btn btn-outline-primary mt-3") submit_button.click()
报错信息
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".btn btn-outline-primary mt-3"} (Session info: chrome=109.0.5414.120)
问题分析
By.CLASS_NAME仅支持单个类名匹配,不能传入多个空格分隔的类名。当你传入"btn btn-outline-primary mt-3"时,Selenium会将其识别为一个完整的类名去查找,但页面中不存在拥有该完整类名的元素,因此抛出定位失败异常。
解决方案
有两种可行的修正方式:
方式1:使用CSS_SELECTOR匹配多类名
通过.连接多个类名,匹配同时拥有这些类的元素(注意类名之间无空格,空格代表后代选择器):
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service s=Service("C:\selenium driver\chromedriver.exe") driver = webdriver.Chrome(service=s) driver.get("https://www.selenium.dev/selenium/web/web-form.html") driver.implicitly_wait(5) # 用CSS选择器匹配多个类名 submit_button = driver.find_element(By.CSS_SELECTOR, ".btn.btn-outline-primary.mt-3") submit_button.click()
方式2:使用单个唯一类名
如果目标元素的某个类名是唯一的,直接用By.CLASS_NAME传入该单个类名即可:
# 选择唯一的类名"btn-outline-primary" submit_button = driver.find_element(By.CLASS_NAME, "btn-outline-primary") submit_button.click()
内容的提问来源于stack exchange,提问作者Zeyad Magdy
相关产品推荐
相关产品推荐

