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'。在代码中设置的方式如下:
center
[myCustomView setAccessibilityEnabled:YES];
- 在 iOS 上测试可能会出现类似内存泄露(包括性能不佳、程序挂起)的状况。如果你出现了类似的问题,这很可能是由于一个 NSLog 的已知问题所导致的。其中的一个解决办法就是将所有的 NSLog 代码移除。然而,还是有一些巧妙的处理方法,可以不重构就能解决。
### 解决办法 1 NSLog 是一个宏且可以被定义的。例如: ```objectivec // 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. 所推荐 ```objectivec 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,请查阅该文档。
- 在 Safari session 中,如果日志记录到不能输入初始 url 的问题,先确保你的软键盘是否已被开启,详情请查阅该文档。
到社区寻求帮助
如果上述步骤还没解决你的问题,那你可以通过以下方式获得帮助:
当你在使用 Appium 的过程中有任何问题,而且 Appium 提供的报错信息不够清晰的话,欢迎加入讨论组与大家进行讨论。提问时请附带上如下信息:
- 你是通过什么方式运行 Appium(Appium.app, npm, source)。
- 你使用什么操作系统。
- 你是针对什么设备和版本去做测试的(例如. Android 4.4, 或者 iOS 7.1)。
- 你是使用真机还是模拟器去做测试。
- 提供客户端和服务端给出的的错误(例如. “在运行我的 Python 测试脚本时候出现了异常,Appium 服务器的报错信息如链接中所示”)。
- 除了上述,在提问的时候希望可以附带上 Appium 服务器输出的内容(特别是在 verbose 模式下),这样我们就可以更好地分析并跟进问题。
如果你确信你发现的是一个 bug,请直接到 issue tracker 去提交一个 issue 去描述 bug 的信息以及重现步骤。
已知问题
- 如果你已在官网下载并安装 Node,你需要使用 sudo 去运行
npm
。可这么做这并不理想。可以尝试通过 nvm, n 或者brew install node
这几种方式去安装! - 通过设置代理,iOS 真机可以支持 Webview 了,详情可查看讨论。
- 有时候 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 |
本文由 thanksdanny 翻译,由 lihuazhang 校验。