Internet Explorer 驅動程式內部構造
用戶端程式碼進入驅動程式
我們使用 W3C WebDriver 協定與 HTTP 伺服器的本地實例進行通訊。這大大簡化了特定語言程式碼的實作,並最大限度地減少了必須使用原生程式碼互通技術(如 JNA、ctypes、pinvoke 或 DL)呼叫的 C++ DLL 的進入點數量。
記憶體管理
IE 驅動程式利用 Active Template Library (ATL) 來利用其智慧型指標對 COM 物件的實作。這使得 COM 物件的參考計數和清理變得更加容易。
為何我們需要變更保護模式設定?
Windows Vista 上的 IE 7 引入了保護模式的概念,這允許在瀏覽時對底層 Windows 作業系統提供一定程度的保護。問題是,當您透過 COM 操作 IE 的實例,並且導航到會導致進入或退出保護模式的頁面時,IE 需要建立另一個瀏覽器會話。這將孤立先前會話的 COM 物件,使您無法再控制它。
在 IE 7 中,這通常會表現為一個新的頂層瀏覽器視窗;在 IE 8 中,將會建立一個新的 IExplore.exe 處理程序,但它通常(並非總是!)會無縫地將其附加到現有的 IE 頂層框架視窗。任何外部驅動 IE 的瀏覽器自動化框架(而不是使用 WebBrowser 控制項)都會遇到這些問題。
為了解決這個問題,我們規定要與 IE 協同工作,所有區域都必須具有相同的保護模式設定。只要所有區域都開啟或所有區域都關閉,我們就可以防止過渡到不同的保護模式區域,從而使我們的瀏覽器物件失效。如果使用者將所有區域的保護模式設定為「開啟」,這也允許使用者繼續在啟用 UAC 的情況下執行,並在瀏覽器中安全地執行。
在 IE 驅動程式的早期版本中,如果使用者的保護模式設定不正確,我們會啟動 IE,並且處理程序會簡單地掛起,直到 HTTP 請求逾時。這是次佳的,因為它沒有指示需要設定什麼。為了謹慎起見,我們不會修改使用者的保護模式設定。但是,目前版本會檢查保護模式設定是否已正確設定,如果未正確設定,則會傳回錯誤回應。
鍵盤和滑鼠輸入
主要檔案:interactions.cpp
我們有兩種方法可以模擬鍵盤和滑鼠輸入。第一種方法(在 webdriver 的某些部分中使用)是在 DOM 上合成事件。這有許多缺點,因為每個瀏覽器(和瀏覽器的版本)都有其獨特的怪癖;對這些怪癖進行建模是一項要求很高的任務,而且不可能完全正確(例如,很難判斷 window.selection
應該是什麼,而且在某些瀏覽器上,這是一個唯讀屬性)。另一種方法是在作業系統層級合成鍵盤和滑鼠輸入,理想情況下,不會從使用者那裡竊取焦點(長時間執行的 webdriver 測試執行時,使用者傾向於在他們的電腦上做其他事情)
用於執行此操作的程式碼位於 interactions.cpp。這裡需要注意的關鍵是,我們使用 PostMessages 將視窗事件推送到 IE 實例的訊息佇列中。特別是輸入很有趣:我們只傳送「keydown」和「keyup」訊息。「keypress」事件是在必要時由 IE 的內部事件處理建立的。由於並非總是產生按鍵事件(例如,並非每個字元都是可列印的,並且如果預設事件冒泡被取消,則監聽器看不到按鍵事件),我們在按下按鍵後傳送一個「探測」事件。一旦我們看到這已被處理,我們就知道按鍵事件在要處理的事件堆疊上,並且可以安全地傳送鬆開按鍵事件。如果沒有這樣做,則事件可能會以錯誤的順序觸發,這絕對是次佳的。
在 InternetExplorerDriver 上工作
目前,有針對所有語言(Java、C#、Python 和 Ruby)的 InternetExplorerDriver 執行的測試,因此無論您從用戶端方面習慣使用哪種語言,您都應該能夠測試對原生程式碼的變更。為了處理 C++ 程式碼,您需要 Visual Studio 2010 Professional 或更高版本。不幸的是,驅動程式的 C++ 程式碼使用 ATL 來減輕使用 COM 物件的痛苦,而 ATL 並未隨 Visual C++ 2010 Express Edition 提供。如果您使用的是 Eclipse,則進行和測試修改的流程是
- 在 VS 中編輯 C++ 程式碼。
- 建置程式碼以確保其可以編譯
- 當您準備好執行測試時,請執行完整重建。這將導致建立的 DLL 複製到正確的位置,以允許在 Eclipse 中使用它
- 載入 Eclipse(或一些其他 IDE,例如 Idea)
- 編輯
SingleTestSuite
,使其為usingDriver(IE)
- 建立使用「webdriver-internet-explorer」專案的 JUnit 執行配置。如果您不這樣做,測試將完全無法運作,並且主控台上會出現一些難以理解的錯誤訊息。
一旦完成基本設定,您就可以非常快速地開始處理程式碼。您可以使用 Visual Studio 從偵錯選單中選取「附加至處理程序...」來附加到您從中執行程式碼的處理程序。