第 3 章 浏览器自动化测试

第 3 章 浏览器自动化测试

区别使用各种 Selenium WebDriver

冲田邦夫 OKITA Kunio

DeNA 股份有限公司

mail okitakunio@gmail.com

GitHub okitan

Twitter @okitan

译 / 刘卓

在 Web 应用程序的自动化测试中,一般会使用 Selenium。在本章中,我们将结合智能手机 Web 应用程序的自动化测试领域,深入地挖掘 Selenium。

Selenium 简介

Selenium 1 是一个浏览器操作的自动化工具,现在最新发布的版本为 2011 年发布的 Selenium WebDriver(Selenium 2)。它是由身为 Selenium 1 的 Selenium RC 和用来操作浏览器的 RESTful 风格 Web API——WebDriver 组合而成的。在本章中如果没有特别的说明,Selenium 一词指的就是 Selenium WebDriver 的意思。

1http://seleniumhq.org/

从 WebDriver 继承来的 RESTful 风格 Web API 体系现在被称为 JSON Wire Protocol 2。因为是 Web API 所以实现了客户端 / 服务器模块的松耦合,可以使用各种语言操作各种各样的浏览器。除了 Selenium 的开发者 Selenium HQ 提供了 C#、 Java、Python、Ruby 的官方客户端之外,第三方也发布了各种其他语言的版本。即使今后会出现支持 JSON Wire Protocol 的浏览器,也可以通过在现有的客户端来操作浏览器。

2https://code.google.com/p/selenium/wiki/JsonWireProtocol

本章中的示例代码使用 selenium-webdriver3 的 Ruby 官方客户端来实现。使用的版本为 2.34.0。可以在 Ruby 1.9.3 及之后的版本中运行。

3http://rubygems.org/gems/selenium-webdriver

测试智能手机的 Web 应用程序

本节将为大家介绍智能手机 Web 应用程序测试的现状,以及整理测试策略相关的内容。

智能手机的分裂现状

目前,智能手机的操作系统被 iOS 和 Android 占据了大半的市场。

在 Apple 最近关于 iOS 的调查中显示,有 94% 的终端正在使用 iOS 6,并且该操作系统的更新还在非常平滑地进行着。另外,由于 iOS 是单一生产商的产品,所以它的特点是很少出现过系统变种。

另外一方面,Android 则有 Fragmentation(Android 分裂)的问题,会出现操作系统得不到及时更新的情况。旧版本的 Android 2.3 系列的市场占有率甚至可以与 Android 4.x 系列相匹敌。而且,即使操作系统的版本相同,测试也可能会因 GPU 不同或者生产商的定制或实现不同而受到影响。

在多终端执行测试的必要性和困难

综上所述,针对智能手机的测试需要能够 在多种终端上执行。拿通过智能手机终端访问 Mobage 网站的访问量来说,如果测试范围想要覆盖其中 70% 的终端就要测试大约 30 种设备。凑齐这么多种设备就太困难了,还要在这么多种终端上执行实际测试,那更是难上加难,因此就有企业专门从事这种在多终端上实施的测试。

从提升多终端上测试的效率来看,自动化测试尤为重要。使用自动化测试,可以缩短测试时间、增加能够同时测试的终端数量。另外,如果能够同时并行执行自动化测试,还可以缩短产品发布前的测试时间。

多终端 UI/UX 测试的特殊必要性和困难

与 PC 的浏览器页面相比,智能手机的页面更小,操作时还必须使用触控屏,因此就使用方便性而言,UI/UX(User Experience,用户体验)相关领域特别重要。因为 UI/UX 会受到终端硬件的影响,所以特别需要在各种终端上进行测试。但是,UI/UX 的测试存在着很难自动化的问题。

这里有一个相当简单粗暴的测试策略,那就是姑且将测试集中在多终端的确认上或是 UI/ UX 以外的部分。在这个测试策略中,重视使用能够高效测试系统整体是否正常运行的设备来执行测试。在此基础上,作为自动测试的补充形式,在多终端上实施 UI/UX 测试,提高测试整体的效率。

使用 Selenium 进行自动测试的覆盖范围

使用 Selenium 执行自动测试适用于前面所述的使用能够高效测试的设备进行系统整体功能性的测试。但很可惜,它在 UI/UX 的测试中就不那么给力了,只能尽量地担当起半自动操作的任务。

能够支持多种浏览器是 Selenium 最大的特点,它可以让测试代码在浏览器之间自由切换并保持对浏览器的操作统一。从现在起,我们就要针对 Selenium 支持的各种浏览器,讲解其各自的使用方法。

下一节将要讲解使用 iOS 和 Android 真机或模拟器的 Selenium 驱动,下下节将为大家介绍不使用 iOS 和 Android 真机或模拟器的 Selenium 驱动。虽然在一般情况下使用真机或模拟器是正确的选择,但是在性能、环境构建、测试开发以及调试的简易性上也有它的问题。不使用真机或模拟器的 Selenium 驱动,反倒可以实现快速开发自动化测试、CI(Continuous Intergration,持续集成)等快速迭代式开发过程。

使用 Selenium 在真机或模拟器中测试

在本节中,将介绍在真机或模拟器环境下使用的 Selenium 驱动——Android 的 AndroidDriver 4 和 iOS 的 ios-driver 5

4https://code.google.com/p/selenium/wiki/AndroidDriver

5http://ios-driver.github.io/ios-driver/

关于 iOS 的驱 动,虽然官方曾经发布过 iPhoneDriver,但是现在它已经 deprecated(预定废除)了。另外,虽然也有 Android 和 iOS 都支持的程序库 appium 6,但它的主要目的是本机应用的自动化测试,因此不在本次介绍的范围内。

6http://appium.io/

使用 AndroidDriver 进行测试

首先,我们来讲解如何使用 AndroidDriver 进行测试。

使用 AndroidDriver 时,不论是使用模拟器还是真机,都需要在终端上安装 AndroidDriver 的 APK。在安装完 AndroidDriver 的 APK 并启动后,JSON Wire Protocal 的服务器和 WebView 就会启动,这个时候就可以从 Selenium 客户端接收命令,操作 WebView 了。

本文将要介绍在 Mac 上使用 Homevrew 7 构建测试环境的方法。想要执行 Android SDK,Java 是必不可少的,不过还好在 Mac 上已经预 装了。

7http://mxcl.github.io/homebrew/

安装 Android SDK

作为安装 AndroidDriver 的前置工作,我们要准备好 Android 的开发环境。模拟器的启动自不必说,在真机中也需要事先安装 AndroidDriver。

首先利用 Homebrew 安装 Android SDK。在本文执笔时最新的版本为 22.0.5。

$ brew install android-sdk

安装之 后,使用 android 命令启动 Android SDK Manager。

$ android

Android SDK Manager 启动后,需要选择 Android SDK Platform-tools 以利用 adb 命令(可操作通过 USB 连接的真机或模拟器)、选择想要使用的版本(作者的环境是 Android 4.0.3)、 选择可以让模拟器加速的 Intel x86 Emulator Accelerator(HAXM)8,然后执行安装(图 1)9

8默认的模拟器为ARM,其速度非常慢,很有可能使 Selenium 超时。请使用 HAXM。

9安装这些前,可能必须更新 Android SDK Tools。

图 1 Android SDK Manager

Android SDK Manager 仅是单独下载 HAXM 而已,所以要执行下面的命令,在打开的窗口中启动 IntelHAXM_1.0.6.mpkg 10 进行安装。安装时使用默认配置就可以。

10请注意,在命令中要指定使用了哪个版本的 Android SDK。

$ open/usr/local/Cellar/android-sdk/r22.0.5/extrasintel/Hardware_Accelerated_Execution_Manager/IntelHAXM.dmg ( 实际为1 行)

创建和启动 avd

下面,创建并启动用于模拟器的 avd(Android Virtual Device)。这里,我们使用 Android 4.0.3 版本创建名为 hello_android 的 avd。

$ android create avd -n hello_android -t android-15 \ -c 100M -b x86
$ emulator -avd hello_android

在模拟器启动后,如果终端出现提示信息 HAX is not working and emulator runs in emulation mode,就说明 HAXM 安装得不正确,请重新安装。

真机的设置

使用真机的情况下,在 Android 的“设定”中选择“开发者选项”,选中“USB 调试”复选框并与 PC 连接。

确认序列号

为了操作连接好的真机或启动后的模拟器,必须要确认这个设备的序列号。

$ adb devices
List of devices attached
emulator-5554   device

上面的 emulator-5554 就是序列号。在后面 出现的命令中请把 {serial_id} 替换为这里的序列号。

安装并启动 AndroidDriver

可以从Selenium的网站 11 上下载AndroidDriver 的 APK。在本文执笔时最新的版本为 androidserver-2.32.0.apk,但是这个版本的稳定性不佳,所以在本文中使用的是 android-server-2.21.0.apk。

11https://code.google.com/p/selenium/downloads/list

将下载好的 APK 安装到设备中。

$ adb -s {serial_id} install android-erver-2.21.0.apk

启动 APK 可以直接操作设备,也可以执行启动命令。另外,因为 AndroidDriver 的服务器也是运行在设备上的,所以为了访问服务器还需要设置端口映射。

$ adb -s {serial_id} shell am start \
    -a android.intent.action.MAIN \
    -n org.openqa.selenium.android.app/.MainActivity
$ adb -s {serial_id} forward tcp:8080 tcp:8080

经过了上面的操作,AndroidDriver 在真机或模拟器上运行的服务器端就准备好了。

安装 selenium-webdriver

这里我们使用 Ruby gem 的 seleniumwebdriver 作为 AndroidDriver 的客户端。

$ gem install selenium-webdriver

上面的准备工作完成后,就可以开始实际使用 selenium-webdriver 操作 AndroidDriver 了。

使用 AndroidDriver 实现浏览器操作的自动化

我们先来试一下访问 Google。下面的示例代码可以作为 Ruby 运行,也可以使用例如 irb 这样的 REPL(Read-eval-print loop)12 来运行。

12计算输入的内容并显示结果,循环这种操作的交互式编程环境。

require "selenium-webdriver"
driver = ::Selenium::WebDriver.for(:android)
driver.get "http://www.google.com.jp"

执行上面的代码后,AndroidDriver 的 WebView 中会显示出 Google 的页面(如图 2)。

图 2 AndroidDriver

下面试着利用页面元素进行跳转。打开左上角的滑动菜单,跳转到 Google Maps。

driver.find_element(:id, "gbg").click
driver.find_element(:link_text, " 地图").click

然后,模拟智能手机的操作,尝试使用滑动(Flick)操作跳转到地图。虽然 selenium-webdriver 没有关于触摸操作的文档,但是可以通过下面的方法实现该操作。

map = driver.fi nd_element(:id, "page")
driver.touch.fl ick(map, 0, 300, :normal).perform

flick 的参数依次为滑动操作对应的元素、x 方向的偏移量、y 方向的偏移量,最后则是滑动操作的速度(可选项为 :normal 和 :fast)。

像这样,就可以通过 AndroidDriver 进行 WebView 或者智能手机才有的操作。

另外,本章中 selenium-webdriver 的示例代码根据页面显示的时机可能会发生错误,最好是使用 irb 这样的 REPL,边确认页面边执行代码,与此同时尝试各种测试。

使用 AndroidDriver 进行自动测试

前文中展示了如何使用 AndroidDriver 进行浏览器的自动化操作。既然浏览器的操作可以自动化了,接下来再操作浏览器显示目标页面,检查目标页面显示的内容或链接的话,就算实现自动化测试了。这里提到的自动化测试,与在 PC 浏览器上实施的自动化测试完全相同。

在 AndroidDriver 中调试

使用 AndroidDriver 编写测试时的问题在于调试。AndroidDriver 并没有提供检查器(Inspector)或是控制台(Console),因此我们无法像在 PC 浏览器上那样简单地就能够掌握目前 DOM(Document Object Model)的结构是什么样的、有哪些文件读取失败了、JavaScript 哪里执行出错了等信息。当然,你可以获取到当前打开的页面的 HTML 或者通过 LogCat 进行一定程度的调试,但这些的效率都不是很高。

在这种情况下可以使用 weinre1313 这种可以在远端运行的检查器。在本地启动 weinre,执行 weinre 提供的标签工具(Bookmarklet)后,就可以像图 3 这样从浏览器,在类似于 Chrome 开发者工具(Developer Tools)的 UI 界面进行远程调试。

13http://people.apache.org/~pmuellr/weinre/docs/latest/

{%}

图 3 weinre

使用 ios-driver 进行测试

接下来,我们要说明通过 ios-driver 利用 iOS Simulator 上的 Mobile Safari 的方法。

ios-driver 不仅可以利用 WebView,还可以利用 iOS Simulator 的 Mobile Safari 来测试智能手机的 Web 应用程序。为了实现这点,必须具备 iOS 6 或更高版本的 iOS Simulator。不过,使用 ios-driver 操作真机的功能目前还是测试版,因此在本文中不作介绍。

本文的讲解时以 Mac 中安装了 Java(JDK 7)、Xcode 以及 iOS 6.0 Simulator 为前提的。iOS 6.0 Simulator 可以在 Xcode 的菜单 Xcode → Preferences……中安装。

安装和启动 ios-driver

从 ios-driver 的 GitHub Pages 14 下载 ios-server-0.6.3-jar-with-dependencies.jar 15。ios-server 是接收 ios-driver 的 JSON Wire Protocol 的服务器端组件。

14http://ios-driver.github.io/ios-driver/

15请注意:如果使用关键字 ios-driver 搜索的话,最上面显示的是旧的 GitHub Pages,但旧的站点现在已经不再维护了,上面的最新版本只到 ios-server-0.5.0.jar。

ios-driver 会修改 Mobile Safari 的 Info.plist 文件,因此要提前修改文件的访问权限。

$ sudo chmod 666 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator*.sdk/Applications/MobileSafari.app/Info.plist (实际为1 行)

下载并启动 ios-server。使用选项 -port 可以指定 ios-server 监听的端口。这里我们指定 Selenium RemoteDriver 默认使用的端口 4444 启动服务。另外,因为使用的是 iOS Simulator,所以要加上 -simulators 选项。

$ java -jar ios-server-0.6.3-jar-with-dependencies.jar -port 4444 -simulators ( 实际为1 行)

通过 RemoteDriver 使用 ios-driver

ios-driver 并没有像 Android 那样提供专用的驱动。在本文中,我们通过通用的 RemoteDriver 来使用 ios-driver。

刚才我们通过 RemoteDriver 的默认端口启动了 ios-server,设置适当的 capabilities 16 后,就可以操作 ios-driver 了。下面的例子是使用 selenium-webdriver 的示例代码。capabilities 设定为了 iPhone,所以会启动 iPhone 的模拟器。 设定为 iPad 的话就会启动 iPad 模拟器。

16Selenium 的客户端设置。

capabilities = ::Selenium::WebDriver::Remote::\
  Capabilities.iphone(language: "zh-CN", locale: "zh-CN")
driver = ::Selenium::WebDriver.for :remote,
  desired_capabilities: capabilities

ios-driver 通过客户端与 ios-server 建立连接后会自动启动 iOS Simulator。iOS Simulator 启动时会要求输入密码。关于这点在 ios-driver 的 FAQ 17 中有详细记载,必须要编辑 /etc/authorization。

17http://ios-driver.github.io/ios-driver/faq.html

使用 ios-driver 操作 Mobile Safari

模拟器启动后,就可以与其他驱动一样操作浏览器了(如图 4)。例如,先前使用 AndroidDriver 操作 GoogleMaps 的示例代码,就可以直接在 ios-driver 中运行。也就是说,只需准备好各自的驱动后,就可以编写通用的测试代码了。

图 4 ios-driver

不过,ios-driver 尚在开发中(开发并未完成),还有很多不支持的功能,因此常常会出现错误。在使用时请注意它的各种限制。

在 ios-driver 中调试

ios-driver 中包含了默认的检查器。ios-server 启动后,就可以使用这个检查器,也可以通过访问 http://localhost:4444/inspector 来使用它。

这个检查器对于本机应用和混合应用的调试非常有用,但是像现在这样使用 Mobile Safari 的情况下,功能上就不能满足要求了。因此,还是使用在 AndroidDriver 中介绍的 weinre 比较好。

仅使用 Selenium(不使用真机和模拟器)实施测试

前面的一节介绍了使用真机或模拟器测试智能手机 Web 应用的方法,但毕竟上述介绍的技术还在发展中,可靠性欠佳。另外,测试环境的构建和运行环境的限制也都是大问题。因此,在本节中我们将要介绍如何将 PC 浏览器伪装为智能手机浏览器(尽管显示上的严谨性略差)来测试智能手机应用。

使用 ChromeDriver 实施测试

在版本 27 之前 Chrome 使用 WebKit 作为渲染引擎,但从版本 28 开始就采用了从 WebKit 分支出来的 Blink。虽然版本 27 之前的 Chrome,无论是 Android 的默认浏览器还是 iOS 的 Mobile Safari 都是基于 WebKit 的,但渲染引擎也会出现不同的效果。尽管如此,Blink 始终还是 WebKit 的分支版本,因为显示的严谨性并不在本文对测试要求的范围内,所以在这里不构成问题。

本文中的解说是以在 Mac 上安装了 Chrome 29 为前提的。

ChromeDriver 的版本

ChromeDriver 18 是可以操作 Chrome 的 Selenium 的驱动。在本文执笔时 ChromeDriver 的最新版本为 2.3。

18https://code.google.com/p/chromedriver/

2013 年 6 月,ChromeDriver 将 JSON Wire Protocol 服务器与浏览器之间的通信更新成了 WebKit Remote Debugging Protocol 19,升级成了 ChromeDriver2。顾名思义,WebKit Remote Debugging Protocol 是一个远程调试的协议。预计使用该协议操作浏览器,不论是 Android 还是 iOS 的 Chrome 都可以对应。但是,Android 版只发布了内测版(Alpha 版),iOS 版至今为止还没有发布。

19https://code.google.com/p/chromedevtools/wiki/WebKitProtocol

升级为 ChromeDriver2 后只是 ChromeDriver 与 Chrome 之间的通信发生了变化,通过 Selenium 同样可以使用 ChromeDriver,但是 capabilities 中的一些键值发生了改变。因为 selenium-webdriver 的 ChromeDriver 中可设置的 capabilities 正通过改变前的方案(Schema)进行严格的验证,所以现在的 selenium-webdriver-2.34.0 并不能使用 ChromeDriver2 的全部功能。

ChromeDriver2 只能用于 Chrome 27 之后的版本。早期版本的 ChromeDriver 只能用于 Chrome 28(含)之前的版本。

安装 ChromeDriver

可以使用 Homebrew 安装 ChromeDriver。

$ brew install chromedriver

selenium-webdriver 的 ChromeDriver 客户端会自动创建 ChromeDriver 的服务器端,因此只使用 Homebrew 安装就可以了。

使用了 ChromeDriver 的 Selenium 的测试

从 selenium-webdriver 中使用 ChromeDriver 的 Ruby 示例代码如下所示。与其他的驱动一样,浏览器启动后会显示 Google。

require "selenium-webdriver"
user_agent = "Mozilla/5.0 (iPhone; ...)"
driver = ::Selenium::WebDriver.for :chrome,
   args: [ "--user-agent=#{user_agent}" ]
driver.get "http://www.google.co.jp"

args 选项可以设置 Chrome 的启动项。因为 Chrome 可以通过 --user-agent 启动项来设置用户代理。本次设置的是 iPhone 的用户代理值。

ChromeDriver 中启动的 Chrome 和普通的 Chrome 一样,所以可以使用大家惯用的开发者工具或 JavaScript 控制台进行调试。如此一来,在测试中发现问题时,就可以迅速地开始解析问题,这点是伪装成 PC 浏览器实施测试的最大好处。

但是,在智能手机中,touch 事件的使用尤为重要,而 Chrome 在默认情况下并不能执行 touch 事件。对于这个问题,对应方法有两个。

使用 Chrome 的开发者工具模拟 touch 事件

第一个方法是利用 Chrome 的开发者工具。在 Chrome 的开发者工具中有一个 Emulate touch events 选项,选中这个复选框后,就可以通过点击执行 touch 事件了。

这个方法的问题在于目前还没有能通过 ChromeDriver 自动操作来开启开发者工具的方法。也就是说,在最初开始测试的时候,必须要手动设置开发者工具。

使用 Chrome extension 模拟 touch 事件

第二个方法是利用 Chrome 的 extension 功能。在 Chrome 的 extension 中有 mouse2touch20 等通过点击即可执行 touch 事件的插件。

20https://chrome.google.com/webstore/detail/mouse2touch/bmokioijeeafenglkpfnbalmpmocnodo/related?hl=cn,虽然是中文页面,但插件是日语的。

不过在本文执笔时,selenium-webdriver 的 ChromeDriver 客户端并不支持 ChromeDriver2。ChromeDriver2 中用于使用 Chrome extension 的 capability 键值从 chromeOptions.profile 变更成了 chrome.prefs。另外,不止是键值的变化,需要设置的值的格式也发生了变化。selenium-webdriver 的 ChromeDriver 客户端将值设置在了以前的 chromeOptions.profile 中,这样一来,ChromeDriver2 在执行时就会返回错误,因此要想使用 Chrome extension,就不能使用Chrome Driver2。

给 selenium-webdriver 打猴子补丁

因此,我们来使用 selenium-webdriver 中尚未包含的猴子补丁(Monkey Patch)21。将猴子补丁下载到 /path/to/selenium_webdriver_for_chromedriver2.rb

21https://gist.github.com/okitan/6535177

另外,将 mouse2touch 也下载下来(/path/to/mouse2touch.crx)。在这个状态下使用下面的 Ruby 示例代码,可以启动安装了 mouse2touch 的 Chrome。

require "/path/to/selenium_webdriver_for_chromedriver2"
profile = ::Selenium::WebDriver::Chrome::Profile.new
mouse2touch = "/path/to/mouse2touch.crx"
if File.exist?(mouse2touch)
  profile.add_extension(mouse2touch)
end
driver = ::Selenium::WebDriver.for :chrome,
  profile: profile,
  switches: [ "--user-agent=#{user_agent}" ]

如此就可以通过点击来执行 touch 事件了。

ChromeDriver 的展望

如前面所述,在最新的 Chrome 29 中必须使用 ChromeDriver2,但作为客户端程序库的 selenium-webdriver 却没有跟上 ChromeDriver2 的脚步。另外,ChromeDriver2 尚未成熟,稳定性不是很高。

ChromeDriver2 以同时支持 iOS 和 Android 的 Chrome 作为目标。特别是,Chrome 有望成为今后 Android 的默认浏览器。在未来,Android 中的浏览器测试,或是更进一步即所谓的 ChromeOS,都对 ChromeDriver2 寄予了很高的期望。

在 CI 环境的无外设服务器中 执行测试

我想应该有很多组织会在停止开发的夜间利用浏览器执行 CI 测试作为整体的集成测试,并且。在这种情况下,大多数 CI 服务器应该都是放在机房内的、没有进行 GUI 设置的 Linux 服务器。

本节我们将介绍的就是在这种 CI 环境的无外设服务器(Headless Server)中,使用 Xvfb 在虚拟帧缓冲上运行浏览器的方法。Xvfb 是运行在没有显示器等硬件的机器上的 X server。另外,在下一章我们还会介绍连虚拟帧缓冲都不需要的无界面浏览器(Headless Browser) PhantomJS 22

22http://phantomjs.org/

本文将以 CentOS 5.x 为例进行说明,各位读者在阅读时也可以把操作系统替换其他的 Linux 发行套件。

通过 Xvfb 启动 Firefox

Firefox 和 Xvfb 都是 CentOS 软件库中的软件,所以可以通过 yum 安装。而且,其中还有一些不错的中文字体。

$ sudo yum install -y firefox xorg-x11-server-Xvfb \ fonts-chinese

接下来启动 Xvfb。

$ export DISPLAY=:1
$ Xvfb :1 -screen 0 320x480x24

Xvfb 启动后,在其他终端上利用 selenium-webdriver 启动 Firefox。下面是示例代码。

require "selenium-webdriver"
ENV["DISPLAY"] = ":1"
profi le = ::Selenium::WebDriver::Firefox::Profi le.new
user_agent = "Mozilla/5.0 (iPhone; ...)"
profi le["general.useragent.override"] = user_agent
driver = ::Selenium::WebDriver.for :fi refox, profi le: profi le
driver.get "http://www.google.com.jp"
driver.save_screenshot("screenshot.png")

通过在第 2 行设置环境变量,Selenium 启动浏览器时环境变量就会被传递,并在 Xvfb 上启动 Firefox。在最后一行获取屏幕截图,以确认无外设服务器的虚拟帧缓冲上面执行了怎样的动作。对于这点,屏幕截图非常重要。

Ruby 中也有名为 headless 的 gem 可以执行上述 Xvfb 的启动和终止。利用 selenium-webdriver 启动驱动前,只需执行下面的代码,就可以在 CI 环境中以无界面模式启动浏览器并执行测试。

require "headless"
headless = Headless.new
headless.start
at_exit { headless.destroy }

使用真机或模拟器时,构建 CI 环境的难度很高,而构建使用 PC 浏览器的测试环境就比较容易。

本章小结

Selenium 通过 JSON Wire Protocol 标准化了客户端和浏览器之间的通信,因此可以使用各种语言去操作不同的浏览器。在测试智能手机的 Web 应用时,可以根据测试目的去选择是使用模拟器或真机,还是将普通的 PC 浏览器伪装成智能手机浏览器,抑或是在 CI 环境中使用无界面浏览器,等等。

另外,不论是文中介绍的 ChromeDriver2,还是没有介绍到的 Marionette 23(FirefoxDriver),像这样的新驱动都在开发推进中。Marionette 在 Firefox 操作自动化的基础上,还支持了 Firefox OS。

23https://developer.mozilla.org/ja/docs/Marionette

Selenium 自身也有在年底发布 Selenium 3 的 计划,今后还需继续关注。

延伸阅读

用户体验与可用性测试

本书是用户体验与可用性测试的入门级读物。作者基于多年的经验,围绕用户调查、原型制作、产品可用性评价、用户测试,结合具体案例,提供了极其实用的方法和实践技巧,同时也介绍了敏捷用户体验开发的相关内容。


精益设计:设计团队如何改善用户体验

★ 首本介绍精益设计理念的著作

★ 精益思想袖埃里克 · 莱斯作序推荐

★ 众多世界知名的企业家一致好评

本书适用于 Web 设计师、UX 设计师、产品经理和创业公司的设计团队。

目录

  • 编委会
  • 分栏目录
  • 第 4 回 众多亮点的游戏设计世界
  • 特辑 1 智能手机测试最前沿
  • 第 1 章 智能手机测试的基本知识
  • 第 2 章 本机应用程序的 UI 自动化测试
  • 第 3 章 浏览器自动化测试
  • 第 4 章 JavaScript 自动化测试
  • 第 5 章 服务器端自动化测试
  • 第 6 章 自动构建与发布应用程序
  • 特辑 2 Amazon Web Services 最新技巧
  • 第 1 章 Amazon Web Services 的分层比较
  • 第 2 章 使用 EC2 和 VPC 构建系统
  • 第 3 章 有效利用 RDS 构建数据库
  • 第 4 章 利用 CloudFormation 实现自动化的系统环境构建
  • 特辑 3 Sass/Compass 实战
  • 第 1 章 Sass/Compass 简介
  • 第 2 章 构建开发环境
  • 第 3 章 Sass 的基本语法以及 Compass
  • 第 4 章 写出现代化的 CSS
  • 第 5 章 实践中的 Sass/Compass
  • 第 9 回 使用 Boxen 进行 Mac 的环境搭建和配置管理
  • 第 9 回 通过重构改善数据库设计
  • 第 10 回 移动设备环境下的调试技术用方法
  • 第 4 回 使用 Grunt 实现前端开发的自动化
  • 第 9 回 用程序性能分析来分析性能问题
  • 第 9 回 通过 Doctrine Annotations 实现的声明式编程
  • 第 23 回 Perl 应用的测试与高速 CI 环境的构建方法
  • 第 18 回 致力于改善响应速度的“特命”小组
  • 图灵访谈 CSS 只是进化的一部分