楊省偉,何秉羲
(1.河南質(zhì)量工程職業(yè)學(xué)院現(xiàn)代教育技術(shù)中心,河南平頂山467000;2.河南大學(xué)計算機(jī)與信息工程學(xué)院,河南開封475001)
人們使用Web瀏覽器處理在線事務(wù)時,經(jīng)常需要重復(fù)執(zhí)行某些操作,例如:在教務(wù)管理系統(tǒng)中錄入學(xué)生成績;在辦公自動化系統(tǒng)中處理公務(wù)等。有些常規(guī)操作可能會被頻繁執(zhí)行,消耗大量時間。目前,常見的解決方法主要有2種:(1)通過模擬鍵盤或鼠標(biāo)操作,在Web頁面內(nèi)移動焦點進(jìn)行定位并輸入,能夠?qū)崿F(xiàn)Web的自動操作,減少手工操作的任務(wù)量,但是完成同樣的操作,需要針對不同的硬件環(huán)境或系統(tǒng)做相應(yīng)調(diào)整。(2)通過執(zhí)行預(yù)編制好的腳本,可以完成更復(fù)雜的任務(wù)。
本文提出一個通用的解決方案,通過自定義腳本,利用WebBrowser組件技術(shù)[1],構(gòu)建了一種自動化操作軟件AutoBrowser。該軟件運行于客戶端,可以對Web頁面進(jìn)行完全控制,彌補(bǔ)了基于B/S技術(shù)的Web應(yīng)用在客戶端“弱控制”的不足。
瀏覽器包括解析HTTP協(xié)議、解析JavaScript腳本等部件。有些內(nèi)容瀏覽器本身無法顯示,例如Adobe Flash、Java Applet,這些需要利用插件來解決。除此之外,瀏覽器還提供一些輔助功能。瀏覽器本身是C/S結(jié)構(gòu),一般采取分層的設(shè)計思想來實現(xiàn)[2],典型架構(gòu)如圖1所示。圖1中,瀏覽器引擎層(Browser Engine)提供了排版引擎的開發(fā)接口,讓開發(fā)者可以不用關(guān)注底層CSS渲染、JavaScript解析等技術(shù)細(xì)節(jié)。本文采用的WebBrowser組件工作于瀏覽器引擎層,是一個組件類。
IE瀏覽器(Internet Explorer)是微軟公司推出的應(yīng)用最廣泛的瀏覽器。WebBrowser組件作為IE的核心部件[3],為程序員開發(fā)基于Web的應(yīng)用程序提供了極大的幫助,使用戶能夠在WebBrowser組件提供的窗體中瀏覽網(wǎng)頁、導(dǎo)航網(wǎng)頁。Windows平臺下的IE瀏覽器采用了基于COM技術(shù)的模塊化結(jié)構(gòu),具有重用、擴(kuò)展的功能。
IE瀏覽器的模塊結(jié)構(gòu)(見表1)為:
第一層IExplore.exe位于最高層。Windows操作系統(tǒng)啟動IE瀏覽器后,會創(chuàng)建iexplore進(jìn)程。
第二層Shdocvw.dll提供了導(dǎo)航與瀏覽歷史記錄的功能,它封裝了WebBrowser組件,可以供第三方程序員二次開發(fā)。
第三層 Mshtml.dll是IE瀏覽器的內(nèi)核層,一般被稱為Trident引擎(即瀏覽器內(nèi)核)。Trident引擎是一款開放的內(nèi)核,負(fù)責(zé)對網(wǎng)頁語法進(jìn)行解釋,提供了CSS渲染,決定了瀏覽器如何顯示網(wǎng)頁的內(nèi)容。Trident引擎被設(shè)計成一個軟件組件(模塊),可以供第三方程序員將網(wǎng)頁瀏覽功能加入到他們自行開發(fā)的應(yīng)用程序里。
第四層WinInet.dll提供了網(wǎng)絡(luò)協(xié)議處理接口,實現(xiàn)了HTTP協(xié)議與FTP協(xié)議以及緩存功能。
圖1 瀏覽器架構(gòu)
表1 IE模塊結(jié)構(gòu)
WebBrowser組件是Shdocvw.dll的核心組件。第三方程序員可以使用C++、Visual Basic、C#等多種語言對WebBrowser組件進(jìn)行二次開發(fā)。WebBrowser組件的重要事件如表2所示。
表2 WebBrowser組件的重要事件
當(dāng)Web頁面加載完畢時,WebBrowser組件會激發(fā)DocumentComplete事件,此時調(diào)用自動化操作對象,完成對當(dāng)前頁面的自動化操作。但是,如果頁面包含有多個子框架(Frame),那么每個子框架內(nèi)的頁面都會激發(fā)一次DocumentComplete事件,這會造成該事件被重復(fù)激發(fā),且難以判斷什么時候所有頁面加載完畢。此問題可以利用文獻(xiàn)[4]提供的方法予以解決。
Web自動化操作軟件有多種實現(xiàn)方案,其中一種方案是在用戶接口層(見圖1)。這種方案直接控制瀏覽器進(jìn)行操作,運行方式類似于瀏覽器的外掛程序。該方案通常采用BHO(Browser Helper Object)技術(shù)實現(xiàn)[5]。BHO是微軟推出的瀏覽器開放接口標(biāo)準(zhǔn)。通過這個接口,可以編寫代碼獲取瀏覽器的行為。這種方案的缺點是依賴于瀏覽器主窗口,可擴(kuò)展性差,難以實現(xiàn)定時、多任務(wù)等高級功能。另一種方案是:通過直接操縱HTTP數(shù)據(jù)包,進(jìn)行自動化操作。該方案的優(yōu)點是收發(fā)數(shù)據(jù)量少、操作速度快。但是缺點也非常突出,需要解析HTML數(shù)據(jù),解析執(zhí)行JavaScript腳本等。另外,對基于HTTPS協(xié)議的Web站點,還需要利用SSL協(xié)議對數(shù)據(jù)進(jìn)行解析,工作量相當(dāng)大。最終,本文選擇基于WebBrowser組件的開發(fā)方案,該方案具有良好的可擴(kuò)展性、可移植性,能夠向操作者實時反映執(zhí)行的結(jié)果,在執(zhí)行失敗時能夠即時轉(zhuǎn)由人工操作,保障任務(wù)順利完成。
本文設(shè)計的AutoBrowser軟件系統(tǒng)遵循分層思想,采取MVC框架模型進(jìn)行構(gòu)建[6],由CTaskData、CTaskPage、CMyBrowser三個基礎(chǔ)類模塊及其他輔助類模塊組成,其整個結(jié)構(gòu)如圖2所示。
CTaskData控制輸入輸出數(shù)據(jù),包括自定義的腳本;CTaskPage負(fù)責(zé)在當(dāng)前頁面上執(zhí)行腳本;CMy-Browser是WebBrowser組件的封裝類,處理受激發(fā)的事件;CTaskManager是任務(wù)管理模塊,管理用戶所有正在運行和未運行的任務(wù);CTaskAuto是核心控制模塊,是系統(tǒng)的中樞,負(fù)責(zé)AutoBrowser組件中所有事務(wù)的調(diào)度處理,比如將用戶自定義腳本輸送到CTask-Page進(jìn)行執(zhí)行,再將結(jié)果輸送到CMyBrowser的圖形接口層進(jìn)行顯示等。如果有文件資源需要下載或上傳,則由CHttpSession開辟新的HTTP會話負(fù)責(zé)完成。
圖2 AutoBrowser的MVC框架
MSHTML是WebBrowser組件中的一個COM組件[7],該組件封裝了HTML語言中的所有元素及其屬性,通過其提供的標(biāo)準(zhǔn)接口,可以訪問指定網(wǎng)頁的所有元素。MSHTML提供了豐富的HTML文檔接口,有 IHTMLDocument、IHTMLDocument2、…、IHTMLDocument7 等 7 種。其中,IHTMLDocument只有一個Script屬性,負(fù)責(zé)管理頁面腳本。通過IHTMLDocument2接口可以得到網(wǎng)頁元素的記錄集合IHTMLElementCollection。通過IHTMLElement接口可以獲得記錄集合中的網(wǎng)頁元素,包括節(jié)點元素的類型與屬性,并完成具體操作。對節(jié)點元素的用戶操作最常見的有鼠標(biāo)單擊操作及鍵盤的文本輸入操作,它們分別對應(yīng)節(jié)點元素的Click事件與put_innerText事件。
在對節(jié)點元素操作前,需要準(zhǔn)確定位到待操作的元素。定位元素有多種方法,其中一種方法是通過匹配網(wǎng)頁元素的ID屬性進(jìn)行定位。如果網(wǎng)頁元素未定義ID屬性,可以通過匹配其他屬性定位。然而,在當(dāng)今流行的前端Web頁面的設(shè)計中,常用 Li標(biāo)簽、A標(biāo)簽等接受用戶的鼠標(biāo)單擊操作,并且利用JQuery技術(shù)將具體操作定義在獨立的腳本代碼中,因此這些頁面元素甚至不需要包含任何屬性[8]。在這種情況下,可以通過頁面元素在整個文檔中的索引值進(jìn)行定位。
實現(xiàn)Web自動化操作,需要第三方程序員事先定義操作腳本,啟動操作任務(wù)后,通過手工或定時的方式讓程序自動執(zhí)行操作腳本。為了保持良好的可移植性與可讀性,本文采用XML語言對操作腳本進(jìn)行編碼。腳本的定義需要包含兩個基本要素:一是用于元素準(zhǔn)確定位的屬性描述;二是對該元素具體操作的描述,且在需要文本輸入時包含輸入的內(nèi)容。另外,還需要考慮實現(xiàn)定時運行、驗證碼輸入等使用場景。用戶登錄的示例腳本LoginTest的代碼為:
其中任務(wù)(task)節(jié)點用來描述整個待執(zhí)行的任務(wù),它包含若干操作頁面(page),page節(jié)點對應(yīng)Web特定頁面,它包含了對該頁面具體操作的子結(jié)點。
由于種種原因,正常操作Web頁面時,也可能存在操作失敗的情況。操作失敗時,如果不及時發(fā)現(xiàn)并停止,那么后續(xù)操作將會產(chǎn)生錯誤甚至意想不到的結(jié)果。因此,需要對用戶操作結(jié)果進(jìn)行驗證。通過定義page的屬性in檢測頁面是否正確進(jìn)行了轉(zhuǎn)移,in屬性存放轉(zhuǎn)向的新地址,如果攜帶有參數(shù)則由ivalue存放。在一些Web頁面的實現(xiàn)中,客戶端鏈接地址不會有變化,例如利用ASP.NET的Server.Transfer進(jìn)行頁面跳轉(zhuǎn),這時需要通過<tag type="check"/>進(jìn)行檢驗。
用<page type="index"/>表示通過索引值定位頁面元素,而用<page type="script"/>表示通過JavaScript腳本進(jìn)行操作。如果當(dāng)前頁面支持JQuery,示例腳本LoginTest的page節(jié)點的代碼為:
此腳本是通過調(diào)用IHTMLWindow2接口的execScript函數(shù)執(zhí)行的,最新版本中execScript函數(shù)已被eval函數(shù)取代了,但仍保留原有功能。
本文設(shè)計的AutoBrowser軟件主要用于Web頁面的自動化操作,可以通過執(zhí)行速度與可靠性兩方面評估其運行效果。因為AutoBrowser的執(zhí)行速度受多種因素影響,如運行環(huán)境的硬件配置、Web服務(wù)器響應(yīng)速度、頁面數(shù)據(jù)量、網(wǎng)絡(luò)傳輸速度、網(wǎng)頁腳本執(zhí)行耗時等,因此很難給出具有實際意義的實驗對比數(shù)據(jù)。但從其所處瀏覽器體系結(jié)構(gòu)的層次可知,它更接近于系統(tǒng)底層,比傳統(tǒng)的手工操作速度快,而且能夠?qū)崿F(xiàn)多任務(wù)并發(fā)執(zhí)行。它的可靠性是由操作腳本的校驗機(jī)制保證的,在實際運行中,如果遭遇網(wǎng)絡(luò)中斷等情況時,能夠及時停止后續(xù)操作。但是,導(dǎo)致操作失敗的因素可能是短暫出現(xiàn)的,比如網(wǎng)絡(luò)堵塞等,應(yīng)該引入多次嘗試機(jī)制,甚至根據(jù)不同的情況,執(zhí)行不同的腳本命令等,這些將是下一步研究的內(nèi)容。
[1] 王瑛,梁楚樵.嵌入式環(huán)境下的瀏覽器定制技術(shù)的實現(xiàn)[J].武漢理工大學(xué)學(xué)報,2006,28(3):110-111.
[2] 李文印,周治國,周斌,等.專用瀏覽器/服務(wù)器系統(tǒng)模型的設(shè)計與實現(xiàn)[J].計算機(jī)應(yīng)用,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的網(wǎng)站過濾系統(tǒng)研究與實現(xiàn)[J].計算機(jī)工程與應(yīng)用,2009,45(31):18-19.
[6] 劉克.MVC架構(gòu)及其在Web應(yīng)用開發(fā)中的應(yīng)用[J].計算機(jī)應(yīng)用與軟件,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 高級程序設(shè)計[M].北京:人民郵電出版社,2014.