为什么要使用自动截图功能?

因为截图是个没技术含量又费时的过程,如果比如app实现了国际化,多种语言多个模拟器,一张张截图、分类,真实是个苦差事。

使用fastlane的snapshot能很方便地实现多语言、多模拟器的屏幕截图,截图完成后还会自动生成一个漂亮的html网页,以展示捕获的所有屏幕。

如何使用

准备工作

fastlane 截图功能用到了Xcode7引入的UI Tests功能。

如果不了解,建议看看这篇文章WWDC15 Session笔记 - Xcode 7 UI 测试初窥

工程配置

  1. 在项目中添加一个新的UI Test target(建议语言选择Swift,导入Swift文件更简单)
  2. 进入工程目录,运行fastlane snapshot init, 运行成功后在fastlane文件夹下生成一些新文件,其中包括SnapshotHelper.swift
  3. 添加SnapshotHelper.swift这个文件添加到 UI Test target
  4. 在测试类中,点击左下角的录制按钮,录制交互动作
  5. 在测试类中,要添加截屏的位置添加代码snapshot("01LoginScreen")
  6. 在测试类的setUp()方法中添加如下代码:

    let app = XCUIApplication()
    setupSnapshot(app)
    app.launch()

截屏

为了满足实际需要,需要先配置Snapfile 文件。

devices([
   "iPhone 6",
   "iPhone 6 Plus",
   "iPhone 5"
])

languages([
  "en-US",
  "zh-Hans"
])
#scheme "snapshotExample"
#截图文件数据位置
#output_directory "../screenshots"

执行fastlane snapshot就可以执行截屏脚本了。

接下来耐心等待就可以了。成功后会还生成一个html文件。

20170624210471.png

2017062451023htmlPagePreviewFade.jpg

重置模拟器

截图工具提供了我们重置所有模拟器的方法。 如果你截图过程中遇到了奇怪的问题,这个命令可能会很有帮助。

fastlane snapshot reset_simulators

上传导入App Store

假设一开始,就执行了 fastlane init,那么截图默认会在./fastlane/screenshots文件夹。

此时上传只需要一行命令:

 fastlane deliver

然后按提示进行操作就可以了。

自己遇到的问题

多语言测试截图失败

原因是自己的ui test方法没有写好。

func testSnapshots(){
     let app = XCUIApplication()
     snapshot("1Page")
     app.buttons["myButton"].tap()
     snapshot("1Page")
}

app.buttons["myButton"]获取到当前屏幕上所有的按钮的代理,并去寻找myButton按钮,但是不同语言中按钮的名字是不一样的,这样就到导致了截图失败。

解决方法,设置控件的identifier,可以在代码或者Interface Builder中进行设置:

self.myButton.accessibilityIdentifier = @"myButton";