Python Selenium启动Chrome后立即自动关闭问题排查
问题核心原因
代码里两个问题直接导致浏览器秒关:
- 链式调用写法错误:
webdriver.Chrome(path).get("https://www.facebook.com/")中,get()方法本身无返回值(返回None),赋值给self.driver的根本不是Chrome驱动实例,既无法后续调用自动化方法,也没有持有有效驱动引用,执行完就会触发浏览器关闭。 - 驱动实例未被持久持有:按钮回调的lambda里创建的
Webdriver()是临时局部对象,回调执行完就会被Python垃圾回收机制回收,Selenium驱动实例被回收时会自动终止关联的Chrome进程,就会出现打开立刻关闭的现象。
修复方案
按下面两步修改即可实现浏览器常驻,后续可正常调用自动化能力:
- 修正Webdriver类实现,拆分驱动实例化和页面访问逻辑,加上Chrome的detach配置从配置层面禁止浏览器自动关闭。注意Selenium 4.6及以上版本不需要手动指定chromedriver路径,会自动匹配对应版本,旧版本再手动传路径即可。
from selenium import webdriver from selenium.webdriver.chrome.options import Options import tkinter as tk class Webdriver: def __init__(self): chrome_options = Options() # 开启detach配置,浏览器不会随驱动对象销毁自动关闭 chrome_options.add_experimental_option("detach", True) # 旧版Selenium需要传路径就用下面这行 # self.driver = webdriver.Chrome(executable_path="C:/Users/chromedriver.exe", options=chrome_options) # 新版Selenium直接传配置即可 self.driver = webdriver.Chrome(options=chrome_options) # 单独调用get方法访问页面,不要链式调用赋值给driver self.driver.get("https://www.facebook.com/")
- 修正Tkinter按钮的回调逻辑,把创建的驱动实例绑定到Tk根窗口的属性上,持久持有引用避免被垃圾回收:
root = tk.Tk() def open_browser(): # 把驱动实例挂到root对象上,全局持有引用不会被回收 root.driver = Webdriver().driver # 不要直接在grid/pack方法处赋值组件对象,不然拿到的返回值是None open_btn = tk.Button(root, text="Open the driver", command=open_browser) open_btn.grid(row=5, column=1, columnspan=2, pady=10, padx=30) root.mainloop()
后续实现登录、内容搜索等功能时,直接通过
root.driver调用Selenium对应方法即可,元素定位、表单填写、点击操作都能正常执行。需要关闭浏览器时手动调用root.driver.quit()即可。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

