Python Selenium未调用close() 封装类后浏览器自动关闭问题
问题根因
浏览器自动关闭的核心原因是你创建类实例时没有将实例赋值给变量持有引用:
你代码最后直接写browser("https://www.instagram.com"),这行代码执行完__init__方法后,这个临时创建的实例没有任何变量指向它,引用计数直接归0,会被Python垃圾回收机制立即回收。而Selenium的Chrome WebDriver实例在被垃圾回收时,会自动触发quit()方法关闭浏览器进程,这就是你没写关闭代码浏览器也自动退出的根本原因。
你之前不封装类的时候,WebDriver对象是定义在全局作用域的,全局变量的生命周期和整个脚本运行周期绑定,只要脚本还在运行(比如后面的time.sleep阻塞),WebDriver对象就不会被回收,浏览器自然不会自动关闭。
代码中存在的其他问题
- 实例方法调用写法不规范:类内部调用实例方法不需要用
类名.方法(self)的形式,直接写self.方法名()即可,你当前的写法在多实例、继承场景下会出现逻辑错误。 - 粉丝列表选择器写法错误:CSS多类选择器需要在每个类名前加
.,你写的"_aacl _aaco _aacw _aacx _aad7 _aade"无法匹配到目标元素;且遍历元素列表需要用find_elements()(带s),find_element()只会返回第一个匹配的单个元素,无法遍历。 - 文件写入逻辑错误:直接遍历WebElement对象写入文件,得到的是对象的内存地址,不是粉丝昵称文本,需要取元素的
.text属性;写文件时未指定编码,遇到特殊字符会抛编码错误。 - 类名不符合PEP8规范,类名建议使用大驼峰命名。
修复后代码
from selenium import webdriver from selenium.webdriver.common.by import By as by import time import os import idpas os.chdir("C:/Users/ben/Desktop/Yeni klasör") class Browser: def __init__(self,link): self.link = link self.browser = webdriver.Chrome() self.goInstagram() def goInstagram(self): time.sleep(3.5) self.browser.get(self.link) time.sleep(3.5) self.login() def login(self): username_input = self.browser.find_element(by.NAME,"username") password_input = self.browser.find_element(by.NAME,"password") login_btn = self.browser.find_element(by.XPATH,"//*[@id='loginForm']/div/div[3]") username_input.send_keys(idpas.id) password_input.send_keys(idpas.password) login_btn.click() time.sleep(1) def go_to_profile(self): profile_entry = self.browser.find_element(by.XPATH,"//*[@id='f2079fe6736dc34']/div/div/a") profile_entry.click() self.getFollowers() def getFollowers(self): follower_items = self.browser.find_elements(by.CSS_SELECTOR,"._aacl._aaco._aacw._aacx._aad7._aade") with open("C:/Users/ben/Desktop/Yeni klasör/followers.txt","w",encoding="utf-8") as f: for item in follower_items: f.write(f"{item.text.lower()}\n") if __name__ == "__main__": # 关键:将实例赋值给变量,持有引用避免被垃圾回收 ins_bot = Browser("https://www.instagram.com") time.sleep(100000)
验证方式
你可以自行测试复现问题:把修复代码里的ins_bot = 删掉,变回直接调用Browser("https://www.instagram.com"),就会复现之前登录完成后浏览器立刻自动关闭的现象;给实例赋值变量后,浏览器会一直保持打开直到sleep结束。
内容的提问来源于stack exchange,提问作者Bugra Pakir
相关产品推荐
相关产品推荐

