/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.mozilla.fenix.ui import android.os.Build import android.view.autofill.AutofillManager import androidx.core.net.toUri import org.junit.Before import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.MatcherHelper import org.mozilla.fenix.helpers.MatcherHelper.itemWithResId import org.mozilla.fenix.helpers.MatcherHelper.itemWithResIdAndText import org.mozilla.fenix.helpers.MatcherHelper.itemWithText import org.mozilla.fenix.helpers.TestAssetHelper import org.mozilla.fenix.helpers.TestHelper import org.mozilla.fenix.helpers.TestHelper.exitMenu import org.mozilla.fenix.helpers.TestHelper.mDevice import org.mozilla.fenix.helpers.TestHelper.packageName import org.mozilla.fenix.helpers.TestHelper.restartApp import org.mozilla.fenix.helpers.TestHelper.scrollToElementByText import org.mozilla.fenix.helpers.TestHelper.verifySnackBarText import org.mozilla.fenix.helpers.TestHelper.waitForAppWindowToBeUpdated import org.mozilla.fenix.helpers.TestSetup import org.mozilla.fenix.ui.robots.browserScreen import org.mozilla.fenix.ui.robots.clearTextFieldItem import org.mozilla.fenix.ui.robots.clickPageObject import org.mozilla.fenix.ui.robots.homeScreen import org.mozilla.fenix.ui.robots.navigationToolbar import org.mozilla.fenix.ui.robots.setPageObjectText /** * Tests for verifying: * - the Logins and Passwords menu and sub-menus. * - save login prompts. * - saving logins based on the user's preferences. */ class LoginsTest : TestSetup() { @get:Rule val activityTestRule = HomeActivityIntentTestRule.withDefaultSettingsOverrides(skipOnboarding = true) @Before override fun setUp() { super.setUp() if (Build.VERSION.SDK_INT == Build.VERSION_CODES.R) { val autofillManager: AutofillManager = TestHelper.appContext.getSystemService(AutofillManager::class.java) autofillManager.disableAutofillServices() } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2092713 // Tests the Passwords menu items and default values @Test fun loginsAndPasswordsSettingsItemsTest() { homeScreen { }.openThreeDotMenu { }.openSettings { // Necessary to scroll a little bit for all screen sizes scrollToElementByText("Passwords") }.openLoginsAndPasswordSubMenu { verifyDefaultView() verifyAutofillInFirefoxToggle(true) verifyAutofillLoginsInOtherAppsToggle(false) } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/517816 // Tests only for initial state without signing in. // For tests after signing in, see SyncIntegration test suite @Test fun verifySavedLoginsListTest() { homeScreen { }.openThreeDotMenu { }.openSettings { // Necessary to scroll a little bit for all screen sizes scrollToElementByText("Passwords") }.openLoginsAndPasswordSubMenu { verifyDefaultView() }.openSavedLogins { verifySecurityPromptForLogins() tapSetupLater() // Verify that logins list is empty verifyEmptySavedLoginsListView() } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2092925 @Test fun verifySyncLoginsOptionsTest() { homeScreen { }.openThreeDotMenu { }.openSettings { // Necessary to scroll a little bit for all screen sizes scrollToElementByText("Passwords") }.openLoginsAndPasswordSubMenu { }.openSyncLogins { verifyReadyToScanOption() verifyUseEmailOption() } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/523839 @Test fun saveLoginFromPromptTest() { val saveLoginTest = TestAssetHelper.getSaveLoginAsset(mockWebServer) homeScreen { }.openThreeDotMenu { }.openSettings { }.openLoginsAndPasswordSubMenu { }.openSaveLoginsAndPasswordsOptions { verifySaveLoginsOptionsView() } exitMenu() navigationToolbar { }.enterURLAndEnterToBrowser(saveLoginTest.url) { clickSubmitLoginButton() verifySaveLoginPromptIsDisplayed() // Click save to save the login clickPageObject(itemWithText("Save")) } browserScreen { }.openThreeDotMenu { }.openSettings { scrollToElementByText("Passwords") }.openLoginsAndPasswordSubMenu { verifyDefaultView() }.openSavedLogins { verifySecurityPromptForLogins() tapSetupLater() // Verify that the login appears correctly verifySavedLoginsSectionUsername("test@example.com") } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/960412 @Test fun openLoginWebsiteInBrowserTest() { val loginPage = "https://mozilla-mobile.github.io/testapp/loginForm" val originWebsite = "mozilla-mobile.github.io" val userName = "test" val password = "pass" navigationToolbar { }.enterURLAndEnterToBrowser(loginPage.toUri()) { setPageObjectText(itemWithResId("username"), userName) setPageObjectText(itemWithResId("password"), password) clickPageObject(itemWithResId("submit")) verifySaveLoginPromptIsDisplayed() clickPageObject(itemWithText("Save")) mDevice.waitForIdle() }.openThreeDotMenu { }.openSettings { }.openLoginsAndPasswordSubMenu { }.openSavedLogins { verifySecurityPromptForLogins() tapSetupLater() viewSavedLoginDetails(userName) }.goToSavedWebsite { verifyUrl(originWebsite) } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/517817 @Test fun neverSaveLoginFromPromptTest() { val saveLoginTest = TestAssetHelper.getSaveLoginAsset(mockWebServer) navigationToolbar { }.enterURLAndEnterToBrowser(saveLoginTest.url) { clickSubmitLoginButton() // Don't save the login, add to exceptions clickPageObject(itemWithText("Never save")) mDevice.waitForIdle() }.openThreeDotMenu { }.openSettings { }.openLoginsAndPasswordSubMenu { verifyDefaultView() }.openSavedLogins { verifySecurityPromptForLogins() tapSetupLater() // Verify that the login list is empty verifyEmptySavedLoginsListView() verifyNotSavedLoginFromPrompt() }.goBack { }.openLoginExceptions { // Verify localhost was added to exceptions list verifyLocalhostExceptionAdded() } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1508171 @SmokeTest @Test fun verifyUpdatedLoginIsSavedTest() { val saveLoginTest = TestAssetHelper.getSaveLoginAsset(mockWebServer) navigationToolbar { }.enterURLAndEnterToBrowser(saveLoginTest.url) { clickSubmitLoginButton() verifySaveLoginPromptIsDisplayed() // Click Save to save the login clickPageObject(itemWithText("Save")) }.openNavigationToolbar { }.enterURLAndEnterToBrowser(saveLoginTest.url) { enterPassword("test") mDevice.waitForIdle() clickSubmitLoginButton() verifySaveLoginPromptIsDisplayed() // Click Update to change the saved password clickPageObject(itemWithText("Update")) }.openThreeDotMenu { }.openSettings { scrollToElementByText("Passwords") }.openLoginsAndPasswordSubMenu { }.openSavedLogins { verifySecurityPromptForLogins() tapSetupLater() // Verify that the login appears correctly verifySavedLoginsSectionUsername("test@example.com") viewSavedLoginDetails("test@example.com") revealPassword() verifyPasswordSaved("test") // failing here locally } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1049971 @SmokeTest @Test fun verifyMultipleLoginsSelectionsTest() { val loginPage = "https://mozilla-mobile.github.io/testapp/v2.0/loginForm.html" val firstUser = "mozilla" val firstPass = "firefox" val secondUser = "fenix" val secondPass = "pass" navigationToolbar { }.enterURLAndEnterToBrowser(loginPage.toUri()) { setPageObjectText(itemWithResId("username"), firstUser) waitForAppWindowToBeUpdated() setPageObjectText(itemWithResId("password"), firstPass) waitForAppWindowToBeUpdated() clickPageObject(itemWithResId("submit")) verifySaveLoginPromptIsDisplayed() clickPageObject(itemWithText("Save")) setPageObjectText(itemWithResId("username"), secondUser) waitForAppWindowToBeUpdated() setPageObjectText(itemWithResId("password"), secondPass) waitForAppWindowToBeUpdated() clickPageObject(itemWithResId("submit")) verifySaveLoginPromptIsDisplayed() clickPageObject(itemWithText("Save")) clearTextFieldItem(itemWithResId("username")) clickSuggestedLoginsButton() verifySuggestedUserName(firstUser) verifySuggestedUserName(secondUser) clickPageObject( itemWithResIdAndText( "$packageName:id/username", firstUser, ), ) clickPageObject(itemWithResId("togglePassword")) verifyPrefilledLoginCredentials(firstUser, firstPass, true) } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/875849 @Test fun verifyEditLoginsViewTest() { val loginPage = "https://mozilla-mobile.github.io/testapp/loginForm" val originWebsite = "mozilla-mobile.github.io" navigationToolbar { }.enterURLAndEnterToBrowser(loginPage.toUri()) { setPageObjectText(itemWithResId("username"), "mozilla") setPageObjectText(itemWithResId("password"), "firefox") clickPageObject(itemWithResId("submit")) verifySaveLoginPromptIsDisplayed() clickPageObject(itemWithText("Save")) mDevice.waitForIdle() }.openThreeDotMenu { }.openSettings { }.openLoginsAndPasswordSubMenu { }.openSavedLogins { tapSetupLater() viewSavedLoginDetails(originWebsite) clickThreeDotButton(activityTestRule) clickEditLoginButton() setNewPassword("fenix") saveEditedLogin() revealPassword() verifyPasswordSaved("fenix") } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/875851 @Test fun verifyEditedLoginsAreSavedTest() { val loginPage = "https://mozilla-mobile.github.io/testapp/v2.0/loginForm.html" val originWebsite = "mozilla-mobile.github.io" navigationToolbar { }.enterURLAndEnterToBrowser(loginPage.toUri()) { setPageObjectText(itemWithResId("username"), "mozilla") setPageObjectText(itemWithResId("password"), "firefox") clickPageObject(itemWithResId("submit")) verifySaveLoginPromptIsDisplayed() clickPageObject(itemWithText("Save")) mDevice.waitForIdle() }.openThreeDotMenu { }.openSettings { }.openLoginsAndPasswordSubMenu { }.openSavedLogins { tapSetupLater() viewSavedLoginDetails(originWebsite) clickThreeDotButton(activityTestRule) clickEditLoginButton() setNewUserName("android") setNewPassword("fenix") saveEditedLogin() } exitMenu() browserScreen { }.openThreeDotMenu { }.refreshPage { waitForPageToLoad() clickPageObject(itemWithResId("togglePassword")) verifyPrefilledLoginCredentials("android", "fenix", true) } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2266452 @Test fun verifyLoginWithNoUserNameCanNotBeSavedTest() { val loginPage = "https://mozilla-mobile.github.io/testapp/loginForm" val originWebsite = "mozilla-mobile.github.io" navigationToolbar { }.enterURLAndEnterToBrowser(loginPage.toUri()) { setPageObjectText(itemWithResId("username"), "mozilla") setPageObjectText(itemWithResId("password"), "firefox") clickPageObject(itemWithResId("submit")) verifySaveLoginPromptIsDisplayed() clickPageObject(itemWithText("Save")) mDevice.waitForIdle() }.openThreeDotMenu { }.openSettings { }.openLoginsAndPasswordSubMenu { }.openSavedLogins { tapSetupLater() viewSavedLoginDetails(originWebsite) clickThreeDotButton(activityTestRule) clickEditLoginButton() clickClearUserNameButton() verifyUserNameRequiredErrorMessage() verifySaveLoginButtonIsEnabled(false) clickGoBackButton() verifyLoginItemUsername("mozilla") } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2266453 @Test fun verifyLoginWithoutPasswordCanNotBeSavedTest() { val loginPage = "https://mozilla-mobile.github.io/testapp/loginForm" val originWebsite = "mozilla-mobile.github.io" navigationToolbar { }.enterURLAndEnterToBrowser(loginPage.toUri()) { setPageObjectText(itemWithResId("username"), "mozilla") setPageObjectText(itemWithResId("password"), "firefox") clickPageObject(itemWithResId("submit")) verifySaveLoginPromptIsDisplayed() clickPageObject(itemWithText("Save")) mDevice.waitForIdle() }.openThreeDotMenu { }.openSettings { }.openLoginsAndPasswordSubMenu { }.openSavedLogins { tapSetupLater() viewSavedLoginDetails(originWebsite) clickThreeDotButton(activityTestRule) clickEditLoginButton() clickClearPasswordButton() verifyPasswordRequiredErrorMessage() verifySaveLoginButtonIsEnabled(false) clickGoBackButton() revealPassword() verifyPasswordSaved("firefox") } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/876531 @Test fun verifyEditModeDismissalDoesNotSaveLoginCredentialsTest() { val loginPage = "https://mozilla-mobile.github.io/testapp/loginForm" val originWebsite = "mozilla-mobile.github.io" navigationToolbar { }.enterURLAndEnterToBrowser(loginPage.toUri()) { setPageObjectText(itemWithResId("username"), "mozilla") setPageObjectText(itemWithResId("password"), "firefox") clickPageObject(itemWithResId("submit")) verifySaveLoginPromptIsDisplayed() clickPageObject(itemWithText("Save")) mDevice.waitForIdle() }.openThreeDotMenu { }.openSettings { }.openLoginsAndPasswordSubMenu { }.openSavedLogins { tapSetupLater() viewSavedLoginDetails(originWebsite) clickThreeDotButton(activityTestRule) clickEditLoginButton() setNewUserName("android") setNewPassword("fenix") clickGoBackButton() verifyLoginItemUsername("mozilla") revealPassword() verifyPasswordSaved("firefox") } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/876532 @Test fun verifyDeleteLoginButtonTest() { val loginPage = TestAssetHelper.getSaveLoginAsset(mockWebServer) navigationToolbar { }.enterURLAndEnterToBrowser(loginPage.url) { clickSubmitLoginButton() clickPageObject(itemWithText("Save")) mDevice.waitForIdle() }.openThreeDotMenu { }.openSettings { }.openLoginsAndPasswordSubMenu { }.openSavedLogins { tapSetupLater() viewSavedLoginDetails("test@example.com") clickThreeDotButton(activityTestRule) clickDeleteLoginButton() verifyLoginDeletionPrompt() clickCancelDeleteLogin() verifyLoginItemUsername("test@example.com") viewSavedLoginDetails("test@example.com") clickThreeDotButton(activityTestRule) clickDeleteLoginButton() verifyLoginDeletionPrompt() clickConfirmDeleteLogin() // The account remains displayed, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1812431 // verifyNotSavedLoginFromPrompt() } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/517818 @SmokeTest @Test fun verifyNeverSaveLoginOptionTest() { val loginPage = TestAssetHelper.getSaveLoginAsset(mockWebServer) homeScreen { }.openThreeDotMenu { }.openSettings { }.openLoginsAndPasswordSubMenu { }.openSaveLoginsAndPasswordsOptions { clickNeverSaveOption() }.goBack { } exitMenu() navigationToolbar { }.enterURLAndEnterToBrowser(loginPage.url) { clickSubmitLoginButton() verifySaveLoginPromptIsNotDisplayed() } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/517819 @Test fun verifyAutofillToggleTest() { val loginPage = "https://mozilla-mobile.github.io/testapp/v2.0/loginForm.html" navigationToolbar { }.enterURLAndEnterToBrowser(loginPage.toUri()) { waitForPageToLoad() setPageObjectText(itemWithResId("username"), "mozilla") waitForAppWindowToBeUpdated() setPageObjectText(itemWithResId("password"), "firefox") waitForAppWindowToBeUpdated() clickPageObject(itemWithResId("submit")) waitForPageToLoad() verifySaveLoginPromptIsDisplayed() clickPageObject(itemWithText("Save")) }.openTabDrawer { closeTab() } navigationToolbar { }.enterURLAndEnterToBrowser(loginPage.toUri()) { waitForPageToLoad() clickPageObject(itemWithResId("togglePassword")) verifyPrefilledLoginCredentials("mozilla", "firefox", true) }.openTabDrawer { closeTab() } homeScreen { }.openThreeDotMenu { }.openSettings { }.openLoginsAndPasswordSubMenu { verifyAutofillInFirefoxToggle(true) clickAutofillInFirefoxOption() verifyAutofillInFirefoxToggle(false) }.goBack { } exitMenu() navigationToolbar { }.enterURLAndEnterToBrowser(loginPage.toUri()) { verifyPrefilledLoginCredentials("mozilla", "firefox", false) } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/593768 @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1812995") @Test fun doNotSaveOptionWillNotUpdateALoginTest() { val loginPage = "https://mozilla-mobile.github.io/testapp/v2.0/loginForm.html" val originWebsite = "mozilla-mobile.github.io" navigationToolbar { }.enterURLAndEnterToBrowser(loginPage.toUri()) { setPageObjectText(itemWithResId("username"), "mozilla") setPageObjectText(itemWithResId("password"), "firefox") clickPageObject(itemWithResId("submit")) verifySaveLoginPromptIsDisplayed() clickPageObject(itemWithText("Save")) }.openTabDrawer { closeTab() } navigationToolbar { }.enterURLAndEnterToBrowser(loginPage.toUri()) { clickPageObject(itemWithResId("togglePassword")) setPageObjectText(itemWithResId("username"), "mozilla") setPageObjectText(itemWithResId("password"), "fenix") clickPageObject(itemWithResId("submit")) verifySaveLoginPromptIsDisplayed() clickPageObject(itemWithText("Don’t update")) }.openThreeDotMenu { }.openSettings { }.openLoginsAndPasswordSubMenu { }.openSavedLogins { tapSetupLater() viewSavedLoginDetails(originWebsite) revealPassword() verifyPasswordSaved("firefox") } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2090455 @Test fun searchLoginsByUsernameTest() { val firstLoginPage = TestAssetHelper.getSaveLoginAsset(mockWebServer) val secondLoginPage = "https://mozilla-mobile.github.io/testapp/v2.0/loginForm.html" val originWebsite = "mozilla-mobile.github.io" navigationToolbar { }.enterURLAndEnterToBrowser(firstLoginPage.url) { clickSubmitLoginButton() verifySaveLoginPromptIsDisplayed() clickPageObject(itemWithText("Save")) }.openNavigationToolbar { }.enterURLAndEnterToBrowser(secondLoginPage.toUri()) { setPageObjectText(itemWithResId("username"), "android") setPageObjectText(itemWithResId("password"), "firefox") clickPageObject(itemWithResId("submit")) verifySaveLoginPromptIsDisplayed() clickPageObject(itemWithText("Save")) }.openThreeDotMenu { }.openSettings { }.openLoginsAndPasswordSubMenu { }.openSavedLogins { tapSetupLater() clickSearchLoginButton() searchLogin("ANDROID") viewSavedLoginDetails(originWebsite) verifyLoginItemUsername("android") revealPassword() verifyPasswordSaved("firefox") }.goBackToSavedLogins { searchLogin("android") viewSavedLoginDetails(originWebsite) verifyLoginItemUsername("android") revealPassword() verifyPasswordSaved("firefox") }.goBackToSavedLogins { searchLogin("AnDrOiD") viewSavedLoginDetails(originWebsite) verifyLoginItemUsername("android") revealPassword() verifyPasswordSaved("firefox") } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/608834 @Test fun searchLoginsByUrlTest() { val firstLoginPage = TestAssetHelper.getSaveLoginAsset(mockWebServer) val secondLoginPage = "https://mozilla-mobile.github.io/testapp/v2.0/loginForm.html" val originWebsite = "mozilla-mobile.github.io" navigationToolbar { }.enterURLAndEnterToBrowser(firstLoginPage.url) { clickSubmitLoginButton() verifySaveLoginPromptIsDisplayed() clickPageObject(itemWithText("Save")) }.openNavigationToolbar { }.enterURLAndEnterToBrowser(secondLoginPage.toUri()) { setPageObjectText(itemWithResId("username"), "android") setPageObjectText(itemWithResId("password"), "firefox") clickPageObject(itemWithResId("submit")) verifySaveLoginPromptIsDisplayed() clickPageObject(itemWithText("Save")) }.openThreeDotMenu { }.openSettings { }.openLoginsAndPasswordSubMenu { }.openSavedLogins { tapSetupLater() clickSearchLoginButton() searchLogin("MOZILLA") viewSavedLoginDetails(originWebsite) verifyLoginItemUsername("android") revealPassword() verifyPasswordSaved("firefox") }.goBackToSavedLogins { searchLogin("mozilla") viewSavedLoginDetails(originWebsite) verifyLoginItemUsername("android") revealPassword() verifyPasswordSaved("firefox") }.goBackToSavedLogins { searchLogin("MoZiLlA") viewSavedLoginDetails(originWebsite) verifyLoginItemUsername("android") revealPassword() verifyPasswordSaved("firefox") } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2266441 @Test fun verifyLastUsedLoginSortingOptionTest() { val firstLoginPage = TestAssetHelper.getSaveLoginAsset(mockWebServer) val secondLoginPage = "https://mozilla-mobile.github.io/testapp/v2.0/loginForm.html" val originWebsite = "mozilla-mobile.github.io" navigationToolbar { }.enterURLAndEnterToBrowser(firstLoginPage.url) { clickSubmitLoginButton() verifySaveLoginPromptIsDisplayed() clickPageObject(itemWithText("Save")) }.openNavigationToolbar { }.enterURLAndEnterToBrowser(secondLoginPage.toUri()) { setPageObjectText(itemWithResId("username"), "mozilla") setPageObjectText(itemWithResId("password"), "firefox") clickPageObject(itemWithResId("submit")) verifySaveLoginPromptIsDisplayed() clickPageObject(itemWithText("Save")) }.openThreeDotMenu { }.openSettings { }.openLoginsAndPasswordSubMenu { }.openSavedLogins { tapSetupLater() clickSavedLoginsChevronIcon() verifyLoginsSortingOptions() clickLastUsedSortingOption() verifySortedLogin(0, originWebsite) verifySortedLogin(1, firstLoginPage.url.authority.toString()) }.goBack { }.openSavedLogins { verifySortedLogin(0, originWebsite) verifySortedLogin(1, firstLoginPage.url.authority.toString()) } restartApp(activityTestRule) browserScreen { }.openThreeDotMenu { }.openSettings { }.openLoginsAndPasswordSubMenu { }.openSavedLogins { verifySortedLogin(0, originWebsite) verifySortedLogin(1, firstLoginPage.url.authority.toString()) } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2266442 @Test fun verifyAlphabeticalLoginSortingOptionTest() { val firstLoginPage = TestAssetHelper.getSaveLoginAsset(mockWebServer) val secondLoginPage = "https://mozilla-mobile.github.io/testapp/v2.0/loginForm.html" val originWebsite = "mozilla-mobile.github.io" navigationToolbar { }.enterURLAndEnterToBrowser(firstLoginPage.url) { clickSubmitLoginButton() verifySaveLoginPromptIsDisplayed() clickPageObject(itemWithText("Save")) }.openNavigationToolbar { }.enterURLAndEnterToBrowser(secondLoginPage.toUri()) { setPageObjectText(itemWithResId("username"), "mozilla") setPageObjectText(itemWithResId("password"), "firefox") clickPageObject(itemWithResId("submit")) verifySaveLoginPromptIsDisplayed() clickPageObject(itemWithText("Save")) mDevice.waitForIdle() }.openThreeDotMenu { }.openSettings { }.openLoginsAndPasswordSubMenu { }.openSavedLogins { tapSetupLater() verifySortedLogin(0, firstLoginPage.url.authority.toString()) verifySortedLogin(1, originWebsite) }.goBack { }.openSavedLogins { verifySortedLogin(0, firstLoginPage.url.authority.toString()) verifySortedLogin(1, originWebsite) } restartApp(activityTestRule) browserScreen { }.openThreeDotMenu { }.openSettings { }.openLoginsAndPasswordSubMenu { }.openSavedLogins { verifySortedLogin(0, firstLoginPage.url.authority.toString()) verifySortedLogin(1, originWebsite) } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1518435 @Test fun verifyAddLoginManuallyTest() { val loginPage = "https://mozilla-mobile.github.io/testapp/v2.0/loginForm.html" homeScreen { }.openThreeDotMenu { }.openSettings { }.openLoginsAndPasswordSubMenu { }.openSavedLogins { tapSetupLater() clickAddLoginButton() verifyAddNewLoginView() enterSiteCredential("mozilla") verifyHostnameErrorMessage() enterSiteCredential(loginPage) verifyHostnameClearButtonEnabled() setNewUserName("mozilla") setNewPassword("firefox") clickClearPasswordButton() verifyPasswordErrorMessage() setNewPassword("firefox") verifyPasswordClearButtonEnabled() saveEditedLogin() } exitMenu() navigationToolbar { }.enterURLAndEnterToBrowser(loginPage.toUri()) { clickPageObject(MatcherHelper.itemWithResId("username")) clickSuggestedLoginsButton() verifySuggestedUserName("mozilla") clickPageObject(itemWithResIdAndText("$packageName:id/username", "mozilla")) clickPageObject(itemWithResId("togglePassword")) verifyPrefilledLoginCredentials("mozilla", "firefox", true) } } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2068215 @Test fun verifyCopyLoginCredentialsToClipboardTest() { val firstLoginPage = TestAssetHelper.getSaveLoginAsset(mockWebServer) navigationToolbar { }.enterURLAndEnterToBrowser(firstLoginPage.url) { clickSubmitLoginButton() verifySaveLoginPromptIsDisplayed() clickPageObject(itemWithText("Save")) }.openThreeDotMenu { }.openSettings { }.openLoginsAndPasswordSubMenu { }.openSavedLogins { tapSetupLater() viewSavedLoginDetails("test@example.com") clickCopyUserNameButton() verifySnackBarText("Username copied to clipboard") clickCopyPasswordButton() verifySnackBarText("Password copied to clipboard") } } }