Selenium报错:WebDriver.__init__()含未预期参数executable_path求助
解决Selenium TypeError及网络测速推文程序优化方案
一、核心错误解决
你遇到的TypeError是因为Selenium 4.x版本已经移除了executable_path参数,不能再直接把驱动路径传给webdriver.Chrome()了。正确做法是用Service类管理驱动:
- 先导入Service类:
from selenium.webdriver.chrome.service import Service
- 修改驱动初始化代码:
self.driver = webdriver.Chrome(service=Service(driver_path))
二、代码里的其他坑要一起改
- 嵌套函数冗余:你的
get_internet_speed方法里又定义了一个同名内层函数,会导致外部方法无法执行,直接删掉内层的def get_internet_speed(self):及对应缩进。 - 元素定位方法过时:Selenium 4.x已弃用
find_element_by_css_selector这类方法,改用find_element配合By类:- 原
go_button = self.driver.find_element_by_css_selector(".start-button a")改成:go_button = self.driver.find_element(By.CSS_SELECTOR, ".start-button a") - 上下行速率的XPath定位同理,替换成
find_element(By.XPATH, "你的xpath")。
- 原
- Windows路径转义:驱动路径里的反斜杠会被当成转义字符,改成原始字符串(加r前缀)或双反斜杠:
bot = InternetSpeedTwitterBot(r"C:\Users\u\.wade\browser\chromedriver.exe")
三、修正后的完整代码
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 import time PROMISE_DOWN = 11 PROMISE_UP = 1 SPEEDTEST_URL = "https://www.speedtest.net/" X_EMAIL = "EMAIL" X_PASSWORD = "PASS" class InternetSpeedTwitterBot: def __init__(self, driver_path): self.driver = webdriver.Chrome(service=Service(driver_path)) self.up = 0 self.down = 0 def get_internet_speed(self): self.driver.get(SPEEDTEST_URL) time.sleep(3) # 点击开始测试按钮 go_button = self.driver.find_element(By.CSS_SELECTOR, ".start-button a") go_button.click() # 等待测试完成(可根据实际情况调整时间) time.sleep(120) # 获取上行速率 self.up = self.driver.find_element(By.XPATH, '//*[@id="container"]/div/div[3]/div/div/div/div[2]/div[3]/div[3]/div/div[3]/div/div/div[2]/div[1]/div[2]/div/div[2]/span').text # 获取下行速率 self.down = self.driver.find_element(By.XPATH, '//*[@id="container"]/div/div[3]/div/div/div/div[2]/div[3]/div[3]/div/div[3]/div/div/div[2]/div[1]/div[3]/div/div[2]/span').text def tweet_at_provider(self): # 实现登录X并发布推文逻辑 self.driver.get("https://x.com/login") time.sleep(2) # 输入邮箱 email_input = self.driver.find_element(By.NAME, "text") email_input.send_keys(X_EMAIL) email_input.send_keys(Keys.ENTER) time.sleep(2) # 输入密码(若有验证步骤需额外处理) password_input = self.driver.find_element(By.NAME, "password") password_input.send_keys(X_PASSWORD) password_input.send_keys(Keys.ENTER) time.sleep(3) # 撰写推文 tweet_box = self.driver.find_element(By.CSS_SELECTOR, '[data-testid="tweetTextarea_0"]') tweet_content = f"嘿,我的实际网速是下行{self.down}Mbps,上行{self.up}Mbps,根本没达到承诺的{PROMISE_DOWN}/{PROMISE_UP}Mbps!@运营商账号" tweet_box.send_keys(tweet_content) # 发送推文 send_button = self.driver.find_element(By.CSS_SELECTOR, '[data-testid="tweetButton"]') send_button.click() # 路径使用原始字符串 bot = InternetSpeedTwitterBot(r"C:\Users\u\.wade\browser\chromedriver.exe") bot.get_internet_speed() bot.tweet_at_provider()
四、更轻量的替代方案(不用Selenium)
不想折腾浏览器自动化的话,可以用speedtest-cli直接测速,再调用X的API发推文,效率更高:
- 安装依赖:
pip install speedtest-cli requests
- 示例代码:
import speedtest import requests PROMISE_DOWN = 11 PROMISE_UP = 1 # 需在X开发者平台申请API密钥 X_API_KEY = "你的API密钥" X_API_SECRET = "你的API密钥密码" X_ACCESS_TOKEN = "你的访问令牌" X_ACCESS_TOKEN_SECRET = "你的访问令牌密码" def get_internet_speed(): st = speedtest.Speedtest() st.get_best_server() down_speed = st.download() / 1_000_000 # 转换为Mbps up_speed = st.upload() / 1_000_000 return round(down_speed, 2), round(up_speed, 2) def tweet_at_provider(down, up): if down < PROMISE_DOWN or up < PROMISE_UP: tweet_text = f"嘿,我的实际网速是下行{down}Mbps,上行{up}Mbps,根本没达到承诺的{PROMISE_DOWN}/{PROMISE_UP}Mbps!@运营商账号" # 调用X的API发推文 url = "https://api.x.com/2/tweets" headers = { "Authorization": f"Bearer {X_ACCESS_TOKEN}", "Content-Type": "application/json" } data = {"text": tweet_text} response = requests.post(url, json=data, headers=headers) if response.status_code == 201: print("推文发送成功") else: print(f"发送失败:{response.text}") down, up = get_internet_speed() tweet_at_provider(down, up)
内容的提问来源于stack exchange,提问作者Aaradhy
相关产品推荐
相关产品推荐

