美文网首页
snapshot_selenium报错处理

snapshot_selenium报错处理

作者: 羋学僧 | 来源:发表于2020-07-24 14:34 被阅读0次

snapshot_selenium 报错 The process started from chrome location /usr/bin/google-chrome is no longer

安装snapshot_selenium

pip3 install snapshot_selenium

安装chromedriver

传送门

运行pyecharts代码,结果保存成图片

from snapshot_selenium import snapshot as driver
 
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.render import make_snapshot
 
 
def bar_chart() -> Bar:
    c = (
        Bar()
        .add_xaxis(["衬衫", "毛衣", "领带", "裤子", "风衣", "高跟鞋", "袜子"])
        .add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105])
        .add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49])
        .reversal_axis()
        .set_series_opts(label_opts=opts.LabelOpts(position="right"))
        .set_global_opts(title_opts=opts.TitleOpts(title="Bar-测试渲染图片"))
    )
    return c
 
# 需要安装 snapshot-selenium 或者 snapshot-phantomjs
make_snapshot(driver, bar_chart().render(), "bar.png")

报错信息

selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally.
  (unknown error: DevToolsActivePort file doesn't exist)
  (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)

由于 snapshot_selenium 本身已经通过get_chrome_driver函数将 driver创建的代码封装起来了,所以,只好直接改他的源码了.

操作方法如下:

**1) 顺着代码往源头点开,直到 **

venv/lib/python3.6/site-packages/snapshot_selenium/snapshot.py

2)看到第55行的代码 get_chrome_driver 如下

def get_chrome_driver():
    options = webdriver.ChromeOptions()
    options.add_argument("headless")
    return webdriver.Chrome(options=options)

修改为:

def get_chrome_driver():
    options = webdriver.ChromeOptions()
    options.add_argument("headless")
    options.add_argument('--no-sandbox')
    options.add_argument('--disable-gpu')
    options.add_argument('--disable-dev-shm-usage')
    return webdriver.Chrome(options=options)

再次运行,完美通过.

改成mock的形式进行解决.

方法如下:

from unittest import mock
 
 
def get_chrome_driver():
    from selenium import webdriver
    options = webdriver.ChromeOptions()
    options.add_argument("headless")
    options.add_argument('--no-sandbox')
    options.add_argument('--disable-gpu')
    options.add_argument('--disable-dev-shm-usage')
    return webdriver.Chrome(options=options)
 
 
from snapshot_selenium import snapshot as driver
 
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.render import make_snapshot
 
 
def bar_chart() -> Bar:
    c = (
        Bar()
        .add_xaxis(["衬衫", "毛衣", "领带", "裤子", "风衣", "高跟鞋", "袜子"])
        .add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105])
        .add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49])
        .reversal_axis()
        .set_series_opts(label_opts=opts.LabelOpts(position="right"))
        .set_global_opts(title_opts=opts.TitleOpts(title="Bar-测试渲染图片"))
    )
    return c
 
 
with mock.patch('snapshot_selenium.snapshot.get_chrome_driver', get_chrome_driver):
    # 需要安装 snapshot-selenium 或者 snapshot-phantomjs
    make_snapshot(driver, bar_chart().render(), "bar.png")

重点是最顶部以及最底部的几行代码.

1)重新定义 get_chrome_driver函数

2)通过mock方式替换 snapshot_selenium.snapshot.get_chrome_driver 函数.关键语句:

with mock.patch('snapshot_selenium.snapshot.get_chrome_driver', get_chrome_driver)

学习来源1

学习来源2

相关文章

网友评论

      本文标题:snapshot_selenium报错处理

      本文链接:https://www.haomeiwen.com/subject/rlvjlktx.html