大家请使用 appium-desktop

以下内容陈旧,不建议看了。

更新下:

使用 gui 启动的 appium 1.2.2 也会有这个问题,所以你要把 deviceconsole 复制到 /Applications/Appium.app/Contents/Resources/node_modules/appium/build/deviceconsole 下面。你自己的路径可能和我不一样,切记。

同意如果这个问题不解决, iOS 上的 真机 inspector 也打不开。

英文好的同学请移步官方文档 real-devices
推荐自己边看边试验。

首先 Appium 支持 iOS 真机

以下条件必须满足:

Provisioning Profile

再次强调真机需要有效的开发分发证书和开发的 Provisioning Profile。
你的应用需要签名。Appium 会参试使用 Fruitstrap 安装应用。
但是使用 xcode 安装到真机会方便很多。

拓展: 什么是 Provisioning Profile?

运行

要指定真机运行有两种方式:

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'
    })

调试的思路

目前 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 追踪了。

解决方法如下:

注意: deviceName 就算为空也一定要,代码写死的。。。


↙↙↙阅读原文可查看相关链接,并与作者交流