如何在 iOS 真机运行 Appium

使用 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 安装到真机会方便很多。

拓展: 什么是 Provisioning Profile?

运行

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

  • appium 启动的时候,指定 udid 和 app bundle appium -U <udid> --app <path or bundle>

  • 或者在脚本里指定两个 desired capability

    <span class="n">desired_capabilities</span><span class="o">=</span><span class="p">{</span>
                <span class="s">'app'</span><span class="p">:</span><span class="s">'com.xxx.iphone'</span><span class="p">,</span>
                <span class="s">'udid'</span><span class="p">:</span><span class="s">'70643e56c1b0f3c3132c44c87e433a48b5531ee6'</span><span class="p">,</span>
                <span class="s">'platformName'</span><span class="p">:</span> <span class="s">'iOS'</span><span class="p">,</span>
                <span class="s">'deviceName'</span><span class="p">:</span> <span class="s">'iPhone'</span>
            <span class="p">})</span>

注意: 如果设备中未安装 app 可以指定 ipa 地址,如果安装了,
则指定 bundle ID。

所以对于第一种情况,代码可以这样写:

        <span class="bp">self</span><span class="o">.</span><span class="n">driver</span> <span class="o">=</span> <span class="n">webdriver</span><span class="o">.</span><span class="n">Remote</span><span class="p">(</span>
            <span class="n">command_executor</span><span class="o">=</span><span class="s">'http://127.0.0.1:4723/wd/hub'</span><span class="p">,</span>
            <span class="n">desired_capabilities</span><span class="o">=</span><span class="p">{</span>
                <span class="s">'deviceName'</span><span class="p">:</span><span class="s">''</span><span class="p">,</span>
                <span class="s">'platformName'</span><span class="p">:</span> <span class="s">'iOS'</span><span class="p">,</span>
            <span class="p">})</span>

对于第二种情况,代码可以这样写:

        <span class="n">app</span> <span class="o">=</span> <span class="s">"io.appium.TestApp"</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">driver</span> <span class="o">=</span> <span class="n">webdriver</span><span class="o">.</span><span class="n">Remote</span><span class="p">(</span>
            <span class="n">command_executor</span><span class="o">=</span><span class="s">'http://127.0.0.1:4723/wd/hub'</span><span class="p">,</span>
            <span class="n">desired_capabilities</span><span class="o">=</span><span class="p">{</span>
                <span class="s">'deviceName'</span><span class="p">:</span><span class="s">''</span><span class="p">,</span>
                <span class="s">'platformName'</span><span class="p">:</span> <span class="s">'iOS'</span><span class="p">,</span>
                <span class="s">'app'</span><span class="p">:</span> <span class="n">app</span><span class="p">,</span>
                <span class="s">'udid'</span><span class="p">:</span> <span class="s">'cc6bcd6a94aeb8490924dd05c5b318bfbfafb3bb'</span>
            <span class="p">})</span>
调试的思路
  • 确保 UDID 的正确,是真机的 UDID。(20+ 字符串)
  • 确保在模拟器上已经能运行无误了。
  • 直接使用 Instruments 看看是否能在真机上运行。有些情况连 xcode 的 instruments 都不能在真机上调试,那更别谈 appium 了
  • 确保运行 appium 用例前, instruments 没有启动过。看看有没有 instruments 的进程。
目前 1.2.2 的坑

目前 appium 1.2.2 上运行 iOS 真机测试的话,可能会遇到如下的错误:

info: <span class="o">[</span>debug] Starting iOS device log capture via deviceconsole
error: iOS log capture failed: spawn ENOENT
info: <span class="o">[</span>debug] Cleaning up appium session
error: Failed to start an Appium session, err was: Error: spawn ENOENT
info: <span class="o">[</span>debug] Error: spawn ENOENT
    at errnoException <span class="o">(</span>child_process.js:1000:11<span class="o">)</span>
    at Process.ChildProcess._handle.onexit <span class="o">(</span>child_process.js:791:34<span class="o">)</span>
info: <span class="o">[</span>debug] Responding to client with error: <span class="o">{</span><span class="s2">"status"</span>:33,<span class="s2">"value"</span>:<span class="o">{</span><span class="s2">"message"</span>:<span class="s2">"A new session could not be created. (Original  error: spawn ENOENT)"</span>,<span class="s2">"code"</span>:<span class="s2">"ENOENT"</span>,<span class="s2">"errno"</span>:<span class="s2">"ENOENT"</span>,<span class="s2">"syscall"</span>:<span class="s2">"spawn"</span>,<span class="s2">"origValue"</span>:<span class="s2">"spawn ENOENT"</span><span class="o">}</span>,<span class="s2">"sessionId"</span>:null<span class="o">}</span>
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 就算为空也一定要,代码写死的。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值