IE 驅動程式伺服器

Internet Explorer 驅動程式是一個獨立伺服器,實作 WebDriver 規範。

此文件先前位於 wiki

InternetExplorerDriver 是一個獨立伺服器,實作 WebDriver 的 wire protocol。此驅動程式已在 IE 11 和 Windows 10 上測試過。它可能適用於舊版本的 IE 和 Windows,但不支援這些版本。

此驅動程式支援執行 32 位元和 64 位元版本的瀏覽器。如何決定在啟動瀏覽器時使用哪個「位元」版本的選擇,取決於啟動哪個版本的 IEDriverServer.exe。如果啟動 32 位元版本的 IEDriverServer.exe,則將啟動 32 位元版本的 IE。同樣地,如果啟動 64 位元版本的 IEDriverServer.exe,則將啟動 64 位元版本的 IE。

安裝

使用 InternetExplorerDriver 前,您不需要執行安裝程式,但需要進行一些設定。必須從下載頁面下載獨立伺服器可執行檔,並將其放置在您的 PATH 中。

優點

  • 在真實瀏覽器中執行並支援 JavaScript

缺點

  • 顯然 InternetExplorerDriver 只能在 Windows 上運作!
  • 相對較慢(但仍然相當靈敏 :)

命令列參數

作為一個獨立的可執行檔,IE 驅動程式的行為可以透過各種命令列引數來修改。若要設定這些命令列引數的值,您應查閱您使用的語言綁定的文件。下表說明了支援的命令列參數。所有 -<參數>、 –<參數> 和 /<參數> 均受支援。

參數意義
–port=<portNumber>指定 IE 驅動程式的 HTTP 伺服器將監聽來自語言綁定的命令的埠。預設為 5555。
–host=<hostAdapterIPAddress>指定 IE 驅動程式的 HTTP 伺服器將監聽的主機介面卡的 IP 位址。預設為 127.0.0.1。
–log-level=<logLevel>指定記錄訊息輸出的層級。有效值為 FATAL、ERROR、WARN、INFO、DEBUG 和 TRACE。預設為 FATAL。
–log-file=<logFile>指定記錄檔的完整路徑和檔名。預設為 stdout。
–extract-path=<path>指定用於解壓縮伺服器使用的支援檔案的目錄完整路徑。如果未指定,則預設為 TEMP 目錄。
–silent啟動伺服器時,抑制診斷輸出。

重要系統屬性

InternetExplorerDriver 使用下列系統屬性(在 Java 程式碼中使用 System.getProperty() 讀取,並使用 System.setProperty() 或 “-DpropertyName=value” 命令列旗標設定)

屬性意義
webdriver.ie.driverIE 驅動程式二進位檔的位置。
webdriver.ie.driver.host指定 IE 驅動程式將監聽的主機介面卡的 IP 位址。
webdriver.ie.driver.loglevel指定記錄訊息輸出的層級。有效值為 FATAL、ERROR、WARN、INFO、DEBUG 和 TRACE。預設為 FATAL。
webdriver.ie.driver.logfile指定記錄檔的完整路徑和檔名。
webdriver.ie.driver.silent啟動 IE 驅動程式時,抑制診斷輸出。
webdriver.ie.driver.extractpath指定用於解壓縮伺服器使用的支援檔案的目錄完整路徑。如果未指定,則預設為 TEMP 目錄。

必要設定

  • IEDriverServer 可執行檔必須下載並放置在您的 PATH 中。
  • 在 Windows Vista、Windows 7 或 Windows 10 上的 IE 7 或更高版本中,您必須將每個區域的「保護模式」設定設為相同的值。值可以開啟或關閉,只要每個區域都相同即可。若要設定「保護模式」設定,請從「工具」選單中選擇「網際網路選項...」,然後按一下「安全性」標籤。對於每個區域,標籤底部都會有一個核取方塊,標示為「啟用保護模式」。
  • 此外,對於 IE 10 及更高版本,必須停用「增強保護模式」。此選項位於「網際網路選項」對話方塊的「進階」標籤中。
  • 瀏覽器縮放層級必須設定為 100%,以便將原生滑鼠事件設定為正確的座標。
  • 對於 Windows 10,您還需要在顯示設定中將「變更文字、應用程式和其他項目的大小」設定為 100%。
  • 僅對於 IE 11,您需要在目標電腦上設定登錄檔項目,以便驅動程式可以維持與其建立的 Internet Explorer 實例的連線。對於 32 位元 Windows 安裝,您必須在登錄編輯程式中檢查的金鑰是 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BFCACHE。對於 64 位元 Windows 安裝,金鑰是 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BFCACHE。請注意,FEATURE_BFCACHE 子金鑰可能存在也可能不存在,如果不存在,則應建立它。重要:在此金鑰內,建立一個名為 iexplore.exe 的 DWORD 值,值為 0。

原生事件和 Internet Explorer

由於 InternetExplorerDriver 僅適用於 Windows,因此它嘗試使用所謂的「原生」或作業系統層級事件,在瀏覽器中執行滑鼠和鍵盤操作。這與對相同操作使用模擬的 JavaScript 事件形成對比。使用原生事件的優點是它不依賴 JavaScript 沙箱,並且確保瀏覽器內 JavaScript 事件的正確傳播。但是,目前在 IE 瀏覽器視窗沒有焦點時,以及嘗試將滑鼠懸停在元素上時,滑鼠事件存在一些問題。

瀏覽器焦點

挑戰在於,如果視窗沒有焦點,IE 本身似乎並未完全尊重我們傳送給 IE 瀏覽器視窗的 Windows 訊息(WM\_MOUSEDOWNWM\_MOUSEUP)。具體而言,正在點擊的元素將在其周圍收到一個焦點視窗,但元素將不會處理點擊。可以說,我們根本不應該傳送訊息;相反地,我們應該使用 SendInput() API,但該 API 明確要求視窗具有焦點。我們在 WebDriver 專案中有兩個衝突的目標。

首先,我們努力盡可能接近地模擬使用者。這表示使用原生事件而不是使用 JavaScript 模擬事件。

其次,我們希望不要求自動化的瀏覽器視窗具有焦點。這表示僅強制瀏覽器視窗進入前景並非最佳解決方案。

另一個考量是可能有多個 IE 實例在多個 WebDriver 實例下執行,這表示任何此類「將視窗帶到前景」的解決方案都必須封裝在 IE 驅動程式 C++ 程式碼中的某種同步結構(互斥鎖?)中。即便如此,如果使用者在驅動程式將 IE 帶到前景和執行原生事件之間將另一個視窗帶到前景,此程式碼仍然會受到競爭條件的影響。

圍繞驅動程式需求以及如何優先考慮這兩個衝突目標的討論正在進行中。目前普遍的看法是優先考慮前者而非後者,並記錄在使用 IE 驅動程式時,您的機器將無法用於其他任務。但是,該決定遠未最終確定,並且實作它的程式碼可能相當複雜。

滑鼠懸停在元素上

當您嘗試將滑鼠懸停在元素上,並且您的實體滑鼠游標位於 IE 瀏覽器視窗的邊界內時,懸停將不起作用。更具體地說,懸停似乎會運作一小部分時間,然後元素將恢復到其先前的狀態。造成這種情況的普遍理論是,IE 在其事件迴圈期間正在進行某種點擊測試,這導致它在實體游標位於視窗邊界內時回應實體滑鼠位置。WebDriver 開發團隊一直無法找到針對 IE 此行為的解決方案。

點擊 <option> 元素或提交表單和 alert()

在兩個地方,IE 驅動程式不使用原生事件與元素互動。這是在點擊 <select> 元素內的 <option> 元素時。在正常情況下,IE 驅動程式會根據元素的位置和大小計算點擊位置,通常由 JavaScript getBoundingClientRect() 方法傳回。但是,對於 <option> 元素,getBoundingClientRect() 會傳回一個位置和大小均為零的矩形。IE 驅動程式透過使用 click() Automation Atom 來處理這種情況,這基本上會設定元素的 .selected 屬性並模擬 JavaScript 中的 onChange 事件。但是,這表示如果 <select> 元素的 onChange 事件包含呼叫 alert()confirm()prompt() 的 JavaScript 程式碼,則呼叫 WebElement 的 click() 方法將會掛起,直到手動關閉模式對話方塊為止。僅使用 WebDriver 程式碼,沒有已知的針對此行為的解決方案。

同樣地,在某些情況下,透過 WebElement 的 submit() 方法提交 HTML 表單可能會產生相同的效果。如果驅動程式在表單上呼叫 JavaScript submit() 函式,並且有一個 onSubmit 事件處理常式呼叫 JavaScript alert()confirm()prompt() 函式,則可能會發生這種情況。

此限制已作為問題 3508(在 Google Code 上)提交。

InternetExplorerDriver 的多個實例

隨著 IEDriverServer.exe 的建立,應該可以建立和使用多個 InternetExplorerDriver 的同時實例。但是,此功能在很大程度上尚未經過測試,並且可能存在 Cookie、視窗焦點等問題。如果您嘗試使用多個 IE 驅動程式實例,並且遇到此類問題,請考慮使用 RemoteWebDriver 和虛擬機器。

對於在多個 InternetExplorer 實例之間共用 Cookie(和其他會話項目)的問題,有 2 個解決方案。

第一個是在私密模式下啟動 InternetExplorer。之後,InternetExplorer 將以乾淨的會話資料啟動,並且在退出時不會儲存已變更的會話資料。若要執行此操作,您需要將 2 個特定功能傳遞給驅動程式:ie.forceCreateProcessApi 的值為 true,而 ie.browserCommandLineSwitches 的值為 -private。請注意,它僅適用於 InternetExplorer 8 和更新版本,並且 Windows 登錄檔 HKLM_CURRENT_USER\\Software\\Microsoft\\Internet Explorer\\Main 路徑應包含值為 0 的金鑰 TabProcGrowth

第二個是在 InternetExplorer 啟動期間清除會話。為此,您需要將特定的 ie.ensureCleanSession 功能傳遞給驅動程式,值為 true。這會清除所有正在執行的 InternetExplorer 實例的快取,包括手動啟動的實例。

遠端執行 IEDriverServer.exe

由 IEDriverServer.exe 啟動的 HTTP 伺服器設定一個存取控制清單,僅接受來自本機的連線,並拒絕來自遠端機器的連入連線。目前,如果不修改 IEDriverServer.exe 的原始程式碼,則無法變更此設定。若要在遠端機器上執行 Internet Explorer 驅動程式,請結合 Java 獨立遠端伺服器和您的語言綁定的 RemoteWebDriver 等效項。

在 Windows 服務下執行 IEDriverServer.exe

明確不支援嘗試將 IEDriverServer.exe 用作 Windows 服務應用程式的一部分。服務程序及其衍生的程序,與在一般使用者環境中執行的程序相比,具有非常不同的需求。IEDriverServer.exe 在該環境中未經過明確測試,並且包含記錄在案禁止在服務程序中使用的 Windows API 呼叫。雖然在服務程序下執行時,IE 驅動程式有可能運作,但在該環境中遇到問題的使用者將需要尋找自己的解決方案。


Internet Explorer 驅動程式內部

關於 IE 驅動程式的更詳細資訊。