使用Selenium获取Speedtest网速失败及报错问题求助
问题解决指南
一、修复executable_path弃用警告
Selenium 4+不再支持直接传入executable_path,必须通过Service对象配置驱动路径:
from selenium.webdriver.chrome.service import Service from selenium import webdriver # 替换为你的ChromeDriver实际路径 CHROME_PATH = "c:/path/to/chromedriver.exe" service = Service(CHROME_PATH) # 启动Chrome时传入service参数 driver = webdriver.Chrome(service=service)
二、解决证书解析与USB设备错误
这些属于非致命警告,可通过添加Chrome启动参数抑制,同时需确保ChromeDriver版本与本地Chrome浏览器完全匹配:
options = webdriver.ChromeOptions() # 忽略证书验证错误 options.add_argument("--ignore-certificate-errors") # 禁用USB设备扫描,解决USB描述符读取失败问题 options.add_argument("--disable-usb-discovery") # 合并配置启动Chrome driver = webdriver.Chrome(service=service, options=options)
三、无法获取网速数值的核心问题修复
1. 替换固定time.sleep为显式等待
固定等待时间不稳定,网络波动会导致测试未完成就尝试定位元素,改用Selenium显式等待确保元素加载完成:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By class TwitterBot: def __init__(self, driver): self.driver = driver self.up = 0 self.down = 0 def get_internet_speed(self): self.driver.get("https://www.speedtest.net/it") # 等待并点击隐私政策同意按钮 WebDriverWait(self.driver, 10).until( EC.element_to_be_clickable((By.ID, "onetrust-accept-btn-handler")) ).click() # 等待并点击开始测试按钮 WebDriverWait(self.driver, 10).until( EC.element_to_be_clickable((By.CLASS_NAME, "start-text")) ).click() # 等待下载速度元素加载完成(最长等待120秒) down_speed = WebDriverWait(self.driver, 120).until( EC.visibility_of_element_located((By.CLASS_NAME, "download-speed")) ).text # 等待上传速度元素加载完成 up_speed = WebDriverWait(self.driver, 120).until( EC.visibility_of_element_located((By.CLASS_NAME, "upload-speed")) ).text return up_speed, down_speed
2. 确保正确调用方法并输出结果
你可能遗漏了调用方法和打印结果的逻辑,添加以下入口代码:
if __name__ == "__main__": CHROME_PATH = "c:/path/to/chromedriver.exe" service = Service(CHROME_PATH) options = webdriver.ChromeOptions() options.add_argument("--ignore-certificate-errors") options.add_argument("--disable-usb-discovery") driver = webdriver.Chrome(service=service, options=options) bot = TwitterBot(driver) upload, download = bot.get_internet_speed() print(f"上传速度: {upload} Mbps") print(f"下载速度: {download} Mbps") driver.quit()
3. 验证元素定位准确性
如果仍无法定位元素,打开Speedtest页面按F12调出开发者工具,检查:
- 下载/上传速度元素的实际class名称是否为
download-speed/upload-speed - 若页面结构更新,替换为实际的class名或使用更精准的XPath定位
内容的提问来源于stack exchange,提问作者Niccolò Baresani
相关产品推荐
相关产品推荐

