更简单地自动化操作浏览器
ninehua 2024-12-06 18:07 1 浏览
aardio 可以嵌入一大堆的浏览器组件,而且代码都非常简洁,不过今天我们要说的不是这些功能。
我们知道,在其他编程语言里比较流行的是使用 WebDriver 协议控制浏览器,这个非常方便,但实际用起来要做的事还不少,例如 WebDriver 控制 Chrome 你要安装 ChromeDriver,用 WebDriver 控制 Edge,你要安装 EdgeDriver ,而且每个不同版本的浏览器,要安装的对应的 Driver.exe 都 是不同的,这就真是个大坑了。
试想一下,别人电脑上有没有装 Chrome 还不一定,你得让用户自己装这个,还要自己去爬楼找到对应的 Driver.exe ,这是有多累,即使你基于这些写了个软件工具,大概率也只能自己玩玩了。
不过 aardio 里所有这些事都可以自动完成,aardio 的标准库里有个 chrome.driver,虽然他叫 chrome.driver,但是兼容非常多的浏览器,也兼容现在越来越普及的 Edge。使用 aardio里的 chrome.driver, 你只需要简单 地写自动化控制网页的代码就可以了,所有环境配置都由 aardio 自动处理,aardio 会自动检测系统的 Chrome, Edge浏览器,如果没有就自动安装合适的浏览器,而且自动下载对应版本的 ChromeDriver.exe, EdgeDriver.exe,这样你编写的软件工具也可以方便地分发给普通用户。
实际上我写的库 chrome.driver 主要的代码都是在处理 ChromeDriver,EdgeDriver 的安装部署与配置,至于 WebDriver 协议其实没有几句代码,aardio 先天就可以将任何基于 Web API 的接口自动导入为 aardio 对象,在这方面 aardio 就省事多了。
来看几句 aardio 调用代码体会一下丝滑与轻松的感觉:
import chrome.driver;
var driver = chrome.driver();
var browser = driver.startBrowser();
//打开网页
browser.go("http://www.baidu.com")
//查找文本输入框,返回的DOM对象也可以使用ququerySelector继续查找子节点
var ele = browser.querySelector("body").querySelector("#kw");
//在网页输入框输入内容
ele.setValue( "ChromeDriver" )
//调用JS,并且可以返回值(也可以返回DOM节点对象)
var searchButton = browser.doScript(`
//可以使用arguments访问aardio传来的参数
return arguments[0].querySelector("#su");
`
,browser.querySelector("body")//可以传任意个调用参数给JS,还可以直接传DOM节点对象
)
//JS返回的DOM节点对象也可以操作控制
searchButton.click();
有老的 aardio 用户看到这里可能就要说了,我 aardio 都用很久了,这些代码你天天吹了不知道多少遍了。好吧,其实今天这篇文章不是要说上面这些。之所以说这些,是考虑还有不少刚接触 aardio 的新手,对 aardio 的节奏和风格先有一个大致的概念。
前面已经说过了,aardio 的风格一贯都是这样,简单,简单 …… 还要更简单,人生苦短,我们没有那么多时间去下载、配置,看文档。能用程序做的事就用程序自动去做。
今天我要说一个新的东西,叫 SeleniumBasic, 一个 VB 用户向我介绍了这个开源组件,Selenium 大家应该知道了,WebDriver 就是 Selenium 使用的协议。而 SeleniumBasic 是基于 Selenium 的 .Net 版本封装的一个 VB 开源组件,用的人应该也不少。然后 SeleniumBasic v3 的作者 ryueifu 提到SeleniumBasic 需要注册 COM 控件,在很多电脑上存在兼容性问题,出现“无法创建对象”,“自动化错误”,所以进行了改进 ...... 具体的我在范例附上了文章链接大家可以自行了解。
我对这个开源组件的注册坑很感兴趣,aardio 中加载 COM 控件通常可以免注册加载,甚至是自内存加载,这不但是省事,不容易出错,对系统的污染也小,而且不同的程序即使用同一个组件也不会出现版本冲突(尤其是这些开源组件,万一有人修改了接口,却用了同一个 ProgID 注册呢?)
我把 SeleniumBasic 下过来看了一下,发现这是一个 .Net 写的组件,一堆 DLL,然后有一个注册的批处理,其实 .Net 的 DLL 不是那种原生 DLL,某种意义上更像是 aardio 中的库模块(把后缀名改为 dll ), 所以他这个注册控件相比原生 DLL 可能有更多的兼容问题,实际上我们也很少看到用 .Net 写的 COM 组件。
这个 SeleniumBasic 组件既然是 .Net 写的,我们其实也就没必要注册了,因为 .Net 的程序集本来就可以直接调用。我写了几句代码试了一下,可以使用,但是这个 DLL 又依赖 3 个其他的 DLL,这个就不太好了。你说写几句代码就拖 4 个 DLL,就算不用注册了,总是不太完美 。
于是我决定把这 4 个 DLL 合并为一个 DLL文件,我们可以用微软提供的 ILMerge 来做这件事,但是这个工具要码一堆命令行,这个就略有些麻烦了,于是顺手就写了个 aardio 扩展库 dotNet.merge 简化了合并程序集操作,然后又顺手写了个 GUI 工具:
用这个工具成功把 SeleniumBasic 合并为一个DLL,这个 DLL 不支持内存加载,不过没关系,用 aardio 提供的 dotNet.loadAppData() 一句代码解决 —— 支持生成独立 EXE 文件。
虽然我们做了一系列的简化,但还不够简单, SeleniumBasic 还是需要自己写一堆初始化的配置参数,需要你自己下载 Chrome,自己去找对应版本的 ChromeDriver.exe …… 于是我继承 aardio 的优良传统,封装了一个扩展库:dotNet.seleniumBasic ,把前面所有这些事同样全自动化的做了。
然后我高兴地发布了扩展库,正准备上公众号写文章向大家介绍介绍,在写以前,随手试了一下 …… 发现在我刚换的这台笔记本上,居然运行不了,原因是他的 ChromeDriver 不支持 Edge Chromium, 亲!你难道不知道 Edge 是正宗的 Chromium 核吗?!
要知道 chrome.driver 是兼容 Edge的,于是我对 dotNet.seleniumBasic 一通改,加了个懒人包函数 SeleniumBasic.CreateDefaultWebDriver() 自动做好所有的事,并且自动安装、切换、兼容 ChromeDriver 与 EdgeDriver。
好吧,最后我们看一下 aardio 调用 SeleniumBasic 到底有多简单:
import console;
console.showLoading(" 正在启动 SeleniumBasic ");
import dotNet.seleniumBasic;
var SeleniumBasic = dotNet.seleniumBasic;
var wd = SeleniumBasic.CreateDefaultWebDriver();
if(!wd) error("初始化或配置环境失败",2)
//打开网站
wd.Url = "https://www.baidu.com"
//查找表单
var form = wd.FindElementById("form")
//查找输入框
var keyword = form.FindElementById("kw")
//清空输入框,aardio 不能像 VB 那样省略函数调用后的括号
keyword.Clear();
//发送字符串
keyword.SendKeys("aardio");
//自动点击按钮
var button = form.FindElementById("su");
button.Click();
//重开控制台以前置控制台窗口,然后等待按键
console.close();
console.pause(,"按任意键退出浏览器");
//退出浏览器
wd.Quit();
是不是很简单?!
这个库发布一段时间以后,已经改进为使用 dotNet.reference 函数完美内存加载 SeleniumBasic 的这几个 DLL 了( 比 ILMerge 简单 ),相关源码如下:
dotNet.reference({
["WebDriver.Support"] = #34;~\lib\dotNet\seleniumBasic\.res\WebDriver.Support.dll";
["WebDriver"] = #34;~\lib\dotNet\seleniumBasic\.res\WebDriver.dll";
["SeleniumBasic"] = #34;~\lib\dotNet\seleniumBasic\.res\SeleniumBasic.dll";
});
aardio 代码在文件路径前加上 $ 符号 —— 表示将这个文件的二进制数据直接嵌入到程序里(发布后就不再需要这个文件了)。
dotNet.reference 函数用于在 .Net 中虚拟内存程序集, 原来的 .Net 代码一般不需要修改, 除非程序集内有获取程序集类径的代码。例如 SeleniumBasic.IWebDriver 构造函数内的
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
需要改为
System.AppDomain.CurrentDomain.BaseDirectory。
相关推荐
- 64位Win7中7zip无法关联文件的问题
-
问题1:win7x64中安装了7zip,在解压文件右键打开无法关联文件。解决方法1:在开始菜单中打开7-zipFileManage-》工具-》选项-》7-zip勾选“添加7-zip到右键菜单...
- MacBook电脑一键完成7Z、zip、dmg文件压缩,超高效率
-
许多朋友想要压缩文件,但又找不到合适的软件工具,今天小编推荐一个,本人一直在使用Mac压缩软件——MyZip!1、强大的压缩功能,满足日常生活的各种需要!...
- Win电脑必装良心APP!8款高效办公软件推荐
-
1、浏览器:EdgeWindows自带浏览器,速度快,内存占用少,集成度高,可以跨平台同步,支持很多拓展程序来增加浏览器的使用体验。...
- 7-Zip 解压缩工具被曝安全漏洞,可执行远程代码
-
7-Zip工具介绍7-Zip是一款广泛使用的开源压缩工具,以其高压缩比、多格式支持和免费开源的特性闻名。用户遍布全球,常用于文件的压缩与解压缩操作。然而,近期曝出的一系列安全漏洞,使得这款软件的安...
- 「IT之家评测室」英特尔酷睿i9-9900KS首发评测
-
英特尔今天正式解禁了酷睿i9-9900KS处理器,作为英特尔第一款全核5.0GHz的处理器,i9-9900KS的出现让追求极致性能的玩家又有了新的选择。因为工艺问题,英特尔现阶段桌面处理器依旧停留在1...
- 这才是“全家桶”软件该有的样子,win10电脑必备实用软件推荐
-
最近因为网课的原因,和很多老师打交道,才发现很多人的电脑里,弹窗广告满天飞,尤其是家里有小孩的,露骨的广告是很令人烦恼。那么这些弹窗广告究竟是从哪里来的呢?小迷虫被很多人问过,于是小迷虫反问:你给电脑...
- 牛年新年coreelec新升级19.0 coreelec 9.27
-
2021牛年新年刚过,CoreELEC新的升级就来了。我的升级方法是自己创新的文件替换大法,此法快速高效,中文、遥控和液晶显示,及...
- 靠谱!龙芯3A6000处理器套装测评,体验远超预期
-
2023年11月28日,龙芯中科在北京国家会议中心举办了盛大的发布会,会上发布了一系列龙芯产品,其中就包括了采用完全自主研发LoongArch指令集和龙芯第四代微架构的龙芯3A6000处理器。同时,知...
- 使用Python进行压缩与解压缩 用python解压压缩包
-
在日常工作中,除了会涉及到使用Python处理文本文件,有时候还会涉及对压缩文件的处理。通常会涉及到的压缩文件格式有:...
- 游戏持平,生产力更佳,浅谈14700KF和7800X3D谁更值得入手
-
#秋日生活打卡季#写在前面...
- “普通”压缩包实则隐藏恶意木马,黑客利用“ZIP串联文件”攻击
-
IT之家11月12日消息,安全公司PerceptionPoint报道,有黑客正在利用一种被称为“ZIP串联文件”的复杂规避策略针对Windows用户发动攻击。IT之家获悉,所谓“Z...
- 剔除软件中的流氓植入 清除流氓软件的工具
-
虽然流氓软件早已成为过街老鼠人人喊打,但是出于推广的需要,现在仍然有很多软件在进行捆绑。一些不知名网站下载的软件,甚至可能捆绑了木马、病毒等恶意软件。为了不让这些流氓软件进驻我们的电脑,可以在安装之前...
- 7zip如何把1G文件压缩到200M?三种方法快速简单!
-
文件太大会带来很多麻烦,不仅会占据我们有限的存储空间,而且传输给其他朋友或同事时也会因为太大而无法传输,或者传输太慢太耗时,实在让人烦躁......那么如何把1G文件压缩到200M呢?下面介绍三种有效...
- 7zip怎么压缩文件到最小?这样操作非常简单!
-
7-zip是一款免费开源的压缩软件,当我们需要打包压缩文件的时候,会用到它处理文件,那具体该怎么使用7-zip压缩文件到最小呢?下面简单有效的几个步骤。...