tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 04f343bf04ce512276a27788ef21f06e995b9496
parent ca4f862d2acdced1b1949578540f428805bcd72c
Author: AndiAJ <andiaj@users.noreply.github.com>
Date:   Wed, 15 Oct 2025 06:52:52 +0000

Bug 1991819 - Fix failing extensions related UI tests r=aaronmt

This should fix the following UI tests:

verifyTheExtensionsMenuListAfterRemovingAnExtensionTest
verifyTheExtensionMenuListWhileExtensionsAreDisabledTest
verifyTheExtensionInstallationTest
In all 3 cases the main menu button displayed "No extension enabled" after installing some of the recommended extensions.
After taking a closer look, I've noticed that the name of certain extensions isn't displayed in the main menu after installation.

To overcome this inconsistency, I've removed those extensions from our list, and added a retry loop to install a recommended extension (this is needed in case all 3 recommended extensions that are being displayed in the main menu are those that don't get their name displayed after installation)

All 3 UI tests successfully passed 50x on Firebase ✅

Differential Revision: https://phabricator.services.mozilla.com/D268382

Diffstat:
Mmobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/helpers/Constants.kt | 14++++++--------
Mmobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/MainMenuTestCompose.kt | 12++++--------
Mmobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAddonsManagerRobot.kt | 39++++++++++++++++++++++++++++++++++-----
3 files changed, 44 insertions(+), 21 deletions(-)

diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/helpers/Constants.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/helpers/Constants.kt @@ -50,17 +50,17 @@ object Constants { ) } - // "Ghostery" not included in the list because of the name discrepancy - // between the recommended list and the install confirmation prompt + // Notes: + // "Ghostery" - not included in the list because of the name discrepancy between the recommended list and the install confirmation prompt + // "AdGuard AdBlocker" - not included in the list because of the inconsistencies caused by the new tab that is opened after installation + // "Video Background Play Fix", "FoxyProxy" and "Google Search Fixer" + // - not included because instead of the add-on name the main menu extensions button displays "No extensions enabled" + // and no name is being displayed in the installed "Extensions" list, only the add-on icon val recommendedAddons = listOf( "uBlock Origin", "Privacy Badger", - "AdGuard AdBlocker", "Dark Reader", "Bitwarden", - "Tampermonkey", - // FoxyProxy from the suggested extensions because it instead of the add-on name the main menu extensions button displays "Disabled" and no name is being displayed in the installed "Extensions" list, only the add-on icon - // "FoxyProxy", "NoScript", "Search by Image", "ClearURLs", @@ -69,8 +69,6 @@ object Constants { "Decentraleyes", "YouTube High Definition", "Web Archives", - "Video Background Play Fix", "Tomato Clock", - "Google Search Fixer", ) } diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/MainMenuTestCompose.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/MainMenuTestCompose.kt @@ -271,8 +271,7 @@ class MainMenuTestCompose : TestSetup() { }.openThreeDotMenu(composeTestRule) { verifyTryRecommendedExtensionButton() }.openExtensionsFromMainMenu { - recommendedExtensionTitle = getRecommendedExtensionTitle(composeTestRule) - installRecommendedAddon(recommendedExtensionTitle, composeTestRule) + recommendedExtensionTitle = installRecommendedAddon(composeTestRule) verifyAddonPermissionPrompt(recommendedExtensionTitle) acceptPermissionToInstallAddon() verifyAddonInstallCompletedPrompt( @@ -310,8 +309,7 @@ class MainMenuTestCompose : TestSetup() { }.openThreeDotMenu(composeTestRule) { verifyTryRecommendedExtensionButton() }.openExtensionsFromMainMenu { - recommendedExtensionTitle = getRecommendedExtensionTitle(composeTestRule) - installRecommendedAddon(recommendedExtensionTitle, composeTestRule) + recommendedExtensionTitle = installRecommendedAddon(composeTestRule) verifyAddonPermissionPrompt(recommendedExtensionTitle) acceptPermissionToInstallAddon() verifyAddonInstallCompletedPrompt( @@ -576,8 +574,7 @@ class MainMenuTestCompose : TestSetup() { }.openThreeDotMenu(composeTestRule) { verifyTryRecommendedExtensionButton() }.openExtensionsFromMainMenu { - recommendedExtensionTitle = getRecommendedExtensionTitle(composeTestRule) - installRecommendedAddon(recommendedExtensionTitle, composeTestRule) + recommendedExtensionTitle = installRecommendedAddon(composeTestRule) acceptPermissionToInstallAddon() verifyAddonInstallCompletedPrompt( recommendedExtensionTitle, @@ -782,8 +779,7 @@ class MainMenuTestCompose : TestSetup() { }.openThreeDotMenu(composeTestRule) { verifyTryRecommendedExtensionButton() }.openExtensionsFromMainMenu { - recommendedExtensionTitle = getRecommendedExtensionTitle(composeTestRule) - installRecommendedAddon(recommendedExtensionTitle, composeTestRule) + recommendedExtensionTitle = installRecommendedAddon(composeTestRule) acceptPermissionToInstallAddon() verifyAddonInstallCompletedPrompt( recommendedExtensionTitle, diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAddonsManagerRobot.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAddonsManagerRobot.kt @@ -45,6 +45,7 @@ import org.mozilla.fenix.components.menu.MenuDialogTestTag.WEB_EXTENSION_ITEM import org.mozilla.fenix.helpers.Constants.RETRY_COUNT import org.mozilla.fenix.helpers.Constants.TAG import org.mozilla.fenix.helpers.Constants.recommendedAddons +import org.mozilla.fenix.helpers.DataGenerationHelper.getRecommendedExtensionTitle import org.mozilla.fenix.helpers.DataGenerationHelper.getStringResource import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.MatcherHelper.assertUIObjectExists @@ -380,11 +381,39 @@ class SettingsSubMenuAddonsManagerRobot { } } - fun installRecommendedAddon(recommendedExtensionTitle: String, composeTestRule: ComposeTestRule) { - waitForAppWindowToBeUpdated() - Log.i(TAG, "installARecommendedAddons: Trying to click addon: $recommendedExtensionTitle install button") - composeTestRule.onNodeWithContentDescription("Add $recommendedExtensionTitle", substring = true).performClick() - Log.i(TAG, "installARecommendedAddons: Clicked addon: $recommendedExtensionTitle install button") + fun installRecommendedAddon(composeTestRule: ComposeTestRule): String { + var recommendedExtensionTitle = "" + + repeat(RETRY_COUNT) { i -> + val attempt = i + 1 + Log.i(TAG, "installRecommendedAddon: Started try #$attempt") + try { + recommendedExtensionTitle = getRecommendedExtensionTitle(composeTestRule) + waitForAppWindowToBeUpdated() + Log.i(TAG, "installRecommendedAddon: Trying to click addon: $recommendedExtensionTitle install button") + composeTestRule.onNodeWithContentDescription("Add $recommendedExtensionTitle", substring = true).performClick() + Log.i(TAG, "installRecommendedAddon: Clicked addon: $recommendedExtensionTitle install button") + + return recommendedExtensionTitle + } catch (e: AssertionError) { + Log.i(TAG, "installRecommendedAddon: AssertionError caught, executing fallback methods") + if (attempt == RETRY_COUNT) { + throw e + } else { + Log.i(TAG, "installRecommendedAddon: Trying to click device back button to dismiss the main menu") + mDevice.pressBack() + Log.i(TAG, "installRecommendedAddon: Clicked device back button to dismiss the main menu") + waitForAppWindowToBeUpdated() + browserScreen { + }.openThreeDotMenu(composeTestRule) { + verifyTryRecommendedExtensionButton() + }.openExtensionsFromMainMenu { + recommendedExtensionTitle = getRecommendedExtensionTitle(composeTestRule) + } + } + } + } + return recommendedExtensionTitle } fun verifyManageExtensionsButtonFromRedesignedMainMenu(composeTestRule: ComposeTestRule, isDisplayed: Boolean) {