百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

更简单地自动化操作浏览器

liebian365 2024-11-18 14:18 2 浏览 0 评论

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。

相关推荐

快递查询教程,批量查询物流,一键管理快递

作为商家,每天需要查询许许多多的快递单号,面对不同的快递公司,有没有简单一点的物流查询方法呢?小编的回答当然是有的,下面随小编一起来试试这个新技巧。需要哪些工具?安装一个快递批量查询高手快递单号怎么快...

一键自动查询所有快递的物流信息 支持圆通、韵达等多家快递

对于各位商家来说拥有一个好的快递软件,能够有效的提高自己的工作效率,在管理快递单号的时候都需要对单号进行表格整理,那怎么样能够快速的查询所有单号信息,并自动生成表格呢?1、其实方法很简单,我们不需要一...

快递查询单号查询,怎么查物流到哪了

输入单号怎么查快递到哪里去了呢?今天小编给大家分享一个新的技巧,它支持多家快递,一次能查询多个单号物流,还可对查询到的物流进行分析、筛选以及导出,下面一起来试试。需要哪些工具?安装一个快递批量查询高手...

3分钟查询物流,教你一键批量查询全部物流信息

很多朋友在问,如何在短时间内把单号的物流信息查询出来,查询完成后筛选已签收件、筛选未签收件,今天小编就分享一款物流查询神器,感兴趣的朋友接着往下看。第一步,运行【快递批量查询高手】在主界面中点击【添...

快递单号查询,一次性查询全部物流信息

现在各种快递的查询方式,各有各的好,各有各的劣,总的来说,还是有比较方便的。今天小编就给大家分享一个新的技巧,支持多家快递,一次能查询多个单号的物流,还能对查询到的物流进行分析、筛选以及导出,下面一起...

快递查询工具,批量查询多个快递快递单号的物流状态、签收时间

最近有朋友在问,怎么快速查询单号的物流信息呢?除了官网,还有没有更简单的方法呢?小编的回答当然是有的,下面一起来看看。需要哪些工具?安装一个快递批量查询高手多个京东的快递单号怎么快速查询?进入快递批量...

快递查询软件,自动识别查询快递单号查询方法

当你拥有多个快递单号的时候,该如何快速查询物流信息?比如单号没有快递公司时,又该如何自动识别再去查询呢?不知道如何操作的宝贝们,下面随小编一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号若干...

教你怎样查询快递查询单号并保存物流信息

商家发货,快递揽收后,一般会直接手动复制到官网上一个个查询物流,那么久而久之,就会觉得查询变得特别繁琐,今天小编给大家分享一个新的技巧,下面一起来试试。教程之前,我们来预览一下用快递批量查询高手...

简单几步骤查询所有快递物流信息

在高峰期订单量大的时候,可能需要一双手当十双手去查询快递物流,但是由于逐一去查询,效率极低,追踪困难。那么今天小编给大家分享一个新的技巧,一次能查询多个快递单号的物流,下面一起来学习一下,希望能给大家...

物流单号查询,如何查询快递信息,按最后更新时间搜索需要的单号

最近有很多朋友在问,如何通过快递单号查询物流信息,并按最后更新时间搜索出需要的单号呢?下面随小编一起来试试吧。需要哪些工具?安装一个快递批量查询高手快递单号若干怎么快速查询?运行【快递批量查询高手】...

连续保存新单号功能解析,导入单号查询并自动识别批量查快递信息

快递查询已经成为我们日常生活中不可或缺的一部分。然而,面对海量的快递单号,如何高效、准确地查询每一个快递的物流信息,成为了许多人头疼的问题。幸运的是,随着科技的进步,一款名为“快递批量查询高手”的软件...

快递查询教程,快递单号查询,筛选更新量为1的单号

最近有很多朋友在问,怎么快速查询快递单号的物流,并筛选出更新量为1的单号呢?今天小编给大家分享一个新方法,一起来试试吧。需要哪些工具?安装一个快递批量查询高手多个快递单号怎么快速查询?运行【快递批量查...

掌握批量查询快递动态的技巧,一键查找无信息记录的两种方法解析

在快节奏的商业环境中,高效的物流查询是确保业务顺畅运行的关键。作为快递查询达人,我深知时间的宝贵,因此,今天我将向大家介绍一款强大的工具——快递批量查询高手软件。这款软件能够帮助你批量查询快递动态,一...

从复杂到简单的单号查询,一键清除单号中的符号并批量查快递信息

在繁忙的商务与日常生活中,快递查询已成为不可或缺的一环。然而,面对海量的单号,逐一查询不仅耗时费力,还容易出错。现在,有了快递批量查询高手软件,一切变得简单明了。只需一键,即可搞定单号查询,一键处理单...

物流单号查询,在哪里查询快递

如果在快递单号多的情况,你还在一个个复制粘贴到官网上手动查询,是一件非常麻烦的事情。于是乎今天小编给大家分享一个新的技巧,下面一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号怎么快速查询?...

取消回复欢迎 发表评论: