为用户动态推断和实现适当的 selenium web 驱动程序

Dynamically deduce and implement appropriate selenium web driver for user

首先,对于任何含糊不清和缺少代码,我深表歉意。我没想到会遇到 Selenium,它源于绘图库“Bokeh”的 2.0.0+ 对无头浏览器的要求,在该浏览器中渲染适合导出的图像。

问题: 我想在 Mac 和 Windows 上生成一个可执行应用程序。在这个应用程序中,有 Bokeh 的功能,可以使用无头浏览器(即 Selenium)生成 PNG。当 运行 应用程序作为可执行文件,并且 运行 生成 PNG 的函数时,我在 运行 可执行文件的随附控制台 window:

RuntimeError: Neither firefox and geckodriver nor a variant of chromium browser 
and chromedriver are available on system PATH. You can install the former with 
'conda install -c conda-forge firefox geckodriver'.

在输出该错误后,我尝试从默认的 Poetry 和辅助 Conda 环境构建项目,但两者都会导致相同的问题。只有当 运行 通过可执行文件编译脚本时才会出现此问题,而不是来自 shell(即 python run.py)。

所以,我知道我可以通过编程方式确定用户使用 system.platform() 在哪个 OS 上运行程序,但我想知道的是我是否可以对正在使用的浏览器进行相同的确定这样我就可以实现要传递给函数的适当网络驱动程序,以便将该网络驱动程序传递给使用它生成 PNG 的函数。这里有两个困难,第一个是需要决定网络驱动程序——尽管这可以通过检查是否可以使用 selenium.webdriver.Firefox.get('/') 或相同的 [=14] 创建浏览器实例来完成=] 来推断它们中的任何一个是否存在。第二个困难是确保提取的网络驱动程序与安装的浏览器版本相同,尽管我认为这可能内置于 .get('/').

tl;dr: 如何为 Mac 和 Windows 的用户动态推断和实施适当的 selenium.webdriver 实例支持的 selenium 浏览器和后续的 selenium 网络驱动程序?

感谢阅读。

我能在短时间内想到这个答案所需的最佳解决方案是使 Bokeh 的两个本机支持的 ​​Web 浏览器的驱动程序可用。首先,我确保用户了解安装 Firefox 或基于 Chromium 的浏览器的要求,并且该程序会处理驱动程序。然后,在程序中,我导入了两个 chromedriver_autoinstaller and geckodriver_autoinstaller 的 Python 包。虽然没有很好的记录,但确实很不干净。

在代码的初始化中,我简单地添加了行

chromedriver_autoinstaller.install() 
geckodriver_autoinstaller.install() 

它试图找到两个浏览器变体的本地安装,然后找到它们对应的网络驱动程序版本(必须与确切版本匹配)。如果有人想根据可用的浏览器只安装其中一个驱动程序,他们可以实现 this answer:

的变体
try:
    browser = webdriver.Firefox('/path/to/geckodriver')  # Optional argument, if not specified will search path.
    browser.get('/')
except (IOException, Exception):
    try:
        browser = webdriver.Chrome('path/to/chromedriver') # Optional argument, if not specified will search path.
        browser.get('/')
    except (IOException, Exception):
        print('No Browser Available')

最后,当使用Bokeh's export functionality时,您可以将参数指定为

from bokeh.io import export_png

export_png(plot, filename="plot.png", driver=browser)

由此 doc - “Bokeh 将搜索可用的浏览器(和驱动程序)并使用可用的浏览器,除非另有配置”。