使用 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 就算為空也一定要,代碼寫死的。。。