You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 环境信息

项值
OS14.2.1
Ruby2.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/检查是否存在,是否有写入权限
  • 更新依赖版本:当前使用的screengrab 1.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:28:18