QIN2DIM/V2RSS

尝试解决Selenium+Chrome启动后的假死问题

QIN2DIM opened this issue · 0 comments

问题1

  • 问题描述

    1. 使用Selenium处理滑动验证。当Selenium完整渲染页面、填入必要信息并加载拼图图像后,浏览器有几率假死。具体表现为,不触发任何类型Exception异常,使用TimeoutException无法捕捉异常,行为阻塞线程,浏览器不会自动关闭。

    2. 上述问题导致协程内的异常捕获方案无法正常执行(如超时关闭,刷新网页,窗口选定等等)。

    3. 上述问题可导致线程阻塞,使用诸如schedule等轻量化定时库会出现任务停滞等严重问题。意味着这一个浏览器动作卡着了,很可能导致后续所有预订的线程内定时任务都无法正常进行。

  • 尝试方案

    在关键步骤前后加入元素断言,在协程内判断驱动是否假死。并在当前函数的局部空间内实现通信日志的返回(returnyield 机制),立即释放资源或尝试接入异常捕获措施。

问题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()