You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium报错:WebDriver.__init__()含未预期参数executable_path求助

解决Selenium TypeError及网络测速推文程序优化方案

一、核心错误解决

你遇到的TypeError是因为Selenium 4.x版本已经移除了executable_path参数,不能再直接把驱动路径传给webdriver.Chrome()了。正确做法是用Service类管理驱动:

  1. 先导入Service类:
from selenium.webdriver.chrome.service import Service
  1. 修改驱动初始化代码:
self.driver = webdriver.Chrome(service=Service(driver_path))

二、代码里的其他坑要一起改

  1. 嵌套函数冗余:你的get_internet_speed方法里又定义了一个同名内层函数,会导致外部方法无法执行,直接删掉内层的def get_internet_speed(self):及对应缩进。
  2. 元素定位方法过时: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")。
  3. 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发推文,效率更高:

  1. 安装依赖:
pip install speedtest-cli requests
  1. 示例代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 06:40:34