From 81f59f08f719b2c903a3e5caf49354a6841e2636 Mon Sep 17 00:00:00 2001 From: Jos Date: Wed, 17 Jul 2024 18:44:19 +0800 Subject: [PATCH 01/14] click on android identifier instead of string identifier --- .../android/e2e/screens/mystore/settings/SettingsScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/screens/mystore/settings/SettingsScreen.kt b/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/screens/mystore/settings/SettingsScreen.kt index 4eb2eea0f16..ab5f40e1b03 100644 --- a/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/screens/mystore/settings/SettingsScreen.kt +++ b/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/screens/mystore/settings/SettingsScreen.kt @@ -62,6 +62,6 @@ class SettingsScreen : Screen { // Confirm Log Out waitForElementToBeDisplayed(android.R.id.button1) // sign out button is an Android system resources identifier - clickButtonInDialogWithTitle(R.string.signout) + clickOn(android.R.id.button1) } } From 3109ddac11b1399bbfae4046d6be96ee5ceecadb Mon Sep 17 00:00:00 2001 From: Jos Date: Wed, 17 Jul 2024 19:08:27 +0800 Subject: [PATCH 02/14] re-add tablet step --- .buildkite/pipeline.yml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index a866ab04ca5..e2b5303b25c 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -96,7 +96,7 @@ steps: ./gradlew assembleJalapenoDebugAndroidTest plugins: [$CI_TOOLKIT] - - label: "Instrumented tests" + - label: "Instrumented tests - Phone" command: .buildkite/commands/run-instrumented-tests.sh "Pixel2.arm" "30" "portrait" plugins: - $CI_TOOLKIT @@ -104,4 +104,14 @@ steps: <<: *test_collector_common_params api-token-env-name: "BUILDKITE_ANALYTICS_TOKEN_INSTRUMENTED_TESTS" artifact_paths: - - "**/build/instrumented-tests/**/*" + - "**/build/instrumented-tests-phone/**/*" + + - label: "Instrumented tests - Tablet" + command: .buildkite/commands/run-instrumented-tests.sh "MediumTablet.arm" "32" "landscape" + plugins: + - $CI_TOOLKIT + - $TEST_COLLECTOR : + <<: *test_collector_common_params + api-token-env-name: "BUILDKITE_ANALYTICS_TOKEN_INSTRUMENTED_TESTS_TABLET" + artifact_paths: + - "**/build/instrumented-tests-tablet/**/*" From 17ab1833d42a2ae57eca7eaf1148828a01fc9cd8 Mon Sep 17 00:00:00 2001 From: Jos Date: Thu, 18 Jul 2024 10:46:49 +0800 Subject: [PATCH 03/14] ensure that button is enabled before clicking --- .../kotlin/com/woocommerce/android/e2e/helpers/util/Screen.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/helpers/util/Screen.kt b/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/helpers/util/Screen.kt index 7b75333ea3b..80d4fec6d5e 100644 --- a/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/helpers/util/Screen.kt +++ b/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/helpers/util/Screen.kt @@ -170,6 +170,10 @@ open class Screen { fun clickOn(elementID: Int) { waitForElementToBeDisplayed(elementID) + onView(withId(elementID)) + .check(matches(isDisplayed())) + .check(matches(isEnabled())) // check that element is clickable + clickOn(onView(withId(elementID))) idleFor(500) // allow for transitions } From 9bfa8fe203d4ee161070cd93999b2d3f145546d3 Mon Sep 17 00:00:00 2001 From: Jos Date: Thu, 18 Jul 2024 11:17:12 +0800 Subject: [PATCH 04/14] empty commit for testing From 0d956b9ca29f6aea1a9744809aec78a39d8f48dc Mon Sep 17 00:00:00 2001 From: Jos Date: Thu, 18 Jul 2024 11:41:40 +0800 Subject: [PATCH 05/14] empty commit for testing From 6a50a832a7572182a5a2fc8048605b4c455810e1 Mon Sep 17 00:00:00 2001 From: Jos Date: Thu, 18 Jul 2024 12:05:30 +0800 Subject: [PATCH 06/14] empty commit for testing From 5b1105788cc43c7052e5dd1e2c2ce254f45ae2cd Mon Sep 17 00:00:00 2001 From: Jos Date: Thu, 18 Jul 2024 14:39:22 +0800 Subject: [PATCH 07/14] wait for login button to be displayed after logout --- .../android/e2e/screens/mystore/settings/SettingsScreen.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/screens/mystore/settings/SettingsScreen.kt b/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/screens/mystore/settings/SettingsScreen.kt index ab5f40e1b03..04a2c50dfac 100644 --- a/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/screens/mystore/settings/SettingsScreen.kt +++ b/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/screens/mystore/settings/SettingsScreen.kt @@ -63,5 +63,6 @@ class SettingsScreen : Screen { // Confirm Log Out waitForElementToBeDisplayed(android.R.id.button1) // sign out button is an Android system resources identifier clickOn(android.R.id.button1) + waitForElementToBeDisplayed((R.id.button_login_store)) // login screen should be displayed after logging out } } From 9792ab0237f3c8d314134cc3ec4c0805e15e5ae0 Mon Sep 17 00:00:00 2001 From: Jos Date: Thu, 18 Jul 2024 16:22:29 +0800 Subject: [PATCH 08/14] add retry action to handle log out --- .../mystore/settings/SettingsScreen.kt | 33 ++++++++++++++++--- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/screens/mystore/settings/SettingsScreen.kt b/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/screens/mystore/settings/SettingsScreen.kt index 04a2c50dfac..064ffbd9c7b 100644 --- a/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/screens/mystore/settings/SettingsScreen.kt +++ b/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/screens/mystore/settings/SettingsScreen.kt @@ -8,6 +8,7 @@ import com.woocommerce.android.R import com.woocommerce.android.e2e.helpers.util.NestedScrollViewExtension import com.woocommerce.android.e2e.helpers.util.Screen import com.woocommerce.android.e2e.screens.moremenu.MoreMenuScreen +import org.junit.Assert class SettingsScreen : Screen { // Using HELP_BUTTON even if we don't need to interact with it because for some reason Espresso can't find @@ -57,12 +58,34 @@ class SettingsScreen : Screen { Espresso.onView(ViewMatchers.withId(R.id.btn_option_logout)).perform(NestedScrollViewExtension()) } - waitForElementToBeDisplayed(R.id.btn_option_logout) - clickOn(R.id.btn_option_logout) + // retry in case log out pop up doesn't work the first time + retryAction({ + // click log out menu item + waitForElementToBeDisplayed(R.id.btn_option_logout) + clickOn(R.id.btn_option_logout) + + // confirm log out action + waitForElementToBeDisplayed(android.R.id.button1) // sign out button is an Android system resources identifier + clickOn(android.R.id.button1) + }) - // Confirm Log Out - waitForElementToBeDisplayed(android.R.id.button1) // sign out button is an Android system resources identifier - clickOn(android.R.id.button1) waitForElementToBeDisplayed((R.id.button_login_store)) // login screen should be displayed after logging out } + + private fun retryAction(action: () -> Unit, maxAttempts: Int = 3) { + var attempts = 0 + var success = false + while (!success && attempts < maxAttempts) { + try { + action() + success = true + } catch (e: Exception) { + Thread.sleep(1000) // Wait for 1 second before retrying + attempts++ + } + } + if (!success) { + Assert.fail("Failed to perform action after $maxAttempts attempts") + } + } } From fba63c661c6111811ad21cf9f4a6921babd8196c Mon Sep 17 00:00:00 2001 From: Jos Date: Thu, 18 Jul 2024 16:52:18 +0800 Subject: [PATCH 09/14] fix detekt errors --- .../e2e/screens/mystore/settings/SettingsScreen.kt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/screens/mystore/settings/SettingsScreen.kt b/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/screens/mystore/settings/SettingsScreen.kt index 064ffbd9c7b..a3cb6a788c8 100644 --- a/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/screens/mystore/settings/SettingsScreen.kt +++ b/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/screens/mystore/settings/SettingsScreen.kt @@ -65,27 +65,31 @@ class SettingsScreen : Screen { clickOn(R.id.btn_option_logout) // confirm log out action - waitForElementToBeDisplayed(android.R.id.button1) // sign out button is an Android system resources identifier + // sign out button is an Android system resources identifier + waitForElementToBeDisplayed(android.R.id.button1) clickOn(android.R.id.button1) }) - waitForElementToBeDisplayed((R.id.button_login_store)) // login screen should be displayed after logging out + // login screen should be displayed after logging out + waitForElementToBeDisplayed((R.id.button_login_store)) } private fun retryAction(action: () -> Unit, maxAttempts: Int = 3) { var attempts = 0 var success = false + var lastError: AssertionError? = null while (!success && attempts < maxAttempts) { try { action() success = true - } catch (e: Exception) { + } catch (e: AssertionError) { + lastError = e // Capture the last AssertionError Thread.sleep(1000) // Wait for 1 second before retrying attempts++ } } if (!success) { - Assert.fail("Failed to perform action after $maxAttempts attempts") + Assert.fail("Failed to perform action after $maxAttempts attempts with error $lastError") } } } From 40068312aaf199c5aa7576f7afc3d35f6910bcc7 Mon Sep 17 00:00:00 2001 From: Jos Date: Thu, 18 Jul 2024 17:42:24 +0800 Subject: [PATCH 10/14] empty commit for testing From d88667f1268e5264f164179ff9eb2f442c9c684d Mon Sep 17 00:00:00 2001 From: Jos Date: Thu, 18 Jul 2024 18:12:21 +0800 Subject: [PATCH 11/14] revert change on clickOn() --- .../kotlin/com/woocommerce/android/e2e/helpers/util/Screen.kt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/helpers/util/Screen.kt b/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/helpers/util/Screen.kt index 80d4fec6d5e..7b75333ea3b 100644 --- a/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/helpers/util/Screen.kt +++ b/WooCommerce/src/androidTest/kotlin/com/woocommerce/android/e2e/helpers/util/Screen.kt @@ -170,10 +170,6 @@ open class Screen { fun clickOn(elementID: Int) { waitForElementToBeDisplayed(elementID) - onView(withId(elementID)) - .check(matches(isDisplayed())) - .check(matches(isEnabled())) // check that element is clickable - clickOn(onView(withId(elementID))) idleFor(500) // allow for transitions } From b38eff120ece127776d567e2645ce4c71f862a51 Mon Sep 17 00:00:00 2001 From: Jos Date: Fri, 19 Jul 2024 10:16:48 +0800 Subject: [PATCH 12/14] empty commit for testing From 023a698422ffd482453fc7c44c9fc2ca9e8fb57f Mon Sep 17 00:00:00 2001 From: Jos Date: Fri, 19 Jul 2024 11:22:58 +0800 Subject: [PATCH 13/14] add tablet into devices list --- .buildkite/pipeline.yml | 7 +++++++ WooCommerce/build.gradle | 3 ++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 11c235335cd..cb56d397c6f 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -98,3 +98,10 @@ steps: - label: "Instrumented tests" command: .buildkite/commands/run-instrumented-tests.sh + plugins: + - $CI_TOOLKIT + - $TEST_COLLECTOR: + <<: *test_collector_common_params + api-token-env-name: "BUILDKITE_ANALYTICS_TOKEN_INSTRUMENTED_TESTS" + artifact_paths: + - "**/build/instrumented-tests/**/*" diff --git a/WooCommerce/build.gradle b/WooCommerce/build.gradle index b022c27933f..b9a693dd296 100644 --- a/WooCommerce/build.gradle +++ b/WooCommerce/build.gradle @@ -23,7 +23,8 @@ fladle { "notPackage com.woocommerce.android.e2e.tests.screenshot" ] devices = [ - [ "model": "Pixel2.arm", "version": "30" ] + [ "model": "Pixel2.arm", "version": "30" ], + [ "model": "MediumTablet.arm", "version": "32", orientation: "landscape" ] ] localResultsDir = "$rootDir/build/instrumented-tests" From 32b8f43a2d34c4f0a6145c6f017e126a4baee60b Mon Sep 17 00:00:00 2001 From: Jos Date: Fri, 19 Jul 2024 11:46:45 +0800 Subject: [PATCH 14/14] empty commit for testing