使用 gui 启动的 appium 1.2.2 也会有这个问题,所以你要把 deviceconsole 复制到 /Applications/Appium.app/Contents/Resources/node_modules/appium/build/deviceconsole 下面。你自己的路径可能和我不一样,切记。
同意如果这个问题不解决, iOS 上的 真机 inspector 也打不开。
英文好的同学请移步官方文档 real-devices,
推荐自己边看边试验。
首先 Appium 支持 iOS 真机
以下条件必须满足:
- 苹果开发者账号和开发者证书
- 苹果设备,确保这个设备已经被配置为开发机器。怎么配置?
- 签名过的 .ipa 文件或者源代码
- A Mac with Xcode and the Xcode Command Line Developer Tools,有 xcode和xcode command line 的苹果系统。别来问我,windows 怎么测试 iOS 应用。
Provisioning Profile
再次强调真机需要有效的开发分发证书和开发的 Provisioning Profile。
你的应用需要签名。Appium 会参试使用 Fruitstrap 安装应用。
但是使用 xcode 安装到真机会方便很多。
运行
要指定真机运行有两种方式:
-
appium 启动的时候,指定 udid 和 app bundle
appium -U <udid> --app <path or bundle>
-
或者在脚本里指定两个 desired capability
desired_capabilities={ 'app':'com.xxx.iphone', 'udid':'70643e56c1b0f3c3132c44c87e433a48b5531ee6', 'platformName': 'iOS', 'deviceName': 'iPhone' })
注意: 如果设备中未安装 app 可以指定 ipa 地址,如果安装了,
则指定 bundle ID。
所以对于第一种情况,代码可以这样写:
self.driver = webdriver.Remote( command_executor='http://127.0.0.1:4723/wd/hub', desired_capabilities={ 'deviceName':'', 'platformName': 'iOS', })
对于第二种情况,代码可以这样写:
app = "io.appium.TestApp" self.driver = webdriver.Remote( command_executor='http://127.0.0.1:4723/wd/hub', desired_capabilities={ 'deviceName':'', 'platformName': 'iOS', 'app': app, 'udid': 'cc6bcd6a94aeb8490924dd05c5b318bfbfafb3bb' })
调试的思路
- 确保 UDID 的正确,是真机的 UDID。(20+ 字符串)
- 确保在模拟器上已经能运行无误了。
- 直接使用 Instruments 看看是否能在真机上运行。有些情况连 xcode 的 instruments 都不能在真机上调试,那更别谈 appium 了
- 确保运行 appium 用例前, instruments 没有启动过。看看有没有 instruments 的进程。
目前 1.2.2 的坑
目前 appium 1.2.2 上运行 ios 真机测试的话,可能会遇到如下的错误:
info: [debug] Starting iOS device log capture via deviceconsole error: iOS log capture failed: spawn ENOENT info: [debug] Cleaning up appium session error: Failed to start an Appium session, err was: Error: spawn ENOENT info: [debug] Error: spawn ENOENT at errnoException (child_process.js:1000:11) at Process.ChildProcess._handle.onexit (child_process.js:791:34) info: [debug] Responding to client with error: {"status":33,"value":{"message":"A new session could not be created. (Original error: spawn ENOENT)","code":"ENOENT","errno":"ENOENT","syscall":"spawn","origValue":"spawn ENOENT"},"sessionId":null} info: <-- POST /wd/hub/session 500 1780.745 ms - 197
这是因为在 /usr/local/lib/node_modules/appium/build/deviceconsole/ 下面缺失了 deviceconsole。已经有 bug 追踪了。
解决方法如下:
- 到该目录底下
cd /usr/local/lib/node_modules/appium/build/deviceconsole/
- 打开这个deviceconsole project。
open deviceconsole.xcodeproj
- 重新 build 一把。把 build 出来的 deviceconsole,复制到
/usr/local/lib/node_modules/appium/build/deviceconsole/
去。 - 然后重新运行 Appium
注意: deviceName 就算为空也一定要,代码写死的。。。