IE 驱动服务器

Internet Explorer 驱动程序是一个实现 WebDriver 规范的独立服务器。

此文档之前位于维基

InternetExplorerDriver 是一个独立的服务器,它实现了 WebDriver 的线路协议。 此驱动程序已在 Windows 10 上的 IE 11 上进行了测试。它可能适用于旧版本的 IE 和 Windows,但不支持此功能。

该驱动程序支持运行 32 位和 64 位版本的浏览器。 如何确定启动浏览器时使用哪种“位”取决于启动哪个版本的 IEDriverServer.exe。 如果启动 32 位版本的 IEDriverServer.exe,则将启动 32 位版本的 IE。 类似地,如果启动 64 位版本的 IEDriverServer.exe,则将启动 64 位版本的 IE。

安装

在使用 InternetExplorerDriver 之前,您无需运行安装程序,但需要进行一些配置。 必须从下载页面下载独立的服务器可执行文件,并将其放置在您的 PATH 中。

优点

  • 在真实的浏览器中运行并支持 JavaScript

缺点

  • 显然,InternetExplorerDriver 只能在 Windows 上运行!
  • 相对较慢(但仍然相当快 :)

命令行开关

作为独立的服务器可执行文件,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.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 或更高版本中,您必须将每个区域的保护模式设置设置为相同的值。该值可以为打开或关闭,只要每个区域的值相同即可。要设置保护模式设置,请从“工具”菜单中选择“Internet 选项...”,然后单击“安全”选项卡。对于每个区域,选项卡底部都有一个标记为“启用保护模式”的复选框。
  • 此外,必须禁用 IE 10 及更高版本的“增强保护模式”。此选项位于“Internet 选项”对话框的“高级”选项卡中。
  • 浏览器缩放级别必须设置为 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 模拟事件。

其次,我们不希望要求自动化的浏览器窗口具有焦点。这意味着强制将浏览器窗口置于前台是不理想的。

另一个考虑因素是,在多个 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一起使用。

在 Windows 服务下运行 IEDriverServer.exe

明确不支持尝试将IEDriverServer.exe用作Windows服务应用程序的一部分。服务进程以及它们产生的进程与在常规用户上下文中执行的进程具有截然不同的要求。IEDriverServer.exe在该环境中未经明确测试,并且包含记录为禁止在服务进程中使用的Windows API调用。虽然可能可以使IE驱动程序在服务进程下运行时正常工作,但在此环境中遇到问题的用户将需要自行寻找解决方案。


Internet Explorer驱动程序内部机制

有关IE驱动程序的更详细信息。