iOS开发fastlane从入门到入土(二):自动截屏

snapshot

本文主要介绍Fastlane的扩展功能,基于UI Testing使用snapshotframeit进行自动截屏、加壳。如果你还对Fastlane不了解,请先阅读我上一篇文章《iOS开发fastlane从入门到入土(一):自动打包》

UI Testing

snapshot是基于UI Testing来实现的。UI Testing是苹果在Xcode7上推出的一个自动化测试模块。

1. 集成 UI Testing
新建一个UI Testing 的 target(如果项目中已经存在,这一步可以略过)

New Target

点击左上角的Scheme,选择New Scheme,选择新建的UITests
New Scheme

选择新建的Scheme,选择Edit Scheme,选择Build,勾选Shared和Run
Edit Scheme

2. UI 行为录制
首先,不要太担心自己不会写测试用例,UI Testing有个牛逼的功能就是可以录制你的操作,你完全可以通过在录制好的操作的恰当点去生成截图。当然,如果你的app里需要更复杂的操作的话还是需要学习一下相关语法的。
一个新建的UITesting文件的基本结构如下:

#import <XCTest/XCTest.h>

@interface XXXUITests : XCTestCase

@end

@implementation XXXUITests

- (void)setUp {
    // Put setup code here. This method is called before the invocation of each test method in the class.

    // In UI tests it is usually best to stop immediately when a failure occurs.
    self.continueAfterFailure = NO;

    // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
    [[[XCUIApplication alloc] init] launch];

    // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
}

- (void)tearDown {
    // Put teardown code here. This method is called after the invocation of each test method in the class.
}

- (void)testExample {
    // Use recording to get started writing UI tests.
    // Use XCTAssert and related functions to verify your tests produce the correct results.
}

@end

选择项目的Scheme,注意不要选择UITests的Scheme,否则以下操作会报错Please select a scheme where “xxx” is the executable

行为录制

*注意:光标一定要放在方法体内,不然红色的圆点会变灰不可点击
记录一个简单的

录制完成后你可能会发现有报错,例如以下这样


这是Xcode的一个bug,只需要全局替换\U替换为\u即可。
你会发现上面获取UI元素都是通过级联查找到的,写出来肯定会不美观,如果你想更具可读性,可以通过给控件设置accessibilityIdentifier属性来访问。

使用command + U运行UITests类中 每一个以test开头的方法,或者直接点击方法前面的播放按钮运行自动化测试


如果你运行自动测试出现Pods库头文件找不到的错,如下:

请前往以下的配置里将UITests在Debug和Release下改成Pod-xx.debug和Pod-xx.release(默认都为None)

测试成功后方法前会出现✅

关于UITesting更详细的使用,可以阅读onevcat的这篇博客

Snapshot

1. 配置 snapshot
进入项目目录,输入以下命令,会在fastlane目录下生成两个文件:SnapfileSnapshotHelper.swift

$ fastlane snapshot init
[✔] 🚀 
✅  Successfully created SnapshotHelper.swift './fastlane/SnapshotHelper.swift'
✅  Successfully created new Snapfile at './fastlane/Snapfile'

Snapfile文件:

# Uncomment the lines below you want to change by removing the # in the beginning
# 需要截图的设备型号
 devices([
   #"iPhone 6",
   #"iPhone 6 Plus",
   #"iPhone 5",
   #"iPhone 4s"
   #"iPhone 8",
   "iPhone 8 Plus",
   #"iPhone SE",
   "iPhone X"
 ])

 languages([
   "zh-Hans"
#   "en-US",
#   "de-DE",
#   "it-IT",
#   ["pt", "pt_BR"] # Portuguese with Brazilian locale
 ])

# The name of the scheme which contains the UI Tests
# scheme("SchemeName")

# Where should the resulting screenshots be stored?
# 截图输出目录
# output_directory("./screenshots")

# remove the '#' to clear all previously generated screenshots before creating new ones
# 生成前清除所有截图
 clear_previous_screenshots(true)

# Arguments to pass to the app on launch. See https://docs.fastlane.tools/actions/snapshot/#launch-arguments
# launch_arguments(["-favColor red"])

# For more information about all available options run
# fastlane action snapshot

2. 导入SnapshotHelper
将SnapshotHelper.swift文件拖入到xxxUITests文件夹下,选择加入哪个target的时候, 选择加入到xxxUITests的target下


选择加入的target, 点击 [确定] 以后,如果是OC项目会询问你是否创建桥接文件(只有第一次拖入swift文件的时候才会提示, 你如果删除了swift文件之后,再次向工程中拖入就不会提示让你创建桥接文件了),文件名类似TargetName-Bridging-Header.h

其实如果你是OC项目,不存在Swift文件里调用OC类,完全可以不创建这个文件,这个文件主要是用来import OC头文件给Swift类调用的

3. 使用Snapshot自动截图
xxxUITests.m文件里#import "xxxUITests-Swift.h"引入头文件,头文件的名字是 “TargetName-Swift.h”(这个头文件是系统默认生成的,用来在OC里调用Swift类,不用我们手动创建,没有智能提示,保证导入正确就可以了。)

// 引入这个类就引入了所有的Swift类
#import "xxxUITests-Swift.h"

- (void)setUp方法中初始化Snapshot对象

- (void)setUp {
    // In UI tests it is usually best to stop immediately when a failure occurs.
    self.continueAfterFailure = NO;

    // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
    XCUIApplication *app = [[XCUIApplication alloc] init];
    [Snapshot setupSnapshot:app];
    [app launch];
}

在测试用例方法适当位置放入截图代码:

- (void)testExample {
    XCUIApplication *app = [[XCUIApplication alloc] init];
    [app.buttons[@"\u767b\u5f55"] tap];
    // 截图
    [Snapshot snapshot:@"01Login" timeWaitingForIdle:10];
    [app.buttons[@"nav profile"] tap];
}

运行fastlane snapshot即可自动截图

更多关于Screenshots的用法请参照官方文档Screenshots Doc

Frameit

1. 安装

使用frameit需要安装依赖库ImageMagick,官方推荐安装方式:

brew install libpng jpeg imagemagick

如果你已经安装了imagemagick但是看到以下错误信息:

mogrify: no decode delegate for this image format `PNG'

你可能需要重新安装并从源代码构建。运行以下命令:

brew uninstall imagemagick; brew install libpng jpeg; brew install imagemagick --build-from-source

通过命令fastlane frameit setup或者fastlane frameit download_frames更新最近的设备外壳。

2. 使用
  • 简单使用
# 默认为黑色外壳 支持颜色有white、silver、rose_gold、gold 
frame_screenshots(white: true) #外壳为白色
  • 进阶使用
    如果你需要弄些背景和文字描述,那么你需要通过配置Framefile.json文件去定制化需求。
    首先需要你在screenshots文件目录下创建Framefile.json,cd到screenshots目录输入touch Framefile.json
    然后进入你的截图多语言zh-Hans目录下,新建title.stringskeyword.strings文件,这两个文件是放标题和关键字的。
    注意:这两个.strings文件一定要是UTF-8或者UTF-16 BE with BOM编码,或者直接由Xcode生成,第一行必须是空行。
    将背景图放在screenshots目录下,新建一个fonts文件夹,里面放你需要用到的字体文件,这里是官方的一个sample
    完成后你的目录结构应该是这样的:

    Framefile.json文件:
{
  "default": {
    "keyword": {
      "fonts": [
        {
          "font": "./fonts/PingFang.ttc",
          "supported": ["en-US"]
        },
        {
          "font": "./fonts/PingFang.ttc",
          "supported": ["zh-Hans"]
        }
      ]
    },
    "title": {
      "fonts": [
        {
          "font": "./fonts/PingFang.ttc",
          "supported": ["en-US"]
        },
        {
          "font": "./fonts/PingFang.ttc",
          "supported": ["zh-Hans"]
        }
      ],
      "color": "#545454" // 标题颜色
    },
    // 自定义背景图片
    "background": "./background.jpg",
    // 图的内边距
    "padding": 60,
    // 是否完全显示手机框 false 为底部会被隐藏部分视图
    "show_complete_frame": false,
    // 关键字是否在标题上面 false表示关键字与标题在同一行
    "stack_title" : true,
    // 标题在屏幕下方还是上方 false 为上方
    "title_below_image": false,
    // 外壳颜色 优先级更高 (Valid values are BLACK,WHITE,GOLDandROSE_GOLD`)
    "frame": "GOLD"
  },


  "data": [
    {
      "filter": "1",  // 这是图片名
      "keyword": {
        "color": "#d21559"  // 关键字颜色
      }
    },
    {
      "filter": "2",
      "keyword": {
        "color": "#feb909"
      }
    },
    {
      "filter": "3",
      "keyword": {
        "color": "#aa4dbc"
      }
    },
    {
      "filter": "4",
      "keyword": {
        "color": "#31bb48"
      }
    }
  ]
}

title.strings文件:


"1" = "第一张图标题";

"2" = "第二张图标题";

"3" = "第三张图标题";

"4" = "第四张图标题";

keyword.strings文件:


"1" = "自动";

"2" = "打包";

"3" = "截图";

"4" = "证书";

Fastfile文件里写个任务:

desc "给截图套壳"
  lane :framePic do
    frameit(
      # 白色
      white: true,
      # 使用iPhone 5s替代iPhone SE框架
      use_legacy_iphone5s: true,
      # 使用iPhone 6s替代iPhone 7框架
      use_legacy_iphone6s: true,
      # 使用iPhone X 替代iPhone XS框架
      use_legacy_iphonex: true,
      # 截图所在路径
      path: "./fastlane/screenshots"
    )
  end

运行fastlane framePic


当当当当大功告成~

更多关于Frameit的用法请参照官方文档Frameit Doc

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容