Electron 结合 Selenium + chromedriver 驱动服务实现浏览器多开思路详解

 更新时间:2024年07月25日 11:23:38   作者:森叶  
这篇文章主要介绍了Electron 结合 Selenium + chromedriver 驱动服务实现浏览器多开思路详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

背景

在调研浏览器多开的过程中,electron 有自带的 browserview,webview,但是上面两个受制于 electron 内核版本限制,升级不够灵活,对新版的网页支持可能不及时,甚至不兼容,必须通过发布新的客户端版本才能解决,此外,这两个组件本身也不稳定,经常内存溢出,如果能改为 chrome 自己开发的浏览器内核来运行,则以上问题解决起来都不会特别吃力,所以才有了对 Electorn 控制浏览器多开的技术调研。

思路

在开发爬虫时,我了解导 selenium  和 chromedriver,其中 selenium 有个 node.js 调用库(还有 php,python,java 等包),其中 selenium 是一个 webdriver 协议,webdriver 是什么?和 chromedriver 有什么区别?这个后续再说。selenium 基于 webdriver 协议并且封装了 webdriver 协议,用以操控浏览器,而 chromedriver 负责桥接 selenium 和 chrome 浏览器,这样就实现了浏览器多开。

在研究爬虫时,还发现 puppeteer 库,这个库就比较特殊,它不依赖 chromedriver,那就意味着 puppeteer 自己实现了一套 chromedriver 用来管理 chrome,同时自己还实现了 selenium 的封装,如果将 puppeteer 打包到 electron 包中,那就要解决 chrome 执行路径的问题。   

实现

puppeteer 这个还没跑通,这个也没有现成的案例,github 有个库,但是只支持 node.js 18,而我用的 electron 依赖 node.js 16,此外还需要 puppeteer 的版本和 electron 的版本对应,这个处理起来比较复杂,也没有人给予一个完整可运行的 demo 包,因为暂时放弃这方面的探索。

electron 官网中讲了 selenium 和 chromedriver

这是一个比较古老的文档,electron 更新频率过快,很多库都懒得跟进 electron,选择 electron 本身就是个大坑,要面对的问题很多,要求掌握的知识也很多,还解决不了这些基础的 C++问题

Selenium 和 WebDriver | Electron

webdriver vs chromedriver 的区别 WebDriver

WebDriver 是一种定义了如何通过代码来操作浏览器的接口。它是一个规范(或者说协议),由 W3C 制定,旨在通过统一的接口与各种浏览器进行交互。WebDriver 允许开发人员编写代码来控制浏览器执行各种操作,如打开网页、点击按钮、输入文本等。

ChromeDriver

ChromeDriver 是 WebDriver 的一个具体实现,它专门用于与 Google Chrome 浏览器进行交互。ChromeDriver 充当一个独立的服务,用于接收 WebDriver 的命令并将这些命令转发给 Chrome 浏览器,从而控制浏览器的行为。它是由开发 Chromium 和 WebDriver 的团队维护的。

electron 文档讲的乱乱的

看上面的 electron 你会很懵逼,对方讲了很多套路和方法,但由于一些东西缺失具体的演示,你根本不知道干嘛的

electron 文档核心点解析

开头配置 Spectron没啥用,你可以直接忽略,看起来这个库都被放弃了

紧接着 Electron 给了两种 webdriver 实现协议,一种是WebDriverJs,一种是WebdriverIO,我一开始还以为这两者是顺序关系呢,其实是互斥的关系,是两种独立实现方式,第一种比较像 selenium,库名字也有 selenium,npm install selenium-webdriver, 第二种,ChatGPT-4o 说是一种简化写法,类似于 js 和 jquery 的关系,但其实第一种就够用了。

其中讲到的 npm install electron-chromedriver也是一种误导,其实就是 chromedriver,你装这个还会搞不清楚 chromedriver 和 chrome 两者之间的版本问题,但这里的 electron-chromedriver 应该是可以驱动 electron 自带的 chrome 浏览器的,但本文并不想探讨这个问题。

如何找到 chromedriver 以及对应的 chrome

开发爬虫最麻烦的点,就在于 chromedriver 和 chrome 的版本对应关系,这会让新手搔头抓耳,不过早有一批人整理了这些东西,我分享在这里

https://googlechromelabs.github.io/chrome-for-testing/latest-versions-per-milestone-with-downloads.json

非常 nice,这个 json 查看谷歌扩展是哪个?

GitHub - tulios/json-viewer: It is a Chrome extension for printing JSON and JSONP.

还有很多风格可以选择,推荐给大家,用这个查看在线 json 事半功倍

chromedriver 是可以直接启动的

下载好之后,找到路径,在地址栏输入 cmd,按回车,即可打开控制台

默认开启 9515 端口,至于启动那个 chrome,这是 selenium 那边控制的,chromedriver 会根据你给的 chrome.exe 去找到 chrome,来执行命令

我们将 119 版本的 chrome 下载下来放到 D 盘

在 Electron 主进程中编写一个启动函数

在 ready 事件中调用

function openChrome(){
    const webdriver = require('selenium-webdriver')
    const driver = new webdriver.Builder()
        // "9515" 是ChromeDriver使用的端口
        .usingServer('http://localhost:9515')
        .withCapabilities({
            'goog:chromeOptions': {
                // 这里填您的Electron二进制文件路径。
                binary: "D:\\chrome-win64\\chrome.exe",
                args: ['--no-sandbox', '--enable-chrome-browser-cloud-management']
            },
        }).forBrowser('chrome').build()
    driver.get('https://www.google.com')
    driver.findElement(webdriver.By.name('q')).sendKeys('webdriver')
    driver.executeScript(`
        setTimeout(function() {
            var inputElement = document.querySelector('input[name="btnK"]');
            if (inputElement) {
                inputElement.click();
            } else {
                console.error('元素未找到');
            }
        }, 3000);
    `);
}
app.on('ready', openChrome)

运行脚本 npm run dev就可以拉起浏览器了,通过给于不同的用户目录,就可以打开多个独立的浏览器同时运行,如果你将目录更换为最新用户自带的 chrome 浏览器地址也可以,不过这样

到此这篇关于Electron 结合 Selenium + chromedriver 驱动服务实现浏览器多开的文章就介绍到这了,更多相关Electron浏览器多开内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • javascript 人物逼真行走,已完成

    javascript 人物逼真行走,已完成

    然后请分析下程序,我出以下题目,供牛牛们练手(RPG游戏开发 - 实战,不搞理论,着重程序实现思路).
    2009-04-04
  • 一文了解你不知道的JavaScript生成器篇

    一文了解你不知道的JavaScript生成器篇

    ES6引入了一个新的函数类型,发现它并不符合这种运行到结束的特性。这类新的函数被称为生成器。生成器的出现是我们知道原来有时代码并不会顺利的运行,可以通过暂停的方式进行异步回调,让我们摒弃了此前的认知。本文就来聊聊JavaScript中生成器的相关知识
    2022-11-11
  • JS跨域之window.name实现的跨域数据传输

    JS跨域之window.name实现的跨域数据传输

    这篇文章主要介绍了JS跨域之window.name实现的跨域数据传输,需要的朋友可以参考下
    2022-01-01
  • 简介JavaScript错误处理机制

    简介JavaScript错误处理机制

    这篇文章主要介绍了JavaScript错误处理机制的相关资料,文中讲解非常细致,帮助大家更好的理解和学习JavaScript,感兴趣的朋友可以了解下
    2020-08-08
  • 浅谈 Mousewheel 事件

    浅谈 Mousewheel 事件

    当需要制作转动鼠标滚轮放大页面字体这样的交互效果时,会用到 Mousewheel 事件。
    2010-09-09
  • JS抛物线动画实例制作

    JS抛物线动画实例制作

    本篇文章给大家详细分析了JS抛物线动画制作过程以及相关的代码实例分享,有兴趣的朋友参考下。
    2018-02-02
  • JavaScript常见函数类型和用途实现场景分析

    JavaScript常见函数类型和用途实现场景分析

    在JavaScript中,除了惰性函数和防抖函数外,还有许多其他有用的函数模式和功能函数,以下是一些常见的函数类型和用途,感兴趣的朋友一起看看吧
    2024-12-12
  • JS的反射问题

    JS的反射问题

    两个等号直接比较值,但是类型不能相互转换的时候报错
    2010-04-04
  • css客齐集社区头像显示效果

    css客齐集社区头像显示效果

    这个例子,首先是把SPAN里的内容用display:none;干掉,就是不显示; 然后在A:HOVER时,再把SPAN里的内容display:block; 就是显示出来;同时定义一下SPAN的位置; 其它代码很简单,但有人说看不太懂;我就简单说一下;
    2008-06-06
  • 微信小程序实现滚动Tab选项卡

    微信小程序实现滚动Tab选项卡

    这篇文章主要为大家详细介绍了微信小程序实现滚动Tab选项卡,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11

最新评论