Python Selenium调用find_element报NoSuchElementException求助
问题场景
出于兴趣练习Python开发Minecraft相关小工具,基于Selenium实现网页自动化,访问plancke.io的Hypixel玩家统计页面时,调用find_element方法获取页面用户名元素触发大段报错,使用的Chrome浏览器版本为103.0.5060.53。
报错信息如下:
Traceback (most recent call last): File "D:\pythonProject\webscraping.py", line 17, in <module> username = driver.find_element(By.NAME, 'text-shadow: 1px 1px #eee; color:#3CE6E6') File "C:\Users\Han\AppData\Roaming\Python\Python37\site-packages\selenium\webdriver\remote\webdriver.py", line 1253, in find_element 'value': value})['value'] File "C:\Users\Han\AppData\Roaming\Python\Python37\site-packages\selenium\webdriver\remote\webdriver.py", line 430, in execute self.error_handler.check_response(response) File "C:\Users\Han\AppData\Roaming\Python\Python37\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, 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":"[name="text-shadow: 1px 1px #eee; color:#3CE6E6"]"} (Session info: chrome=103.0.5060.53) Stacktrace: Backtrace: Ordinal0 [0x00DB56B3+2184883] Ordinal0 [0x00D4E5F1+1762801] Ordinal0 [0x00C63DA8+802216] Ordinal0 [0x00C91B40+990016] Ordinal0 [0x00C91DDB+990683] Ordinal0 [0x00CBEC32+1174578] Ordinal0 [0x00CACB54+1100628] Ordinal0 [0x00CBCF52+1167186] Ordinal0 [0x00CAC926+1100070] Ordinal0 [0x00C86EA0+945824] Ordinal0 [0x00C87D96+949654] GetHandleVerifier [0x01054192+2704034] GetHandleVerifier [0x0104687D+2648461] GetHandleVerifier [0x00E4119A+529066] GetHandleVerifier [0x00E40006+524566] Ordinal0 [0x00D54F2B+1789739] Ordinal0 [0x00D59978+1808760] Ordinal0 [0x00D59A65+1808997] Ordinal0 [0x00D62A01+1845761] BaseThreadInitThunk [0x74F1FA29+25] RtlGetAppContainerNamedObjectPath [0x77097A9E+286] RtlGetAppContainerNamedObjectPath [0x77097A6E+238]
原实现代码如下:
from tqdm import tqdm from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By import time x=Service('C:\Program Files (x86)\chromedriver.exe') driver = webdriver.Chrome(service=x) pbar = tqdm(range(10)) for i in pbar: time.sleep(0.3) pbar.set_description("loading program") PlankeName = input("Whos Planke Page would you like to view? ") UserPlankeLink = "https://plancke.io/hypixel/player/stats/" + PlankeName driver.get(UserPlankeLink) username = driver.find_element(By.NAME, 'text-shadow: 1px 1px #eee; color:#3CE6E6') print(username) print("You are currently Viewing " + driver.title)
代码原逻辑:导入依赖后初始化Chrome驱动,用tqdm展示加载进度,接收用户输入的玩家ID拼接成目标页面URL访问,尝试定位用户名元素时触发报错。
问题根因
- 定位方法完全用错:
By.NAME的作用是匹配HTML标签的name属性值,传入的text-shadow: 1px 1px #eee; color:#3CE6E6是CSS样式代码,根本不是元素的name属性。从报错信息也能看到,Selenium自动把这段内容拼成了[name="xxx"]的属性选择器,当然匹配不到任何元素。 - 缺少页面加载等待:调用
driver.get()后页面资源、DOM结构需要时间渲染,代码立刻执行元素查找,哪怕定位逻辑正确也可能因为元素还没加载出来触发找不到元素的错误。 - Windows路径转义问题:驱动路径写的
'C:\Program Files (x86)\chromedriver.exe'里的反斜杠在Python字符串中是转义字符,容易出现路径识别失败的问题。 - 元素取值逻辑错误:直接打印Selenium定位到的元素对象,只能拿到元素实例的内存地址,拿不到页面上实际显示的用户名文本。
修复方案
- 把定位方式改成CSS选择器,匹配包含目标颜色样式的用户名标签:plancke.io的玩家用户名为h2标签,行内样式包含提到的蓝绿色值,用
style*=模糊匹配样式即可。 - 页面跳转后加显式等待逻辑,设置最长等待时长,等目标元素加载完成再执行后续操作,比固定sleep更稳定。
- 驱动路径前加
r标记为原始字符串,避免反斜杠转义问题。 - 调用元素的
.text属性获取实际显示的用户名文本。
修复后的可运行代码:
from tqdm import tqdm 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 import time # 路径前加r转成原始字符串,避免反斜杠转义错误 x = Service(r'C:\Program Files (x86)\chromedriver.exe') driver = webdriver.Chrome(service=x) pbar = tqdm(range(10)) for i in pbar: time.sleep(0.3) pbar.set_description("loading program") PlankeName = input("Whos Planke Page would you like to view? ") UserPlankeLink = "https://plancke.io/hypixel/player/stats/" + PlankeName driver.get(UserPlankeLink) # 最多等10秒,直到目标用户名元素加载完成 wait = WebDriverWait(driver, 10) username_ele = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, 'h2[style*="color:#3CE6E6"]')) ) # 取元素的文本内容才是实际用户名 username = username_ele.text print(username) print("You are currently Viewing " + driver.title) # 用完可调用driver.quit()关闭浏览器释放资源
内容的提问来源于stack exchange,提问作者Han Tang
相关产品推荐
相关产品推荐

