Jetpack Compose结合Fastlane截图报错:未检测到截图求助
Jetpack Compose 结合 Fastlane 截图失败:"No screenshots were detected" 问题解决与可行示例
有没有Jetpack Compose与Fastlane截图结合使用的可行示例?我在尝试该方案时执行fastlane screenshots命令,测试执行成功但无法检测到截图,提示“No screenshots were detected”,具体报错为设备截图目录不存在或权限被拒。
我的测试代码
@RunWith(AndroidJUnit4::class) class ScreenshotTest { @get:Rule val composeTestRule = createComposeRule() @Before fun init() { Screengrab .setDefaultScreenshotStrategy( UiAutomatorScreenshotStrategy() ) } @Test fun useAppContext() { Screengrab.screenshot("before"); composeTestRule.setContent { FastlaneTestTheme { MainScreen() } } Screengrab.screenshot("after"); } }
Fastlane 环境信息
| 项 | 值 |
|---|---|
| OS | 14.2.1 |
| Ruby | 2.6.10 |
| fastlane版本 | 2.217.0 |
| screengrab版本 | 1.0.0 |
可行配置方案与修正示例
1. 修正测试代码:确保Compose界面渲染完成后截图
Compose界面需要时间渲染,直接在setContent后截图可能捕获到空白或未加载完成的界面,同时要确保截图路径和权限正常:
@RunWith(AndroidJUnit4::class) class ScreenshotTest { @get:Rule val composeTestRule = createComposeRule() @Before fun init() { // 针对Android 10+,可以使用适配Scoped Storage的截图策略,或确保UiAutomator有足够权限 Screengrab.setDefaultScreenshotStrategy(UiAutomatorScreenshotStrategy()) } @Test fun captureComposeScreen() { // 设置Compose内容 composeTestRule.setContent { FastlaneTestTheme { MainScreen() } } // 等待Compose界面完全渲染完成 composeTestRule.waitForIdle() // 等待UI稳定(可选,针对有动画的界面) Thread.sleep(500) // 执行截图 Screengrab.screenshot("main_screen_compose") } }
2. 配置Fastlane与权限
- 在
Fastfile中明确配置包名,确保screengrab能正确识别测试结果:
lane :screenshots do screengrab( app_package_name: "com.your.package", tests_package_name: "com.your.package.test", clear_previous_screenshots: true, output_directory: "./fastlane/screenshots" ) end
- 在测试模块的
AndroidManifest.xml中添加必要权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="28" /> <uses-permission android:name="android.permission.INTERNET" />
3. 常见问题排查
- 验证设备截图目录:默认路径为
/sdcard/Pictures/Screenshots/,可通过adb shell ls /sdcard/Pictures/Screenshots/检查是否存在,是否有写入权限 - 更新依赖版本:当前使用的
screengrab1.0.0版本较旧,建议升级到最新稳定版(如com.facebook.testing.screenshot:core:0.16.1),同时确保Fastlane的screengrab工具版本与依赖兼容 - 适配Android 10+ Scoped Storage:若目标版本为Android 10+,可使用
Screengrab.setScreenshotPath指定应用私有目录,避免权限问题:
@Before fun init() { val screenshotPath = ApplicationProvider.getApplicationContext<Context>().getExternalFilesDir(Environment.DIRECTORY_PICTURES)?.absolutePath Screengrab.setScreenshotPath(screenshotPath) Screengrab.setDefaultScreenshotStrategy(UiAutomatorScreenshotStrategy()) }
内容的提问来源于stack exchange,提问作者BPDev
相关产品推荐
相关产品推荐

