Appium 的故障排查
當你在使用過程中遇到了問題,先別急著到 github 上提交反饋,或者到 appium-discuss discussion group 提問。可以先試試在本文中能否找到解決的辦法。
常見問題
- 確保你是跟著 README 中的每一步來做。
- 確保你的系統已經配置好所需環境(例如. Xcode 已更至最新,Android SDK 已經安裝好,而且
ANDROID_HOME
也設置無誤)。 - 確保你應用的存放路徑是正確的。
- 在 windows 上運行 appium.app 要使用管理員權限,假如你在 cmd 中運行,也得確保是在管理員權限下。
如果你是通過 Appium.app 運行
- 升級應用并重啟。如果你被告知應用無法升級,請到 appium.io 重新下載。
如果你是通過 Appium 的源碼運行
通過
git pull
命令拉取代碼,確保當前的代碼是最新的移除舊的依賴:
rm -rf node_modules
重新安裝依賴:
npm install
代碼 Re-transpile:
gulp transpile
你可以使用 Appium Doctor 去檢測 Appium 環境是否已經配置好了。
如果你升級到 Android SDK 22 后出現如下報錯:
{ANDROID_HOME}/tools/ant/uibuild.xml:155: SDK does not have any Build Tools installed.
在 Android SDK 22 中,platform 與 build tools 分別被拆分到各自的 SDK 管理包中去了。你需要確保已經正確安裝了 build-tools 與 platform-tools。
Android
- 確保 Android 模擬器已經開啟并在運行中。
- 出現設備連接問題時,
adb kill-server && adb devices
這行命令非常有用。它可以重置你的 Android 設備的連接。 - 確保你已經設置了 ANDROID_HOME 已經指向了 Android SDK 路徑
Windows
- 確保已經開啟了開發者模式。
- 確保 command prompt 已經是管理員權限。
- 檢查 Appium 服務器正在監聽的 URL 是否與你測試腳本中的 URL 匹配的上。
IOS
確保 Instruments.app 沒有被開啟。
如果你使用模擬器時,記得不要讓真機連上你的電腦。
確保在手機的設置中的 accessibility 輔助功能是關閉的。
確保應用是變異在當前運行的模擬器上。
確保應用已編譯在合適的模擬器(或真機)上(例如. 在模擬器上運行需要 debug 模式的包),否則你會出現
posix spawn
報錯。如果你曾經用 sudo 運行過 Appium,你可能需要運行
sudo rm /tmp/instruments_sock
該命令,而且記住以后盡量別帶上 sudo。如果你是第一次運行 Appium,記得對 Instruments 進行授權。 查閱 running on OSX documentation 了解更多。
如果在真機上運行 Instruments 出現了崩潰("exited with code 253"),確保 Xcode 已經下載了設備的符號文件。到 Window -> Devices,然后他就會自動的開始下載。每次 iOS 版本升級后都需要做這步。
如果你看到
iOS Simulator failed to install the application.
這樣的報錯,并且確定路徑沒有設置錯誤的話,那你可以嘗試去重啟你的電腦。確保你的 macOS 上的 keychain 已經保存了用于構建你的應用的證書,并且 WebDeriverAgent 是已簽名的。特別是你在使用 ssh 的情況下。通常失敗的話會顯示
簽名
報錯。-
如果你的應用中還有自定義的元素,他們或許不能通過默認的方式去使用 UIAutomaion(and therefore Appuim)進行自動化。你需要將 accessibility status 設置為'enabled'。在代碼中設置的方式如下:
[myCustomView setAccessibilityEnabled:YES];
-
在 iOS 上測試可能會出現類似內存泄露(包括性能不佳、程序掛起)的狀況。如果你出現了類似的問題,這很可能是由于一個 NSLog 的已知問題所導致的。其中的一個解決辦法就是將所有的 NSLog 代碼移除。然而,還是有一些巧妙的處理方法,可以不重構就能解決。
解決辦法 1
NSLog 是一個宏且可以被定義的。例如:
// *You'll need to define TEST or TEST2 and then recompile.* #ifdef TEST #define NSLog(...) _BlackHoleTestLogger(__VA_ARGS__); #endif // TEST #ifdef TEST2 #define NSLog(...) _StdoutTestLogger(__VA_ARGS__); #endif // TEST2 void _BlackHoleTestLogger(NSString *format, ...) { // } void _StdoutTestLogger(NSString *format, ...) { va_list argumentList; va_start(argumentList, format); NSMutableString * message = [[NSMutableString alloc] initWithFormat:format arguments:argumentList]; printf(message); va_end(argumentList); [message release]; }
解決辦法 2
手動去替換掉 NSLog 封裝的底層功能。該方法被 Apple in a similar context. 所推薦
extern void _NSSetLogCStringFunction(void(*)(const char *, unsigned, BOOL)); static void _GarbageFreeLogCString(const char *message, unsigned length, BOOL withSyslogBanner) { fprintf(stderr, "%s\\n", message); } int main (int argc, const char *argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; int exitCode; setbuf(stderr, NULL); _NSSetLogCStringFunction(_GarbageFreeLogCString); exitCode = WOApplicationMain(@"Application", argc, argv); [pool release]; return exitCode; }
### Webview/Hybrid/Safari 應用的支持
* 確保真機上的 'Web Inspector' 為打開狀態。
* 確保你已經打開 Safari 的開發者模式(Safari - Advance Preferences- Developer menu for simulators)。
* 確保你客戶端的庫提供的 appium 命令 `context` 可以讓你正確地切換 contexts。
* 當你嘗試打開代理的時候,出現了這個報錯:select_port() failed,請查閱該[文檔](https://groups.google.com/forum/#!topic/appium-discuss/tw2GaSN8WX0)。
* 在 Safari session 中,如果日志記錄到不能輸入初始 url 的問題,先確保你的軟鍵盤是否已被開啟,詳情請查閱該[文檔](https://github.com/appium/appium/issues/6440)。
### 到社區尋求幫助
如果上述步驟還沒解決你的問題,那你可以通過以下方式獲得幫助:
當你在使用 Appium 的過程中有任何問題,而且 Appium 提供的報錯信息不夠清晰的話,歡迎加入[討論組](https://discuss.appium.io)與大家進行討論。提問時請附帶上如下信息:
* 你是通過什么方式運行 Appium(Appium.app, npm, source)。
* 你使用什么操作系統。
* 你是針對什么設備和版本去做測試的(例如. Android 4.4, 或者 iOS 7.1)。
* 你是使用真機還是模擬器去做測試。
* 提供客戶端和服務端給出的的錯誤(例如. “在運行我的 Python 測試腳本時候出現了異常,Appium 服務器的報錯信息如鏈接中所示”)。
* 除了上述,在提問的時候希望可以附帶上 Appium 服務器輸出的內容(特別是在 verbose 模式下),這樣我們就可以更好地分析并跟進問題。
如果你確信你發現的是一個 bug,請直接到 [issue tracker](https://github.com/appium/appium/issues) 去提交一個 issue 去描述 bug 的信息以及重現步驟。
### 已知問題
* 如果你已在官網下載并安裝 Node,你需要使用 sudo 去運行 `npm`。可這么做這并不理想。可以嘗試通過 [nvm](https://github.com/creationix/nvm), [n](https://github.com/visionmedia/n) 或者 `brew install node` 這幾種方式去安裝!
* 通過設置代理,iOS 真機可以支持 Webview 了,詳情可查看[討論](https://groups.google.com/d/msg/appium-discuss/u1ropm4OEbY/uJ3y422a5_kJ)。
* 有時候 iOS 的 UI 元素在被定位到后的幾毫秒間會失效,這會導致一個類似 `(null) cannot be tapped` 的報錯。唯一的解決辦法就是把 finding-and-clicking 的代碼放進一個 retry block 中。
* 如果你是通過 MacPorts 去安裝 Node 與 npm,Appium 可能很難找到可執行的 `node`。你必須確保 MacoPorts 的 bin 文件夾(默認是 `/opt/local/bin`)已經添加到你的 `~/.profile`, `~/.bash_profile` 或者 `~/.bashrc` 中的 `PATH` 環境變量中。
### 特定的錯誤
|Action|Error|Resolution|
|------|-----|----------|
|Running ios test|`[INST STDERR] posix spawn failure; aborting launch`|你的應用沒有分別對應模擬器或者真機去編譯對應版本.|
|Running mobile safari test|`error: Could not prepare mobile safari with version '7.1'`|你可能需要再次運行授權的腳本以確保 iOS SDK 文件是可寫狀態。詳情請查閱 [running on OSX documentation](./running-on-osx.md#authorizing-ios-on-the-computer)|