Internet Explorer驱动程序内部机制
有关IE驱动程序的更详细信息。
此文档之前位于维基上
InternetExplorerDriver
是一个独立的服务器,它实现了 WebDriver 的线路协议。 此驱动程序已在 Windows 10 上的 IE 11 上进行了测试。它可能适用于旧版本的 IE 和 Windows,但不支持此功能。
该驱动程序支持运行 32 位和 64 位版本的浏览器。 如何确定启动浏览器时使用哪种“位”取决于启动哪个版本的 IEDriverServer.exe。 如果启动 32 位版本的 IEDriverServer.exe
,则将启动 32 位版本的 IE。 类似地,如果启动 64 位版本的 IEDriverServer.exe,则将启动 64 位版本的 IE。
在使用 InternetExplorerDriver
之前,您无需运行安装程序,但需要进行一些配置。 必须从下载页面下载独立的服务器可执行文件,并将其放置在您的 PATH 中。
作为独立的服务器可执行文件,IE 驱动程序的行为可以通过各种命令行参数进行修改。要设置这些命令行参数的值,您应该查阅您正在使用的语言绑定的文档。下表描述了支持的命令行开关。所有 -<开关>
、–<开关>
和 /<开关>
均受支持。
开关 | 含义 |
---|---|
–port=<端口号> | 指定 IE 驱动程序的 HTTP 服务器将监听来自语言绑定的命令的端口。默认为 5555。 |
–host=<主机适配器IP地址> | 指定 IE 驱动程序的 HTTP 服务器将监听来自语言绑定的命令的主机适配器的 IP 地址。默认为 127.0.0.1。 |
–log-level=<日志级别> | 指定输出日志消息的级别。有效值为 FATAL、ERROR、WARN、INFO、DEBUG 和 TRACE。默认为 FATAL。 |
–log-file=<日志文件> | 指定日志文件的完整路径和文件名。默认为 stdout。 |
–extract-path=<路径> | 指定用于提取服务器使用的支持文件的目录的完整路径。如果未指定,则默认为 TEMP 目录。 |
–silent | 启动服务器时禁止显示诊断输出。 |
以下系统属性(在 Java 代码中使用 System.getProperty()
读取并使用 System.setProperty()
设置,或使用 “-DpropertyName=value
” 命令行标志)由 InternetExplorerDriver
使用
属性 | 含义 |
---|---|
webdriver.ie.driver | IE 驱动程序二进制文件的位置。 |
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 中。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。由于 InternetExplorerDriver
仅适用于 Windows,它尝试使用所谓的“本机”或操作系统级事件在浏览器中执行鼠标和键盘操作。这与使用模拟 JavaScript 事件进行相同操作形成对比。使用本机事件的优点在于它不依赖于 JavaScript 沙箱,并且确保浏览器内正确的 JavaScript 事件传播。但是,当 IE 浏览器窗口未获得焦点时,以及尝试悬停在元素上时,鼠标事件目前存在一些问题。
挑战在于,如果窗口未获得焦点,则 IE 本身似乎没有完全遵循我们发送给 IE 浏览器窗口的 Windows 消息(WM_MOUSEDOWN
和 WM_MOUSEUP
)。具体而言,被单击的元素将接收到其周围的焦点窗口,但是该元素不会处理单击。可以说,我们根本不应该发送消息;相反,我们应该使用 SendInput()
API,但是该 API 明确要求窗口具有焦点。我们使用 WebDriver 项目有两个相互冲突的目标。
首先,我们力求尽可能地模仿用户。这意味着使用本机事件而不是使用 JavaScript 模拟事件。
其次,我们不希望要求自动化的浏览器窗口具有焦点。这意味着强制将浏览器窗口置于前台是不理想的。
另一个考虑因素是,在多个 WebDriver 实例下运行多个 IE 实例的可能性,这意味着任何此类“将窗口置于前台”解决方案都必须在 IE 驱动程序的 C++ 代码中使用某种同步构造(互斥锁?)进行包装。即便如此,如果用户在驱动程序将 IE 置于前台和执行本机事件之间将另一个窗口置于前台,此代码仍然会受到竞争条件的影响。
关于驱动程序的要求以及如何优先考虑这两个冲突目标的讨论仍在进行中。当前普遍的观点是优先考虑前者而不是后者,并记录当使用 IE 驱动程序时,您的机器将不可用于其他任务。但是,该决定远未最终确定,并且实现该决定的代码可能相当复杂。
当您尝试将鼠标悬停在元素上时,如果您的物理鼠标光标位于IE浏览器窗口的边界内,则悬停效果将不起作用。更具体地说,悬停效果会短暂地显示一瞬间,然后元素会恢复到之前的状态。目前普遍认为发生这种情况的原因是,IE在它的事件循环期间进行了某种点击测试,当物理光标在窗口边界内时,它会响应物理鼠标的位置。WebDriver开发团队尚未找到解决IE此行为的方法。
<option>
元素或提交表单和 alert()
在两个地方,IE驱动程序不使用原生事件与元素交互。这指的是点击<select>
元素内的<option>
元素。在正常情况下,IE驱动程序会根据元素的位置和大小(通常由JavaScript的getBoundingClientRect()
方法返回)计算点击位置。但是,对于<option>
元素,getBoundingClientRect()
返回一个位置和大小都为零的矩形。IE驱动程序通过使用click()
自动化原子来处理这种情况,该原子本质上会设置元素的.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(和其他会话项)的问题,有两种解决方案。
第一种是在私有模式下启动您的InternetExplorer。之后,InternetExplorer将使用干净的会话数据启动,并且在退出时不会保存更改的会话数据。为此,您需要向驱动程序传递两个特定的功能: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
一起使用。
IEDriverServer.exe
明确不支持尝试将IEDriverServer.exe用作Windows服务应用程序的一部分。服务进程以及它们产生的进程与在常规用户上下文中执行的进程具有截然不同的要求。IEDriverServer.exe
在该环境中未经明确测试,并且包含记录为禁止在服务进程中使用的Windows API调用。虽然可能可以使IE驱动程序在服务进程下运行时正常工作,但在此环境中遇到问题的用户将需要自行寻找解决方案。
有关IE驱动程序的更详细信息。
了解更多或查看完整的赞助商列表。