diff options
| author | David Göransson <david.goransson@mullvad.net> | 2025-05-13 00:14:32 +0200 |
|---|---|---|
| committer | David Göransson <david.goransson@mullvad.net> | 2025-05-13 09:51:27 +0200 |
| commit | e10866a9e07ca806d72abb493b0083cab19f1753 (patch) | |
| tree | 42cd8cde7d2d34050ee998e5d671098abaae189d /android/test/common/src | |
| parent | 8ceea62b0b54a3eeed1651ee5d2c1944ed256067 (diff) | |
| download | mullvadvpn-e10866a9e07ca806d72abb493b0083cab19f1753.tar.xz mullvadvpn-e10866a9e07ca806d72abb493b0083cab19f1753.zip | |
Catch nullpointer
Diffstat (limited to 'android/test/common/src')
3 files changed, 18 insertions, 4 deletions
diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/extension/UiAutomatorExtensions.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/extension/UiAutomatorExtensions.kt index 11fc039be9..37c2283962 100644 --- a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/extension/UiAutomatorExtensions.kt +++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/extension/UiAutomatorExtensions.kt @@ -2,12 +2,14 @@ package net.mullvad.mullvadvpn.test.common.extension import androidx.test.uiautomator.By import androidx.test.uiautomator.BySelector +import androidx.test.uiautomator.StableResult import androidx.test.uiautomator.StaleObjectException import androidx.test.uiautomator.UiDevice import androidx.test.uiautomator.UiObject2 import androidx.test.uiautomator.UiObject2Condition import androidx.test.uiautomator.Until import androidx.test.uiautomator.waitForAppToBeVisible +import androidx.test.uiautomator.waitForStableInActiveWindow import co.touchlab.kermit.Logger import java.lang.Thread.sleep import java.util.regex.Pattern @@ -112,3 +114,15 @@ fun UiDevice.acceptVpnPermissionDialog() { findObjectWithTimeout(By.text("OK")).click() waitForAppToBeVisible(currentPackageName) } + +fun UiDevice.waitForStableInActiveWindowSafe(): StableResult? = + try { + // Wait for stable is not very stable, but it is our best best to wait for animation to + // settle. For now we will just catch the exception and sleep for a bit and hope for the + // best. + waitForStableInActiveWindow() + } catch (e: Exception) { + Logger.e("waitForStableInActiveWindow failed", e) + sleep(1000) + null + } diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/Page.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/Page.kt index c865fb0e50..e01ab6dec7 100644 --- a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/Page.kt +++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/Page.kt @@ -2,7 +2,7 @@ package net.mullvad.mullvadvpn.test.common.page import androidx.test.platform.app.InstrumentationRegistry import androidx.test.uiautomator.UiDevice -import androidx.test.uiautomator.waitForStableInActiveWindow +import net.mullvad.mullvadvpn.test.common.extension.waitForStableInActiveWindowSafe sealed class Page { val uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) @@ -14,7 +14,7 @@ inline fun <reified T : Page> on(scope: T.() -> Unit = {}) { val page = T::class.java.getConstructor().newInstance() // Wait for the screen to settle and so we don't proceed with actions too early. Otherwise, we // might start clicking on the screen before it is in a resumed state. - page.uiDevice.waitForStableInActiveWindow() + page.uiDevice.waitForStableInActiveWindowSafe() page.assertIsDisplayed() page.scope() diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/TooManyDevicesPage.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/TooManyDevicesPage.kt index 2f5f8c4133..39ad3cd83a 100644 --- a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/TooManyDevicesPage.kt +++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/TooManyDevicesPage.kt @@ -1,9 +1,9 @@ package net.mullvad.mullvadvpn.test.common.page import androidx.test.uiautomator.By -import androidx.test.uiautomator.waitForStableInActiveWindow import net.mullvad.mullvadvpn.test.common.extension.expectObjectToDisappearWithTimeout import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout +import net.mullvad.mullvadvpn.test.common.extension.waitForStableInActiveWindowSafe class TooManyDevicesPage internal constructor() : Page() { private val tooManyDevicesSelector = By.text("Too many devices") @@ -37,7 +37,7 @@ fun TooManyDevicesPage.removeDeviceFlow(deviceName: String) { clickRemoveDevice(deviceName) // Wait for the confirmation dialog to appear - uiDevice.waitForStableInActiveWindow() + uiDevice.waitForStableInActiveWindowSafe() // Confirm logout uiDevice.findObjectWithTimeout(By.text("Yes, log out device")).click() |
