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:]切片的写法参考自网络公开方案
故障根因
- 文件读取逻辑存在本质错误
全局持有的打开状态文件对象会内部维护读取指针,标记当前读取位置:
- 首次调用
lsc()时,文件指针初始在文件开头,file1.readlines()可正常读取全量内容,读取完成后指针自动移动到文件末尾,后续[lcount:]切片可正常拿到待处理的行,循环运行无异常。 - 第二次调用
lsc()时,文件指针仍停在上次读取结束的文件末尾位置,此时调用file1.readlines()从末尾开始读取,直接返回空列表。对空列表做[lcount:]切片得到的还是空列表,根本拿不到待处理的行数据。
- 浏览器无征兆关闭的直接原因
因为Lines为空列表,打印完count = 0后,for循环不会执行任何逻辑,lsc()函数瞬间运行结束。如果主程序在调用lsc()后没有其他阻塞保活逻辑,Python进程会直接退出,Selenium启动的浏览器作为子进程会被系统自动回收,表现为无征兆关闭。由于全程没有进入循环体,自然不会触发count == 9的判断分支,也就看不到该分支下的打印日志。
另外原代码还存在一个隐藏bug:触发count ==9执行browser.quit()后没有写break跳出循环,后续循环会继续操作已经销毁的浏览器实例,触发驱动报错。
修复方案
两种方案选其一即可:
- 保留全局文件对象的写法,每次读取前重置文件指针到开头:
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 # 新增:退出浏览器后跳出循环,避免后续操作无效实例
- 去掉全局文件对象,每次读取时重新打开文件,从根源避免指针位置异常问题,逻辑更易维护:
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
相关产品推荐
相关产品推荐

