diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/expiration/ExpirationBanner.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/expiration/ExpirationBanner.kt
index 78a179ea7829394a66f4b71d8c8bcb6ab7f99d69..b7502bb51928b511048c98061c17bde4168fd3f2 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/expiration/ExpirationBanner.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/expiration/ExpirationBanner.kt
@@ -42,6 +42,7 @@ import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.unit.dp
 import org.briarproject.briar.desktop.expiration.ExpirationUtils.periodicallyCheckIfExpired
 import org.briarproject.briar.desktop.theme.warningBackground
@@ -112,7 +113,7 @@ fun ExpirationBanner(
             icon = Icons.Filled.Close,
             contentDescription = i18n("hide"),
             onClick = hide,
-            modifier = Modifier.padding(vertical = 4.dp)
+            modifier = Modifier.padding(vertical = 4.dp).testTag("close_expiration")
         )
     }
 }
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/BriarUi.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/BriarUi.kt
index 44dc403110fff81ff35e95df42266ab08fc81037..2c1fb6164aecb1e7f6dc3bcf376dd6e952ccd11a 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/BriarUi.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/BriarUi.kt
@@ -35,7 +35,6 @@ import androidx.compose.ui.geometry.Size
 import androidx.compose.ui.graphics.toAwtImage
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.LocalLayoutDirection
-import androidx.compose.ui.platform.LocalLocalization
 import androidx.compose.ui.platform.PlatformLocalization
 import androidx.compose.ui.res.painterResource
 import androidx.compose.ui.window.FrameWindowScope
@@ -78,6 +77,9 @@ interface BriarUi {
     fun start(onClose: () -> Unit)
 
     fun stop()
+
+    @Composable
+    fun test()
 }
 
 val LocalWindowScope = staticCompositionLocalOf<FrameWindowScope?> { null }
@@ -178,29 +180,34 @@ constructor(
             }
 
             window.minimumSize = Dimension(800, 600)
-            CompositionLocalProvider(
-                LocalWindowScope provides this,
-                LocalWindowFocusState provides focusState,
-                LocalViewModelProvider provides viewModelProvider,
-                LocalConfiguration provides configuration,
-                LocalLocalization provides platformLocalization,
-            ) {
-                // invalidate whole application window in case the theme or language setting is changed
-                configuration.invalidateScreen.react {
-                    window.title = i18n("main.title")
-                    return@CompositionLocalProvider
-                }
 
-                val isDarkTheme = configuration.theme == DARK ||
-                    (configuration.theme == AUTO && isSystemInDarkTheme())
-                BriarTheme(isDarkTheme) {
-                    Column(Modifier.fillMaxSize()) {
-                        ExpirationBanner { screenState = EXPIRED; stop() }
-                        when (screenState) {
-                            STARTUP -> StartupScreen()
-                            MAIN -> MainScreen()
-                            EXPIRED -> ErrorScreen(i18n("startup.failed.expired"))
-                        }
+        }
+    }
+
+    @Composable
+    override fun test() {
+        CompositionLocalProvider(
+            //LocalWindowScope provides this,
+            //LocalWindowFocusState provides focusState,
+            LocalViewModelProvider provides viewModelProvider,
+            LocalConfiguration provides configuration,
+            //LocalLocalization provides platformLocalization,
+        ) {
+            // invalidate whole application window in case the theme or language setting is changed
+            configuration.invalidateScreen.react {
+                //window.title = i18n("main.title")
+                return@CompositionLocalProvider
+            }
+
+            val isDarkTheme = configuration.theme == DARK ||
+                (configuration.theme == AUTO && isSystemInDarkTheme())
+            BriarTheme(isDarkTheme) {
+                Column(Modifier.fillMaxSize()) {
+                    ExpirationBanner { screenState = EXPIRED; stop() }
+                    when (screenState) {
+                        STARTUP -> StartupScreen()
+                        MAIN -> MainScreen()
+                        EXPIRED -> ErrorScreen(i18n("startup.failed.expired"))
                     }
                 }
             }
diff --git a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/ScreenshotTest.kt b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/ScreenshotTest.kt
index 3586e47adb9faec3fb8f34869598768308ba8505..dc6901e09c6b7cd6f849c544fb321d8f2e60694b 100644
--- a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/ScreenshotTest.kt
+++ b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/ScreenshotTest.kt
@@ -18,22 +18,16 @@
 
 package org.briarproject.briar.desktop
 
-import androidx.compose.foundation.layout.Arrangement
-import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.padding
-import androidx.compose.material.Button
-import androidx.compose.material.Text
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.setValue
-import androidx.compose.ui.Modifier
 import androidx.compose.ui.test.InternalTestApi
 import androidx.compose.ui.test.junit4.DesktopComposeTestRule
 import androidx.compose.ui.test.junit4.createComposeRule
-import androidx.compose.ui.test.onNodeWithText
+import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.test.performClick
-import androidx.compose.ui.unit.dp
+import org.briarproject.bramble.BrambleCoreEagerSingletons
+import org.briarproject.bramble.api.plugin.TorConstants.DEFAULT_CONTROL_PORT
+import org.briarproject.bramble.api.plugin.TorConstants.DEFAULT_SOCKS_PORT
+import org.briarproject.briar.BriarCoreEagerSingletons
+import org.briarproject.briar.desktop.TestUtils.getDataDir
 import org.jetbrains.skia.Color
 import org.jetbrains.skia.Image
 import org.jetbrains.skia.Surface
@@ -50,24 +44,24 @@ class ScreenshotTest {
 
     @Test
     fun makeScreenshot() {
+        val dataDir = getDataDir()
+        val app =
+            DaggerBriarDesktopTestApp.builder().desktopCoreModule(
+                DesktopCoreModule(dataDir, DEFAULT_SOCKS_PORT, DEFAULT_CONTROL_PORT)
+            ).build()
+        // We need to load the eager singletons directly after making the
+        // dependency graphs
+        BrambleCoreEagerSingletons.Helper.injectEagerSingletons(app)
+        BriarCoreEagerSingletons.Helper.injectEagerSingletons(app)
+
+        val ui = app.getBriarUi()
+
         rule.setContent {
-            Column(
-                verticalArrangement = Arrangement.spacedBy(16.dp),
-                modifier = Modifier.padding(16.dp),
-            ) {
-                var greetingVisible by remember { mutableStateOf(false) }
-                if (greetingVisible) {
-                    Text("Hello!")
-                }
-                Button(onClick = { greetingVisible = true }) {
-                    Text("Show greeting")
-                }
-            }
+            ui.test()
         }
         rule.takeScreenshot("before-click.png")
-        rule
-            .onNodeWithText("Show greeting")
-            .performClick()
+        rule.onNodeWithTag("close_expiration").performClick()
+        rule.waitForIdle()
         rule.takeScreenshot("after-click.png")
     }
 }