为什么要使用自动截图功能?
因为截图是个没技术含量又费时的过程,如果比如app实现了国际化,多种语言多个模拟器,一张张截图、分类,真实是个苦差事。
使用fastlane的snapshot能很方便地实现多语言、多模拟器的屏幕截图,截图完成后还会自动生成一个漂亮的html网页,以展示捕获的所有屏幕。
如何使用
准备工作
fastlane 截图功能用到了Xcode7引入的UI Tests
功能。
如果不了解,建议看看这篇文章WWDC15 Session笔记 - Xcode 7 UI 测试初窥。
工程配置
-
在项目中添加一个新的UI Test target
(建议语言选择Swift,导入Swift文件更简单)
-
进入工程目录,运行fastlane snapshot init
, 运行成功后在fastlane文件夹下生成一些新文件,其中包括SnapshotHelper.swift
-
添加SnapshotHelper.swift
这个文件添加到 UI Test target
中
-
在测试类中,点击左下角的录制按钮,录制交互动作
-
在测试类中,要添加截屏的位置添加代码snapshot("01LoginScreen")
-
在测试类的setUp()
方法中添加如下代码:
let app = XCUIApplication()
setupSnapshot(app)
app.launch()
截屏
为了满足实际需要,需要先配置Snapfile
文件。
devices([
"iPhone 6",
"iPhone 6 Plus",
"iPhone 5"
])
languages([
"en-US",
"zh-Hans"
])
执行fastlane snapshot
就可以执行截屏脚本了。
接下来耐心等待就可以了。成功后会还生成一个html文件。
重置模拟器
截图工具提供了我们重置所有模拟器的方法。
如果你截图过程中遇到了奇怪的问题,这个命令可能会很有帮助。
fastlane snapshot reset_simulators
上传导入App Store
假设一开始,就执行了 fastlane init
,那么截图默认会在./fastlane/screenshots
文件夹。
此时上传只需要一行命令:
然后按提示进行操作就可以了。
自己遇到的问题
多语言测试截图失败
原因是自己的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";