iOS - 使用 fastlane snapshot 自动化截图

First at all

  首先先介绍一下 fastlane 是干嘛用的:

Fastlane 是一套使用 Ruby 写的自动化工具集,旨在简化 Android 和 iOS 的部署过程,自动化你的工作流。它可以简化一些乏味、单调、重复的工作,像截图、代码签名以及发布 App。

  然后这篇文章主要介绍的是 fastlane 里面其中一个工具——snapshot,我们可以用它来给应用进行自动化截图。

附上官方文档地址:https://docs.fastlane.tools/getting-started/ios/screenshots/

Just to try

  好了,接下来进入手把手教学阶段。这里的教学前提是你已经安装好了 fastlane 或者 snapshot。没安装好也没关系,打开终端输入以下代码进行安装:

Terminal
1
  sudo gem install snapshot

如果遇到这个问题:

You don’t have write permissions for the /usr/bin directory.

可以尝试加上安装路径

Terminal
1
gem install -n /usr/local/bin fastlane

成功安装完以后。以一个新工程为例子,首先我们需要给他增加一个 UI Testing Target

1、增加 UI Testing Target

选择 Xcode 顶部菜单栏中的 File –> New –> **Target…**,在弹出框中选择 iOS UI Testing Target

名字随意,其他默认。然后点击工程,添加一个新的 scheme

在弹出框中选择你新添加的 Target

2、编辑 UI Testing Target

注意勾选你的 UI Testing Target,然后点击 Edit Scheme

然后在弹出框中,勾选 Build 中的 RunShard

3、给工程加入 snapshot

打开终端,切到工程目录底下,输入一下命令:

Terminal
1
fastlane snapshot init

成功后工程目录会多出两个文件

SnapshotHelper.swift 文件需要我们添加到项目中使用,注意选中的Target 是前面创建的 UITest Target。如果是 OC 项目,文件拖入时会自动提醒是否创建桥接文件,选择“YES”就行了。

Snapfile 是截图配置文件,可以在里面设置需要截图的设备和语言。

4、在工程中使用 snapshot

当确认了 UI Testing Target 的设置没问题,snapshot 的引用文件在工程中,配置文件也没问题后,我们下一步就可以开始在工程中初始化 snapshot 和调用他的截图方法了。

首先,我们需要在 setUp 方法中初始化,值得一提的是官方文档和网上搜索到的技术博客中 OC 的初始化方法:[Snapshot setupSnapshot:app];,在 snapshot 中的源码好像已经找不到了,现在的初始化方法如下

Object-C
1
2
3
XCUIApplication *app = [[XCUIApplication alloc]init];
[Snapshot setupSnapshot:app waitForAnimations:YES];
[app launch];

然后在 testExample 方法中实现截图方法

Object-C
1
2
3
4
5
6
7
8
9
 XCUIApplication *app = [[XCUIApplication alloc] init];

//截图 - 首頁
[Snapshot snapshot:@"0main" timeWaitingForIdle:10];

//截图 - 点击方法
XCUIElement *openButton = app.buttons[@"Open"];
[openButton tap];
[Snapshot snapshot:@"1filter" timeWaitingForIdle:10];

这里需要强调的一点是 XCUIElement *openButton = app.buttons[@"Open"]; 这句里的 “Open”,是怎么来的,他是根据我们创建控件时所设置的 accessibilityIdentifier 的值来的。

Object-c
1
2
3
4
UIButton *btnOne = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width / 2, self.view.frame.size.width / 2)];
[btnOne addTarget:self action:@selector(jumpToAlibabba) forControlEvents:UIControlEventTouchUpInside];
[btnOne setAccessibilityIdentifier:@"Open"];
[self.view addSubview:btnOne];

完成这一步,剩下需要做的就不多了。

5、获取自动化截图结果

同样打开终端,切到项目路径,运行

Terminal
1
fastlane snapshot

然后会出现一连串的打印

运行结束以后,成功的话会生成了一个 html 文件和一组截图,html 页面会自己打开。

不过显示的效果有点不太友好~
以上。