Developer Channel 中的 WebDriver API
WebDriver 提供了一个用于在浏览器中自动测试用户方案的 API。本文档详细介绍了将 WebDriver 与 Internet Explorer Developer Channel 结合使用 。
什么是 WebDriver?
WebDriver 使开发人员能够创建自动测试,该测试可模拟与网页进行交互的用户并报告结果。这与 JavaScript 单元测试不同,因为 WebDriver 有权访问在浏览器中运行的 JavaScript 无法访问的功能和信息,并且它可以更准确地模拟用户事件或操作系统级别的事件。
它还可以在一个测试会话中管理跨多个窗口、选项卡和网页的测试。
在 Internet Explorer Developer Channel 中安装 WebDriver
首先,下载并安装 Internet Explorer Developer Channel。
已为运行 Internet Explorer 11 的 Windows 8.1 和 Windows 7 SP1 客户提供下载。
我通过 Internet Explorer Developer Channel 安装了 WebDriver?
是的,但它未被激活。激活 WebDriver 后,知道如何访问它的任何程序都可以控制你的浏览器。 若要确保没有人因其浏览器被控制而感到意外,需要手动激活当前版本的 WebDriver。为此,请按照以下步骤操作:
使用管理员特权打开“命令提示符”。执行此操作的最简单方法是:按 WINDOWS 徽标键 + X 获取“快速链接”****菜单,然后按 A 以选择“命令提示符(管理员)”选项。
“用户帐户控制”提示将要求你确认你想要允许“命令提示符”****对计算机做出更改。同意它,然后“命令提示符”窗口将打开。
导航到 Internet Explorer Developer Channel 安装程序放置 WebDriver 库的位置:
cd C:\Program Files\Common Files\IEDCWebDriver
注册 IEDCWebDriver.dll 文件:
regsvr32 IEDCWebDriver.dll
打开 Internet Explorer Developer Channel。从“工具”****菜单中打开“Internet 选项”,选择“安全”****选项卡,然后在选项卡底部附近勾选“启用保护模式”旁边的复选框。为“Internet”****和“本地 Intranet”区域执行此操作。应用新设置。
如何在 Internet Explorer Developer Channel 中禁用 WebDriver?
请按照上述说明操作,但请“清除”“启用保护模式”****旁边的框并使用以下命令注销库:
regsvr32 /u IEDCWebDriver.dll
使用 Internet Explorer Developer Channel 运行 WebDriver 应用
如果你想要运行面向 WebDriver 的已编译的应用,你需要在运行时提供具有特殊 GUID 的“appvve”标志,以确保它正确指向 Internet Explorer Developer Channel。
存在用于 32 位和 64 位版本的 Internet Explorer Developer Channel 的单独 GUID。
- 32 位 GUID:9BD02EED-6C11-4FF0-8A3E-0B4733EE86A1_681E2361-2C6F-4D47-A8B7-D3F7B288CB45
- 64 位 GUID:9BD02EED-6C11-4FF0-8A3E-0B4733EE86A1_6A0357B5-AB99-4856-8A59-CF2C38579E78
例如,如果你的应用命名为了 WDApp.exe
,并且你运行的是 32 位的 Internet Explorer Developer Channel,则应使用以下命令从命令行运行它:
WDApp.exe /appvve 9BD02EED-6C11-4FF0-8A3E-0B4733EE86A1_681E2361-2C6F-4D47-A8B7-D3F7B288CB45
。
使此操作自动执行的一种方法是:在文件管理器中右键单击你的应用、选择“创建快捷方式”****、右键单击生成的快捷方式项,然后选择“属性”。选择“属性”****窗口中的“快捷方式”选项卡。
在“目标”****字段中,你将看到指向你的应用的路径(括在引号中)。在引号中追加 /appvve 标志和 GUID 并应用该更改。每次使用快捷方式都会运行你的已追加标志的应用。
要点
上述 GUID 适用于第一版的 Internet Explorer Developer Channel。GUID 将随每个版本而更改,因此如果你要使用较新版本测试针对此版本编写的应用,请在该版本的文档中查找正确的 GUID。
要点
标志和 GUID 内置于 WebDriver C# 示例项目的设置中。当在 Visual Studio 中启动调试会话时,Visual Studio 会将它们作为运行时标志自动应用,但它并未内置于编译的应用中。
要点
你不但将需要对要运行 WebDriver 应用程序的平台使用适当的 GUID,还将需要针对该平台编译你的应用程序。运行 Windows 8.1 的大多数人运行的是 64 位体系结构,因此我们下面讨论的 WebDriver C# 示例项目 为 64 位配置。若要将其更改为 32 位,请打开 Visual Studio 的“版本”菜单、选择“配置管理器”****,然后在“平台”下拉菜单下选择“x86”。
使用 WebDriver
警告 这将需要一些编程知识,并且我们此次仅会提供针对 C# 和 Visual Studio 的说明。如果不具有 Visual Studio,则可以使用免费的 Microsoft Visual Studio Express 2013 for Windows Desktop 来对示例项目进行试验并构建一些测试。
Internet Explorer Developer Channel 中的 WebDriver 实现需要构建 COM 对象,以封装命令和释放结果。命令和响应都采用 JSON 格式。
先下载 WebDriver C# 示例项目。这将为你提供 COM 对象以及通过 WebDriver 接口与浏览器进行通信的示例实现。
使用 Visual Studio 打开 IEWebDriverExample.sln 文件,然后打开 IEWebDriverSample.cs 代码文件。
若要运行演示,请从“调试”菜单选择“开始执行(不调试)”****(Ctrl + F5)。将发生两个重要事项。控制台窗口将打开,以显示之前发送的命令和接收的响应。然后将打开 Internet Explorer 窗口以执行这些命令。
你还可以选择“开始调试”(F5),但如果一切顺利,则控制台窗口会在你可以查看这些命令和响应之前消失。不过,如果某个错误阻止脚本完成,它就会保留。
建立会话
任何 WebDriver 命令序列都应该先使用 newSession 命令建立会话。这将打开一个浏览器窗口并建立一个接口,同时返回一个会话句柄,以便你可以将更多命令指向该会话。让我们来看一看可执行此操作的代码:
//Execute a "newSession" command
const string newSessionCommand = @"
{
""command"": {
""name"": ""newSession"",
""parameters"": {
""desiredCapabilities"": {},
""requiredCapabilities"": {}
},
""sessionId"": null
}
}";
strResponse = ExecuteCommand(newSessionCommand, null);
除了额外的引号(C# 中定义多行字符串文本的函数)之外,此 JSON 格式应看起来非常熟悉。
每个命令都会先创建一个包含 command 对象的 JavaScript 对象文本。在 command 对象中,提供命令的 name 以作为字符串执行、提供 parameters 以作为对象执行、提供 sessionId 以作为字符串执行。在此情况下,因为未设置 sessionId,所以其值为空。将在响应中返回 sessionId,看上去如下所示:
{
"response":{
"sessionId":"[session identifier]",
"status":"success",
"value":{
"browserName":"Internet Explorer",
"browserVersion":"11",
"platformName":"windows",
"platformVersion":"8.1",
"secureSsl":true,
"takesElementScreenshot":true,
"takesScreenshot":true,
"-ms-requireWindowFocus":true
}
}
}
value 对象显示某些浏览器属性和某些功能,如系统是否可以获取屏幕截图或处理 SSL。在针对 Internet Explorer 的 WebDriver 开发的此阶段,可以使用 newSession 命令设置的唯一功能是 -ms-requireWindowFocus
。如果设置为 true,则每次执行命令时,它都将使会话的浏览器窗口成为你的桌面焦点。如果设置为 false,则它会使所有命令与浏览器一起在后台运行。
将命令发送到浏览器
示例项目从响应中提取 sessionId,这可用于所有后续命令,它们包括:
- 加载 Bing.com。
- 查找其搜索词输入。
- 通过键入字词,后跟 Enter 按键,来运行搜索。
用于在浏览器中加载新的 URL 的命令是 get。
const string getCommand = @"
{
""command"": {
""name"": ""get"",
""parameters"": {
""url"": ""https://bing.com""
},
""sessionId"": ""{sessionId}""
}
}";
它具有一个参数,即 URL。编写代码时,没有在 WebDriver 内构建用于暂停以等待页面加载的代码,因此示例脚本将使用 executeScript 命令在 20 秒内每秒轮询一次页面,以查看是否已在继续之前加载页面(请参阅示例的 WaitForPageToLoad() 方法)。
然后,该脚本将在必应的输入字段中查找搜索词。
const string findElementCommand = @"
{
""command"": {
""name"": ""findElement"",
""parameters"": {
""locator"": ""css selector"",
""value"": ""input[name=q]""
},
""sessionId"": ""{sessionId}""
}
}";
findElement 命令将返回第一个与参数和唯一 ID 相匹配的元素,你可以通过它们将该元素用于以后的命令。如果你希望包含所有元素的数组与参数相匹配,请使用 findElements。
findElement 和 findElements 参数是 locator(定义匹配类型)和 value(定义应匹配内容)。在此情况下,它使用 CSS 选择器来匹配其 name 为“q”的 input 元素。
当前可用的其他定位器类型包括:
- id - 元素的 id 属性的完全匹配。
- 链接文本 - 完全匹配 value 参数中的文本的任意链接。
- 部分链接文本 - 包含文本 value 参数的任意链接。
示例脚本会发送的最后一个命令是 sendKeys。
const string sendKeysCommand = @"
{
""command"": {
""name"": ""sendKeys"",
""parameters"": {
""id"": ""{elementId}"",
""keysToSend"": [""W"", ""e"", ""b"", ""D"", ""r"", ""i"", ""v"", ""e"", ""r"", ""\uE007""]
},
""sessionId"": ""{sessionId}""
}
}";
在此命令中,id 参数是在对 findElement 命令的响应中返回的值。keysToSend 参数包含一个包括十个按键的数组:“WebDriver”加上 Enter 键的字符类型代码。
如果一切正常,则由 newSession 命令打开的浏览器窗口现在将显示“WebDriver”在 Bing.com 的搜索结果。
该示例在此时退出,但是两个合乎逻辑的后续步骤是使用 takeScreenshot 命令获取屏幕截图,然后close会话。
下一步是什么?
既然你已了解如何使用 WebDriver 控制 Internet Explorer Developer Channel,请探索支持的 WebDriver 命令的完整列表。在试用它们后,请转到 Microsoft Connect 并向我们提供一些反馈。欢迎提供错误报告,但如果你特别喜欢某些内容,我们也乐于知道。