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

Python Selenium二次执行函数时未触发quit浏览器异常关闭问题

问题背景

使用Python搭配Selenium实现网站登录功能,逻辑设置为每完成8次尝试后关闭浏览器,执行与登录流程无关的操作后,复用启动阶段完全相同的逻辑重新打开浏览器继续运行。

涉及代码
file1 = open('C:/Users/miki2/OneDrive/Desktop/script/test.txt', 'r')
lcount = 0
count = 0
ccoun = 1
def lsc():
    global lcount, count, ccoun
    Lines = file1.readlines()[lcount:]
    count = 0
    print('count = ' + str(count))
    for line in Lines:
        count += 1
        lcount += 1
        if count == 9 :
            # Close the browser
            browser.quit()
            print('browser.quit in if count == 9')
故障现象
  • 程序首次启动时运行正常
  • 关闭浏览器重新打开后,代码执行到print('count = ' + str(count))语句时可正常打印count = 0,随后浏览器无提示直接关闭,表现与崩溃一致
  • 经排查if count == 9分支下的browser.quit()并未被调用,该分支内的调试打印语句没有任何输出
变量说明
  • lcount为行计数器,作用是控制代码不从文件第1行重新开始读取,而是从上次浏览器关闭前处理完成的最后一行继续启动for循环
  • 代码中readlines()后添加[lcount:]切片的写法参考自网络公开方案
故障根因
  1. 文件读取逻辑存在本质错误
    全局持有的打开状态文件对象会内部维护读取指针,标记当前读取位置:
  • 首次调用lsc()时,文件指针初始在文件开头,file1.readlines()可正常读取全量内容,读取完成后指针自动移动到文件末尾,后续[lcount:]切片可正常拿到待处理的行,循环运行无异常。
  • 第二次调用lsc()时,文件指针仍停在上次读取结束的文件末尾位置,此时调用file1.readlines()从末尾开始读取,直接返回空列表。对空列表做[lcount:]切片得到的还是空列表,根本拿不到待处理的行数据。
  1. 浏览器无征兆关闭的直接原因
    因为Lines为空列表,打印完count = 0后,for循环不会执行任何逻辑,lsc()函数瞬间运行结束。如果主程序在调用lsc()后没有其他阻塞保活逻辑,Python进程会直接退出,Selenium启动的浏览器作为子进程会被系统自动回收,表现为无征兆关闭。由于全程没有进入循环体,自然不会触发count == 9的判断分支,也就看不到该分支下的打印日志。

另外原代码还存在一个隐藏bug:触发count ==9执行browser.quit()后没有写break跳出循环,后续循环会继续操作已经销毁的浏览器实例,触发驱动报错。

修复方案

两种方案选其一即可:

  1. 保留全局文件对象的写法,每次读取前重置文件指针到开头:
def lsc():
    global lcount, count, ccoun
    file1.seek(0) # 新增:将文件读取指针移回文件开头
    Lines = file1.readlines()[lcount:]
    count = 0
    print('count = ' + str(count))
    for line in Lines:
        count += 1
        lcount += 1
        if count == 9 :
            browser.quit()
            print('browser.quit in if count == 9')
            break # 新增:退出浏览器后跳出循环,避免后续操作无效实例
  1. 去掉全局文件对象,每次读取时重新打开文件,从根源避免指针位置异常问题,逻辑更易维护:
lcount = 0
count = 0
ccoun = 1
def lsc():
    global lcount, count, ccoun
    # 每次调用时重新打开文件读全量行,再做切片
    with open('C:/Users/miki2/OneDrive/Desktop/script/test.txt', 'r', encoding='utf-8') as file1:
        all_lines = file1.readlines()
    Lines = all_lines[lcount:]
    count = 0
    print('count = ' + str(count))
    for line in Lines:
        count += 1
        lcount += 1
        if count == 9 :
            browser.quit()
            print('browser.quit in if count == 9')
            break

内容的提问来源于stack exchange,提问作者Cipi Iphito

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 18:27:25