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

Selenium ChromeDriver报错:连续调用类方法时驱动已关闭求助

问题分析与解决方案

错误根源

NewConnectionError的本质是:你在get_internet_speed方法里调用了self.driver.quit(),直接关闭了浏览器驱动实例。当后续执行tweet_at_provider时,代码试图用已经被销毁的驱动去请求网页,必然会抛出连接错误。

除此之外,代码还有几个会导致运行失败的问题:

  • 主代码先导入InternetSpeedTwitterBot类,但类的定义在主代码之后,运行时会直接触发ImportError
  • 类方法的缩进不符合Python语法规范(比如tweet_at_provider的缩进错误)
  • down_speed和up_speed未在类的初始化方法中定义,可能引发AttributeError

修正后的完整代码

import time
from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

PROMISED_DOWN= 150
PROMISED_UP= 10
TWITTER_EMAIL= ""
TWITTER_PASSWORD=""

class InternetSpeedTwitterBot:
    def __init__(self, service_install):
        self.driver= webdriver.Chrome(service= service_install)
        self.down= 0
        self.up= 0
        # 初始化网速属性,避免未定义异常
        self.down_speed = 0
        self.up_speed = 0

    def get_internet_speed(self):
        self.driver.get("https://www.speedtest.net/")
        self.driver.maximize_window()
        time.sleep(5)

        self.driver.find_element(By.CLASS_NAME,"start-text").click()
        time.sleep(60)
        self.speeds= self.driver.find_elements(By.CLASS_NAME,"result-data-large")
        # 直接通过索引取值,无需循环
        if len(self.speeds) >=2:
            self.down_speed = self.speeds[0].text
            self.up_speed= self.speeds[1].text
        # 移除此处的driver.quit(),保留驱动供后续使用

    def tweet_at_provider(self, username, password):
        self.driver.get("https://twitter.com/?lang=en")
        self.driver.maximize_window()
        time.sleep(3)

        self.driver.execute_script("window.scrollBy(0,document.body.scrollHeight)")
        time.sleep(3)

        self.sign_up= self.driver.find_element(By.LINK_TEXT,'Sign in')
        self.sign_up.click()
        time.sleep(4)

        self.username= self.driver.find_element(By.NAME,'text')
        self.username.send_keys(username)
        self.username.send_keys(Keys.RETURN)
        time.sleep(4)

        self.re_username = self.driver.find_element(By.NAME,'text')
        self.re_username.send_keys("ArunaAcharya7")
        self.re_username.send_keys(Keys.RETURN)
        time.sleep(3)

        self.password= self.driver.find_element(By.NAME,"password")
        self.password.send_keys(password)
        self.password.send_keys(Keys.RETURN)
        time.sleep(5)

        self.status= self.driver.find_element(By.CSS_SELECTOR,'.public-DraftStyleDefault-block')
        self.status.send_keys(f"Hey my internet provider why is my internet speed {self.down_speed} down/{self.up_speed} up when I pay for {PROMISED_DOWN}down/{PROMISED_UP}up? ")
        time.sleep(5)

        self.tweet= self.driver.find_element(By.XPATH,'//*[@id="react-root"]/div/div/div[2]/main/div/div/div/div/div/div[3]/div/div[2]/div[1]/div/div/div/div[2]/div[3]/div/div/div[2]/div[3]/div/span/span')
        self.tweet.click()
        time.sleep(10)

# 主逻辑入口
if __name__ == "__main__":
    bot= InternetSpeedTwitterBot(Service(ChromeDriverManager().install()))
    bot.get_internet_speed()
    bot.tweet_at_provider(TWITTER_EMAIL,TWITTER_PASSWORD)
    # 所有操作完成后统一关闭驱动
    bot.driver.quit()

核心修改说明

  1. 调整代码结构:把类的定义移到主逻辑之前,同时调整导入语句顺序,解决导入错误
  2. 保留驱动实例:删除get_internet_speed中的self.driver.quit(),让驱动在整个任务流程中保持可用
  3. 统一清理资源:所有操作完成后,在主逻辑末尾调用bot.driver.quit()关闭驱动
  4. 初始化必要属性:在__init__方法中定义self.down_speed和self.up_speed,避免属性未定义异常
  5. 优化网速获取逻辑:移除不必要的循环,直接通过索引获取测速结果,提升代码可读性
  6. 修正语法问题:统一类方法的缩进,符合Python代码规范

内容的提问来源于stack exchange,提问作者Aruna Acharya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 09:05:27