时间:2024-07-28
杨省伟,何秉羲
(1.河南质量工程职业学院现代教育技术中心,河南平顶山467000;2.河南大学计算机与信息工程学院,河南开封475001)
人们使用Web浏览器处理在线事务时,经常需要重复执行某些操作,例如:在教务管理系统中录入学生成绩;在办公自动化系统中处理公务等。有些常规操作可能会被频繁执行,消耗大量时间。目前,常见的解决方法主要有2种:(1)通过模拟键盘或鼠标操作,在Web页面内移动焦点进行定位并输入,能够实现Web的自动操作,减少手工操作的任务量,但是完成同样的操作,需要针对不同的硬件环境或系统做相应调整。(2)通过执行预编制好的脚本,可以完成更复杂的任务。
本文提出一个通用的解决方案,通过自定义脚本,利用WebBrowser组件技术[1],构建了一种自动化操作软件AutoBrowser。该软件运行于客户端,可以对Web页面进行完全控制,弥补了基于B/S技术的Web应用在客户端“弱控制”的不足。
浏览器包括解析HTTP协议、解析JavaScript脚本等部件。有些内容浏览器本身无法显示,例如Adobe Flash、Java Applet,这些需要利用插件来解决。除此之外,浏览器还提供一些辅助功能。浏览器本身是C/S结构,一般采取分层的设计思想来实现[2],典型架构如图1所示。图1中,浏览器引擎层(Browser Engine)提供了排版引擎的开发接口,让开发者可以不用关注底层CSS渲染、JavaScript解析等技术细节。本文采用的WebBrowser组件工作于浏览器引擎层,是一个组件类。
IE浏览器(Internet Explorer)是微软公司推出的应用最广泛的浏览器。WebBrowser组件作为IE的核心部件[3],为程序员开发基于Web的应用程序提供了极大的帮助,使用户能够在WebBrowser组件提供的窗体中浏览网页、导航网页。Windows平台下的IE浏览器采用了基于COM技术的模块化结构,具有重用、扩展的功能。
IE浏览器的模块结构(见表1)为:
第一层IExplore.exe位于最高层。Windows操作系统启动IE浏览器后,会创建iexplore进程。
第二层Shdocvw.dll提供了导航与浏览历史记录的功能,它封装了WebBrowser组件,可以供第三方程序员二次开发。
第三层 Mshtml.dll是IE浏览器的内核层,一般被称为Trident引擎(即浏览器内核)。Trident引擎是一款开放的内核,负责对网页语法进行解释,提供了CSS渲染,决定了浏览器如何显示网页的内容。Trident引擎被设计成一个软件组件(模块),可以供第三方程序员将网页浏览功能加入到他们自行开发的应用程序里。
第四层WinInet.dll提供了网络协议处理接口,实现了HTTP协议与FTP协议以及缓存功能。
图1 浏览器架构
表1 IE模块结构
WebBrowser组件是Shdocvw.dll的核心组件。第三方程序员可以使用C++、Visual Basic、C#等多种语言对WebBrowser组件进行二次开发。WebBrowser组件的重要事件如表2所示。
表2 WebBrowser组件的重要事件
当Web页面加载完毕时,WebBrowser组件会激发DocumentComplete事件,此时调用自动化操作对象,完成对当前页面的自动化操作。但是,如果页面包含有多个子框架(Frame),那么每个子框架内的页面都会激发一次DocumentComplete事件,这会造成该事件被重复激发,且难以判断什么时候所有页面加载完毕。此问题可以利用文献[4]提供的方法予以解决。
Web自动化操作软件有多种实现方案,其中一种方案是在用户接口层(见图1)。这种方案直接控制浏览器进行操作,运行方式类似于浏览器的外挂程序。该方案通常采用BHO(Browser Helper Object)技术实现[5]。BHO是微软推出的浏览器开放接口标准。通过这个接口,可以编写代码获取浏览器的行为。这种方案的缺点是依赖于浏览器主窗口,可扩展性差,难以实现定时、多任务等高级功能。另一种方案是:通过直接操纵HTTP数据包,进行自动化操作。该方案的优点是收发数据量少、操作速度快。但是缺点也非常突出,需要解析HTML数据,解析执行JavaScript脚本等。另外,对基于HTTPS协议的Web站点,还需要利用SSL协议对数据进行解析,工作量相当大。最终,本文选择基于WebBrowser组件的开发方案,该方案具有良好的可扩展性、可移植性,能够向操作者实时反映执行的结果,在执行失败时能够即时转由人工操作,保障任务顺利完成。
本文设计的AutoBrowser软件系统遵循分层思想,采取MVC框架模型进行构建[6],由CTaskData、CTaskPage、CMyBrowser三个基础类模块及其他辅助类模块组成,其整个结构如图2所示。
CTaskData控制输入输出数据,包括自定义的脚本;CTaskPage负责在当前页面上执行脚本;CMy-Browser是WebBrowser组件的封装类,处理受激发的事件;CTaskManager是任务管理模块,管理用户所有正在运行和未运行的任务;CTaskAuto是核心控制模块,是系统的中枢,负责AutoBrowser组件中所有事务的调度处理,比如将用户自定义脚本输送到CTask-Page进行执行,再将结果输送到CMyBrowser的图形接口层进行显示等。如果有文件资源需要下载或上传,则由CHttpSession开辟新的HTTP会话负责完成。
图2 AutoBrowser的MVC框架
MSHTML是WebBrowser组件中的一个COM组件[7],该组件封装了HTML语言中的所有元素及其属性,通过其提供的标准接口,可以访问指定网页的所有元素。MSHTML提供了丰富的HTML文档接口,有 IHTMLDocument、IHTMLDocument2、…、IHTMLDocument7 等 7 种。其中,IHTMLDocument只有一个Script属性,负责管理页面脚本。通过IHTMLDocument2接口可以得到网页元素的记录集合IHTMLElementCollection。通过IHTMLElement接口可以获得记录集合中的网页元素,包括节点元素的类型与属性,并完成具体操作。对节点元素的用户操作最常见的有鼠标单击操作及键盘的文本输入操作,它们分别对应节点元素的Click事件与put_innerText事件。
在对节点元素操作前,需要准确定位到待操作的元素。定位元素有多种方法,其中一种方法是通过匹配网页元素的ID属性进行定位。如果网页元素未定义ID属性,可以通过匹配其他属性定位。然而,在当今流行的前端Web页面的设计中,常用 Li标签、A标签等接受用户的鼠标单击操作,并且利用JQuery技术将具体操作定义在独立的脚本代码中,因此这些页面元素甚至不需要包含任何属性[8]。在这种情况下,可以通过页面元素在整个文档中的索引值进行定位。
实现Web自动化操作,需要第三方程序员事先定义操作脚本,启动操作任务后,通过手工或定时的方式让程序自动执行操作脚本。为了保持良好的可移植性与可读性,本文采用XML语言对操作脚本进行编码。脚本的定义需要包含两个基本要素:一是用于元素准确定位的属性描述;二是对该元素具体操作的描述,且在需要文本输入时包含输入的内容。另外,还需要考虑实现定时运行、验证码输入等使用场景。用户登录的示例脚本LoginTest的代码为:
其中任务(task)节点用来描述整个待执行的任务,它包含若干操作页面(page),page节点对应Web特定页面,它包含了对该页面具体操作的子结点。
由于种种原因,正常操作Web页面时,也可能存在操作失败的情况。操作失败时,如果不及时发现并停止,那么后续操作将会产生错误甚至意想不到的结果。因此,需要对用户操作结果进行验证。通过定义page的属性in检测页面是否正确进行了转移,in属性存放转向的新地址,如果携带有参数则由ivalue存放。在一些Web页面的实现中,客户端链接地址不会有变化,例如利用ASP.NET的Server.Transfer进行页面跳转,这时需要通过<tag type="check"/>进行检验。
用<page type="index"/>表示通过索引值定位页面元素,而用<page type="script"/>表示通过JavaScript脚本进行操作。如果当前页面支持JQuery,示例脚本LoginTest的page节点的代码为:
此脚本是通过调用IHTMLWindow2接口的execScript函数执行的,最新版本中execScript函数已被eval函数取代了,但仍保留原有功能。
本文设计的AutoBrowser软件主要用于Web页面的自动化操作,可以通过执行速度与可靠性两方面评估其运行效果。因为AutoBrowser的执行速度受多种因素影响,如运行环境的硬件配置、Web服务器响应速度、页面数据量、网络传输速度、网页脚本执行耗时等,因此很难给出具有实际意义的实验对比数据。但从其所处浏览器体系结构的层次可知,它更接近于系统底层,比传统的手工操作速度快,而且能够实现多任务并发执行。它的可靠性是由操作脚本的校验机制保证的,在实际运行中,如果遭遇网络中断等情况时,能够及时停止后续操作。但是,导致操作失败的因素可能是短暂出现的,比如网络堵塞等,应该引入多次尝试机制,甚至根据不同的情况,执行不同的脚本命令等,这些将是下一步研究的内容。
[1] 王瑛,梁楚樵.嵌入式环境下的浏览器定制技术的实现[J].武汉理工大学学报,2006,28(3):110-111.
[2] 李文印,周治国,周斌,等.专用浏览器/服务器系统模型的设计与实现[J].计算机应用,2004,24(2):76.
[3] Internet Explorer Architecture[EB/OL].[2015 -01 -24].https://msdn.microsoft.com/en -us/library/aa741312(VS.85).aspx.
[4] How To Determine When a Page Is Done Loading in WebBrowser Control[EB/OL].[2015 -01 -26].https://support2.microsoft.com/default.aspx?scid=kb%3Ben - us%3B180366.
[5] 桑庆兵,吴小俊.基于BHO的网站过滤系统研究与实现[J].计算机工程与应用,2009,45(31):18-19.
[6] 刘克.MVC架构及其在Web应用开发中的应用[J].计算机应用与软件,2006,23(7):57-58.
[7] MSHTML Reference[EB/OL].[2015 -02 -04].https://msdn.microsoft.com/en - us/library/aa741317(v=vs.85).aspx.
[8] Jeffrey Sambells,Aaron Gustafson.JavaScript DOM 高级程序设计[M].北京:人民邮电出版社,2014.
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!