【翻译】Appium 的故障排查

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

你可能感兴趣的:(【翻译】Appium 的故障排查)