目的
我想让浏览器的popup弹出的窗口转化成标签页形式,谷歌官方的puppeteer有page.load('popup')函数可用,但是pyppeteer并没有这个功能,测试了浏览器launch里添加参数不行(设置'openInExistingWindow': True,),js方式也没搞定(自身不会js也是硬伤),后来想到的解决方法是通过chrome插件来解决。
满足要求的插件是https://chrome.google.com/webstore/detail/open-link-in-same-tab-pop/jmphljmgnagblkombahigniilhnbadca?hl=en
但是在使用pyppeteer加载的时候出现了问题,官方的加载方式是:
browser = await launch({"headless": False,
"args": ['--load-extension=../chrome_extension/',
'--disable-extensions-except=../chrome_extension/',]})
研究了chrome如何导出crx插件文件,和网络上直接下载的crx文件都不可加载提示错误:
无法加载以下来源的扩展程序:\Extensions\jmphljmgnagblkombahigniilhnbadca清单文件缺失或不可读。
Failed to load extension" Google Chrome expects a browser extension that does not exist anymore and throws the error message "Manifest file is missing or unreadable
通过把crx文件拖拽到扩展程序界面和在线安装也不行,提示错误:An error has occurred Installation is not enabled。
解决方法
根据https://eviloh.github.io/2018/08/05/headless-chrome-pptr%E5%88%9D%E6%8E%A2/ 这篇文章里面提到的,代码片段https://gist.github.com/GuilloOme/2bd651e5154407d2d2165278d5cd7cdb ,我下载下来直接放到上面的chrome_extension文件夹下就发现可以了,原来是插件加载需要使用解压后的插件,没解压的缺少manifest.json文件当然加载失败了,后续更改插件路径为解压后的插件路径就可用了。
chrome_extension=r'D:\chrome_extension\jmphljmgnagblkombahigniilhnbadca\2.1_0'
browser = await launch({
'headless': False,
'args': [
'--no-sandbox',
'--load-extension={}'.format(chrome_extension),
'--disable-extensions-except={}'.format(chrome_extension),
]
})
如何获得解压的chrome插件
在自己常用的chrome插件管理后台chrome://extensions/,安装要在pyppeteer上用的扩展插件,点击右上角的开发者模式,打开后,会看到插件上多了一个id复制后面的那长串字符,在自己的硬盘上找到这个命名的文件夹即可。如果windows系统一般是在C:\Users\你的电脑用户名\AppData\Local\Google\Chrome\User Data\Default\Extensions,如果是其他系统就找到chrome的用户目录里面去找找,或者安装有EveryThing这种全盘搜索的软件进行搜索会更方便。
总结
chrome/chromium加载插件目前只在'headless': False形式下可用,不可见的状态下是无法加载的。
自己的js和对于chrome插件了解的实在是太少,后续搜索chrome插件开发和英文版错误提示Manifest file is missing 就知道原来是缺少manifest,如果能早点看到这个提示就应该会理解应该是使用解压后的插件了。走了很多弯路,所幸最终解决了,如果要加载多个插件,那么就把多个插件路径用逗号隔开写到后面就可以了。
本文由三分醉博客原创,转载请注明:https://www.sanfenzui.com/pyppeteer-install-chrome-extensions-and-test.html
文章同步更新在知乎:三分醉 - 知乎