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()
核心修改说明
- 调整代码结构:把类的定义移到主逻辑之前,同时调整导入语句顺序,解决导入错误
- 保留驱动实例:删除
get_internet_speed中的self.driver.quit(),让驱动在整个任务流程中保持可用 - 统一清理资源:所有操作完成后,在主逻辑末尾调用
bot.driver.quit()关闭驱动 - 初始化必要属性:在
__init__方法中定义self.down_speed和self.up_speed,避免属性未定义异常 - 优化网速获取逻辑:移除不必要的循环,直接通过索引获取测速结果,提升代码可读性
- 修正语法问题:统一类方法的缩进,符合Python代码规范
内容的提问来源于stack exchange,提问作者Aruna Acharya
相关产品推荐
相关产品推荐

