尝试解决Selenium+Chrome启动后的假死问题
QIN2DIM opened this issue · 0 comments
QIN2DIM commented
问题1
-
问题描述
-
使用Selenium处理滑动验证。当Selenium完整渲染页面、填入必要信息并加载拼图图像后,浏览器有几率假死。具体表现为,不触发任何类型Exception异常,使用
TimeoutException
无法捕捉异常,行为阻塞线程,浏览器不会自动关闭。 -
上述问题导致协程内的异常捕获方案无法正常执行(如超时关闭,刷新网页,窗口选定等等)。
-
上述问题可导致线程阻塞,使用诸如
schedule
等轻量化定时库会出现任务停滞等严重问题。意味着这一个浏览器动作卡着了,很可能导致后续所有预订的线程内定时任务都无法正常进行。
-
-
尝试方案
在关键步骤前后加入元素断言,在协程内判断驱动是否假死。并在当前函数的局部空间内实现通信日志的返回(
return
或yield
机制),立即释放资源或尝试接入异常捕获措施。
问题2
-
问题描述
使用Selenium渲染Chrome,某些意外操作引发的Exception异常导致Chrome进程游离。
-
尝试方案(已实现)
在多接口调用表层加入类似
loguru catch
方案,捕获异常栈追踪日志,使得Driver
最终执行quit()
而正常释放。此方法在某些场景下可用with
代替。# 实例代码 @logger.catch() def interface(url:str,options:ChromeOptions) -> None: api = Chrome(options=options) api.get(url) try: action_1(api) action_2(api) ... except WebDriverException as e: loger.exception(e) except Exception as e: loger.error(e) finally: api.quit()