赞
踩
转自:https://testerhome.com/topics/4904
去年的 SeleniumConf 上,Facebook 推出了一款新的iOS移动测试框架 —— WebDriverAgent,当时的推文上,写的还只支持模拟器。半年过过去了,如今在看官方github —— https://github.com/facebook/WebDriverAgent,已经宣称支持真机测试了(亲测的确支持)。我把它的 ReadMe 搬运过来:
WebDriverAgent 在 iOS 端实现了一个 WebDriver server ,借助这个 server 我们可以远程控制 iOS 设备。你可以启动、杀死应用,点击、滚动视图,或者确定页面展示是否正确。This makes it a perfect tool for application end-to-end testing or general purpose device automation.(它说它是iOS上一个完美的e2e的自动化解决方案) It works by linking
XCTest.framework
and calling Apple's API to execute commands directly on a device.(链接XCTest.framework
调用苹果的API直接在设备上执行命令) WebDriverAgent is developed and used at Facebook for end-to-end testing and is successfully adopted by Appium. (Appium封装工作正在进行中,如果一旦封装好,那么以后就可以直接用Appium提供的binding了。)It is currently maintained by Marek Cirkos and Mehdi Mulani.
To get the project set up just run bootstrap script:
<code style="font-family:Menlo,Monaco,Consolas,"Courier New",monospace; white-space:pre-wrap; display:block; margin:2px; word-break:break-all; line-height:18px; padding:0px!important; border:none!important" class="hljs">./Scripts/bootstrap.sh
</code>
It will:
After it is finished you can simply open WebDriverAgent.xcodeproj
and start WebDriverAgentRunner
test and start sending requests.
More about how to start WebDriverAgent here.
官方的文档讲的很清晰,基本没有什么坑。Carthage 是用来解决 xcode project 依赖的,大家可能知道 cocoapod,那你就把 Carthage 理解成和 cocoapod 一样的东西就可以了,可以通过 brew install carthage
安装。npm 是用来构建 Inspector, Inspector 是一个 react 的应用,通过往 WebDriverAgent 发 HTTP 请求,返回页面的结构。
下面是我运行 ./Scripts/bootstrap.sh 的结果:
- ➜ WebDriverAgent git:(master) ./Scripts/bootstrap.sh
- Fetching dependencies
- *** Checking out KissXML at "5.0.3"
- *** Checking out peertalk at "5a0495a7b7d81b68e25ea1933c755b677cb040da"
- *** Checking out RoutingHTTPServer at "v1.0.0"
- *** Downloading ocmock.framework binary at "OCMock 3.2.2"
- *** Checking out ocmock at "v3.2.2"
- *** xcodebuild output can be found in /var/folders/11/wh7ypz2s7q17lxxjphxd4z6h0000gn/T/carthage-xcodebuild.XhkH5T.log
- *** Building scheme "OCMock iOS" in OCMock.xcodeproj
- 2016-05-14 17:45:36.012 xcodebuild[14231:270807] [MT] DVTPlugInManager: Required plug-in compatibility UUID ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C for KSImageNamed.ideplugin (com.ksuther.KSImageNamed) not present
- 2016-05-14 17:45:36.159 xcodebuild[14231:270807] [MT] PluginLoading: Required plug-in compatibility UUID ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/UncrustifyPlugin.xcplugin' not present in DVTPlugInCompatibilityUUIDs
- 2016-05-14 17:45:36.160 xcodebuild[14231:270807] [MT] PluginLoading: Required plug-in compatibility UUID ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/Alcatraz.xcplugin' not present in DVTPlugInCompatibilityUUIDs
- 2016-05-14 17:45:46.318 xcodebuild[14494:271598] [MT] DVTPlugInManager: Required plug-in compatibility UUID ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C for KSImageNamed.ideplugin (com.ksuther.KSImageNamed) not present
- 2016-05-14 17:45:46.376 xcodebuild[14494:271598] [MT] PluginLoading: Required plug-in compatibility UUID ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/UncrustifyPlugin.xcplugin' not present in DVTPlugInCompatibilityUUIDs
- 2016-05-14 17:45:46.377 xcodebuild[14494:271598] [MT] PluginLoading: Required plug-in compatibility UUID ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/Alcatraz.xcplugin' not present in DVTPlugInCompatibilityUUIDs
- Building Inspector
- Creating bundle directory...
- Building inspector.js...
-
- > web-driver-inspector@1.0.0 build /Users/lihuazhang/code/WebDriverAgent/Inspector
- > webpack --progress --colors
-
- Hash: 536587fce0cad79f8558
- Version: webpack 1.12.2
- Time: 2794ms
- Asset Size Chunks Chunk Names
- inspector.js 706 kB 0 [emitted] main
- [0] multi main 28 bytes {0} [built]
- + 182 hidden modules
- Done
- ➜ WebDriverAgent git:(master)
build 好之后就是启动 WebDriverAgent,官方提供了四种方式:
使用 XCode
用 xcodebuild
Using fbsimctl from FBSimulatorControl framework
Using FBSimulatorControl framework directly
我使用 XCode (如果自动化的话,可以使用 xcodebuild),打开 WebDriverAgent.xcodeproj,IDE 的显示是这样的:
先不要纠结其他,我们只看 UITestingUITests.m
,这是一个 XCTestCase 的实现类,我们直接运行,真机或者模拟器都可以。我用的模拟器,运行之后,会在模拟器安装一个 WebDriverAgentRunner 的应用。我们看下运行的日志:
- 2016-05-15 01:19:43.019 XCTRunner[29300:524372] Running tests...
- 01:19:43.218 XCTRunner[29300:524495] _XCT_testBundleReadyWithProtocolVersion:minimumVersion: reply received
- 01:19:43.228 XCTRunner[29300:524495] _IDE_startExecutingTestPlanWithProtocolVersion:16
- 2016-05-15 01:19:44.732 XCTRunner[29300:524372] Continuing to run tests in the background with task ID 1
- Test Suite 'Selected tests' started at 2016-05-15 01:19:45.319
- Test Suite 'UITestingUITests' started at 2016-05-15 01:19:45.322
- Test Case '-[UITestingUITests testRunner]' started.
- 2016-05-15 01:19:45.323 XCTRunner[29300:524372] -[_XCTestDriverTestObserver testCaseWillStart:] UITestingUITests testRunner
- t = 0.00s Start Test
- 2016-05-15 01:19:45.324 XCTRunner[29300:524372] -[UITestingUITests testRunner] started activity <XCActivityRecord: 0x7f8acb721660> 2016-05-14 17:19:45 +0000: Start Test
- 2016-05-15 01:19:45.327 XCTRunner[29300:524372] -[UITestingUITests testRunner] finished activity <XCActivityRecord: 0x7f8acb721660> 2016-05-14 17:19:45 +0000: Start Test (0.00271106s)
- t = 0.01s Set Up
- 2016-05-15 01:19:45.328 XCTRunner[29300:524372] -[UITestingUITests testRunner] started activity <XCActivityRecord: 0x7f8acb7219e0> 2016-05-14 17:19:45 +0000: Set Up
- 2016-05-15 01:19:45.330 XCTRunner[29300:524372] -[UITestingUITests testRunner] finished activity <XCActivityRecord: 0x7f8acb7219e0> 2016-05-14 17:19:45 +0000: Set Up (0.00130302s)
- 2016-05-15 01:19:45.331 XCTRunner[29300:524372] Built at May 15 2016 01:19:32
- 2016-05-15 01:19:45.386 XCTRunner[29300:524372] ServerURLHere->http://192.168.0.105:8100<-ServerURLHere
- 2016-05-15 01:19:45.386 XCTRunner[29300:524372] Listening on USB
关键字是:
2016-05-15 01:19:45.386 XCTRunner[29300:524372] ServerURLHere->http://192.168.0.105:8100<-ServerURLHere
这个意思是告诉我们,设备中起了一个服务器,我们可以用 http://192.168.0.105:8100
访问到。下面就是在浏览器打开返回的内容:
- {
- value: "Unhandled endpoint: / -- http://192.168.0.105:8100/ with parameters { wildcards = ( "" ); }",
- sessionId: null,
- status: 1
- }
通道找到了,接下来就是看如何造请求了。官方问题提供了文档:https://github.com/facebook/WebDriverAgent/wiki/Queries。最简单的 status
,http://192.168.0.105:8100/status,
- {
- value: {
- state: "success",
- os: {
- name: "iPhone OS",
- version: "9.3"
- },
- ios: {
- simulatorVersion: "9.3"
- },
- build: {
- time: "May 15 2016 01:19:33"
- }
- },
- sessionId: null,
- status: 0
- }
其他的 API 有兴趣的人可以直接看文档。
服务端有了,就剩下客户端了,但是目前为止没有一个官方的客户端binding,Facebook 的同学没有放出来,看这个issue——https://github.com/facebook/WebDriverAgent/issues/115
所以目前为止如果要使用 WebDriverAgent 就要自己实现一套客户端代码。
直接在浏览器端打开 http://192.168.0.105:8100/inspector,就可以看见如下界面:
inspector 不是很强大,无法实现交互,不过大致能帮大家定位元素。
WebDriverAgent 取代 UIAutomation 或者 XCUITesting 做为 Appium 底部驱动看来是时间问题了。原因如下:
支持真机和模拟器
不受 instruments 单实例的限制
Facebook 出品
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。