diff --git a/ui-test/src/main/java/regclient/BaseTest/AndroidBaseTest.java b/ui-test/src/main/java/regclient/BaseTest/AndroidBaseTest.java index 2f8cbcc8d..dc55515fc 100644 --- a/ui-test/src/main/java/regclient/BaseTest/AndroidBaseTest.java +++ b/ui-test/src/main/java/regclient/BaseTest/AndroidBaseTest.java @@ -1,12 +1,21 @@ package regclient.BaseTest; +import java.time.Duration; + +import org.openqa.selenium.ScreenOrientation; +import org.openqa.selenium.support.ui.WebDriverWait; import org.testng.ITestResult; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; +import io.appium.java_client.remote.SupportsRotation; import regclient.driver.DriverManager; +import regclient.page.BasePage; +import regclient.utils.TestDataReader; public class AndroidBaseTest extends BaseTest { + protected BasePage basePage; + @BeforeMethod(alwaysRun = true) public void setup() { try { @@ -15,8 +24,10 @@ public void setup() { } catch (Exception e) { throw new RuntimeException(); } + basePage = new BasePage(driver); + basePage.applyOrientation(); } - + @AfterMethod(alwaysRun = true) public void teardown(ITestResult result) { driver.quit(); diff --git a/ui-test/src/main/java/regclient/androidTestCases/AddMachineDetails.java b/ui-test/src/main/java/regclient/androidTestCases/AddMachineDetails.java index 03427c819..160faa6ae 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/AddMachineDetails.java +++ b/ui-test/src/main/java/regclient/androidTestCases/AddMachineDetails.java @@ -20,7 +20,6 @@ public class AddMachineDetails extends AndroidBaseTest { @Test(priority = 0, description = "Add machine details") public void addMachineDetails() { - BasePage.disableAutoRotation(); LoginPageEnglish loginPage = new LoginPageEnglish(driver); assertTrue(loginPage.isWelcomeMessageInSelectedLanguageDisplayed(), diff --git a/ui-test/src/main/java/regclient/androidTestCases/AutoLogout.java b/ui-test/src/main/java/regclient/androidTestCases/AutoLogout.java index 3f7587803..523870301 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/AutoLogout.java +++ b/ui-test/src/main/java/regclient/androidTestCases/AutoLogout.java @@ -37,7 +37,6 @@ public class AutoLogout extends AndroidBaseTest { @Test(priority = 0, description = "Verify auto-logout when the machine is online") public void onlineAutoLogout() throws InterruptedException { - BasePage.disableAutoRotation(); LoginPage loginPage = null; RegistrationTasksPage registrationTasksPage = null; AutoLogoutPage autoLogoutPage = null; @@ -172,7 +171,6 @@ public void onlineAutoLogout() throws InterruptedException { @Test(priority = 1, description = "Verify auto-logout when the machine is offline") public void offlineAutoLogout() throws InterruptedException, IOException { try { - BasePage.disableAutoRotation(); LoginPage loginPage = null; RegistrationTasksPage registrationTasksPage = null; AutoLogoutPage autoLogoutPage = null; diff --git a/ui-test/src/main/java/regclient/androidTestCases/BiometricCorrection.java b/ui-test/src/main/java/regclient/androidTestCases/BiometricCorrection.java index 22f65764b..1a394c822 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/BiometricCorrection.java +++ b/ui-test/src/main/java/regclient/androidTestCases/BiometricCorrection.java @@ -137,7 +137,6 @@ public class BiometricCorrection extends AndroidBaseTest { @Test(priority = 0, description = "Verify adult biometric correction") public void adultBiometricCorrection() throws InterruptedException { - BasePage.disableAutoRotation(); FetchUiSpec.getUiSpec("newProcess"); FetchUiSpec.getBiometricDetails("individualBiometrics"); List screenOrder = FetchUiSpec.getAllScreenOrder(); @@ -436,8 +435,10 @@ public void adultBiometricCorrection() throws InterruptedException { } assertTrue(previewPage.isNewRegistrationTitleDisplayed(), "Verify if new Registration title is displayed"); - assertTrue(previewPage.isApplicationIDPreviewPagePageDisplayed(), - "Verify if application ID In PreviewPage is displayed"); + +// Below commentout method may be required in future +// assertTrue(previewPage.isApplicationIDPreviewPagePageDisplayed(), +// "Verify if application ID In PreviewPage is displayed"); assertTrue(previewPage.isDemographicInformationInPreviewPageDisplayed(), "Verify if Demographic Information In PreviewPage is displayed"); @@ -980,7 +981,6 @@ public void adultBiometricCorrection() throws InterruptedException { @Test(priority = 1, description = "Verify minor biometric correction") public void minorBiometricCorrection() throws InterruptedException { - BasePage.disableAutoRotation(); FetchUiSpec.getUiSpec("newProcess"); FetchUiSpec.getBiometricDetails("individualBiometrics"); List screenOrder = FetchUiSpec.getAllScreenOrder(); diff --git a/ui-test/src/main/java/regclient/androidTestCases/InitialLaunch.java b/ui-test/src/main/java/regclient/androidTestCases/InitialLaunch.java index f29ba8709..06c40a457 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/InitialLaunch.java +++ b/ui-test/src/main/java/regclient/androidTestCases/InitialLaunch.java @@ -14,7 +14,7 @@ public class InitialLaunch extends AndroidBaseTest { @Test(priority = 0, description = "Verify initial app launch after machine details are configured") public void initialLaunch() { - BasePage.disableAutoRotation(); + LoginPageEnglish loginPage = new LoginPageEnglish(driver); // assertTrue(loginPage.isWelcomeMessageInSelectedLanguageDisplayed(), "verify if the welcome msg in selected language displayed"); diff --git a/ui-test/src/main/java/regclient/androidTestCases/LoginTest.java b/ui-test/src/main/java/regclient/androidTestCases/LoginTest.java index c0e553714..bb47b897b 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/LoginTest.java +++ b/ui-test/src/main/java/regclient/androidTestCases/LoginTest.java @@ -78,7 +78,7 @@ public class LoginTest extends AndroidBaseTest { @Test(priority = 0, description = "Verify user login with valid credentials") public void userloginTest() { - BasePage.disableAutoRotation(); + LoginPage loginPage = null; OperationalTaskPage operationalTaskPage = null; RegistrationTasksPage registrationTasksPage = null; @@ -227,7 +227,7 @@ public void userloginTest() { } profilePage.clickOnLogoutButton(); - + profilePage.clickOnLogoutButton(); assertTrue(loginPage.isLoginPageLoaded(), "verify if login page is displayed in Selected language"); @@ -237,7 +237,6 @@ public void userloginTest() { @Test(priority = 1, description = "Verify operator onboarding process") public void onboardingTest() { - BasePage.disableAutoRotation(); LoginPage loginPage = null; OnBoardPage onBoardPage = null; SupervisorBiometricVerificationpage supervisorBiometricVerificationpage = null; @@ -449,7 +448,7 @@ public void onboardingTest() { @Test(priority = 2, description = "Verify operator biometric update functionality") public void updateOperatorBiometrics() { - BasePage.disableAutoRotation(); + LoginPage loginPage = null; OperationalTaskPage operationalTaskPage = null; RegistrationTasksPage registrationTasksPage = null; diff --git a/ui-test/src/main/java/regclient/androidTestCases/LostUin.java b/ui-test/src/main/java/regclient/androidTestCases/LostUin.java index d03481d6e..e54ec1279 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/LostUin.java +++ b/ui-test/src/main/java/regclient/androidTestCases/LostUin.java @@ -122,7 +122,7 @@ public class LostUin extends AndroidBaseTest { @Test(priority = 0, description = "Verify lost UIN") public void lostUinAdult() { - BasePage.disableAutoRotation(); + FetchUiSpec.getUiSpec("newProcess"); FetchUiSpec.getBiometricDetails("individualBiometrics"); List screenOrder = FetchUiSpec.getAllScreenOrder(); diff --git a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdult.java b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdult.java index 434c296b0..ca1196a9e 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdult.java +++ b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdult.java @@ -129,7 +129,6 @@ public class NewRegistrationAdult extends AndroidBaseTest { @Test(priority = 0, description = "Verify adult new registration") public void newRegistrationAdult() throws InterruptedException { - BasePage.disableAutoRotation(); FetchUiSpec.getUiSpec("newProcess"); FetchUiSpec.getBiometricDetails("individualBiometrics"); List screenOrder = FetchUiSpec.getAllScreenOrder(); @@ -148,6 +147,7 @@ public void newRegistrationAdult() throws InterruptedException { PendingApproval pendingApproval = null; ManageApplicationsPage manageApplicationsPage = null; ProfilePage profilePage = null; + BasePage basePage = null; final String language = TestDataReader.readData("language"); @@ -599,15 +599,17 @@ public void newRegistrationAdult() throws InterruptedException { boolean uploadSuccess = false; for (int i = 0; i < 3; i++) { + manageApplicationsPage.clickOnUploadButton(); - if (!manageApplicationsPage.isNoNetworkFoundDisplayed()) { - uploadSuccess = true; - break; + uploadSuccess = manageApplicationsPage.isZeroApplicationDisplayed(); + + if (!uploadSuccess) { + } } - assertTrue(uploadSuccess, "Upload failed after retries: No Network Found still displayed"); + assertTrue(uploadSuccess, "Zero Application not displayed after retries"); manageApplicationsPage.clickOnBackButton(); @@ -634,9 +636,8 @@ public void newRegistrationAdult() throws InterruptedException { } -// @Test(priority = 1, description = "Verify adult new registration") + @Test(priority = 1, description = "Verify adult new registration") public void newRegistrationAdultUploadMultipleDoccuments() throws InterruptedException { - BasePage.disableAutoRotation(); FetchUiSpec.getUiSpec("newProcess"); FetchUiSpec.getBiometricDetails("individualBiometrics"); List screenOrder = FetchUiSpec.getAllScreenOrder(); diff --git a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdultException.java b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdultException.java index 4ee2ababa..e01cb4e21 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdultException.java +++ b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdultException.java @@ -125,7 +125,7 @@ public void newRegistrationAdultException() throws InterruptedException { FetchUiSpec.getUiSpec("newProcess"); FetchUiSpec.getBiometricDetails("individualBiometrics"); List screenOrder = FetchUiSpec.getAllScreenOrder(); - BasePage.disableAutoRotation(); + LoginPage loginPage = null; RegistrationTasksPage registrationTasksPage = null; SelectLanguagePage selectLanguagePage = null; diff --git a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationInfant.java b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationInfant.java index d0a8178ac..10ced4fe1 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationInfant.java +++ b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationInfant.java @@ -132,7 +132,7 @@ public void newRegistrationInfant() throws InterruptedException { FetchUiSpec.getUiSpec("newProcess"); FetchUiSpec.getBiometricDetails("individualBiometrics"); List screenOrder = FetchUiSpec.getAllScreenOrder(); - BasePage.disableAutoRotation(); + LoginPage loginPage = null; RegistrationTasksPage registrationTasksPage = null; SelectLanguagePage selectLanguagePage = null; @@ -287,7 +287,8 @@ public void newRegistrationInfant() throws InterruptedException { } else { throw new IllegalStateException("Unsupported language in testdata.json: " + language); } - biometricDetailsPage.clickOnFaceScanIcon(); + assertTrue(biometricDetailsPage.isBiometricDetailsPageDisplayed(), + "Verify if biometric details page is displayed"); if ("eng".equalsIgnoreCase(language)) { applicantBiometricsPage = new ApplicantBiometricsPageEnglish(driver); } else if ("hin".equalsIgnoreCase(language)) { @@ -303,13 +304,18 @@ public void newRegistrationInfant() throws InterruptedException { } else { throw new IllegalStateException("Unsupported language in testdata.json: " + language); } - applicantBiometricsPage.clickOnScanButton(); - - assertTrue(applicantBiometricsPage.isFaceScan(), - "Verify if face captured and 2 attempts left text is displayed"); - applicantBiometricsPage.closeScanCapturePopUp(); - - biometricDetailsPage = applicantBiometricsPage.clickOnNextButton(); + + if (FetchUiSpec.face.equals("yes")) { + + biometricDetailsPage.clickOnFaceScanIcon(); + assertTrue(applicantBiometricsPage.isFaceScanTitleDisplayed(), + "Verify if applicant face scan title is displayed"); + applicantBiometricsPage.clickOnScanButton(); + + assertTrue(applicantBiometricsPage.isFaceScan(), "Verify if face scan 1st attempt"); + applicantBiometricsPage.closeScanCapturePopUp(); + applicantBiometricsPage.clickOnNextButton(); + } assertTrue(biometricDetailsPage.isBiometricDetailsPageDisplayed(), "Verify if biometric details page is displayed"); @@ -335,65 +341,54 @@ public void newRegistrationInfant() throws InterruptedException { FetchUiSpec.face = "no"; FetchUiSpec.getBiometricDetails("introducerBiometrics"); if (FetchUiSpec.eye.equals("yes")) { + biometricDetailsPage.clickOnIntroducerIrisScan(); - assertTrue(introducerBiometricPage.isIntroducerBiometricsPageDisplayed(), - "Verify if introducer biometric page is displayed"); - + introducerBiometricPage.clickOnScanButton(); - if (!introducerBiometricPage.isIrisScan()) { - introducerBiometricPage.clickOnScanButton(); - } - assertTrue(introducerBiometricPage.isIrisScan(), "Verify if iris scan 1st attempt"); introducerBiometricPage.closeScanCapturePopUp(); introducerBiometricPage.clickOnNextButton(); } // righthand if (FetchUiSpec.rightHand.equals("yes")) { - + assertTrue(introducerBiometricPage.isRightHandScanTitleDisplayed(), + "Verify if right hand scan is displayed"); introducerBiometricPage.clickOnScanButton(); - if (!introducerBiometricPage.isRightHandScan()) { - introducerBiometricPage.clickOnScanButton(); - } - assertTrue(introducerBiometricPage.isRightHandScan(), "Verify if right hand scan 1st attempt"); - introducerBiometricPage.closeScanCapturePopUp(); introducerBiometricPage.clickOnNextButton(); } // lefthand if (FetchUiSpec.leftHand.equals("yes")) { + assertTrue(introducerBiometricPage.isLeftHandScanTitleDisplayed(), + "Verify if applicant left hand scan title is displayed"); introducerBiometricPage.clickOnScanButton(); - assertTrue(introducerBiometricPage.isLeftHandScan(), "Verify if left hand scan 1st attempt"); + + assertTrue(introducerBiometricPage.isLeftHandScan(), "Verify if Left hand scan 1st attempt"); introducerBiometricPage.closeScanCapturePopUp(); - assertTrue(introducerBiometricPage.isNextButtonDisplayed(), "Verify if next button displayed"); introducerBiometricPage.clickOnNextButton(); } // thumb if (FetchUiSpec.thumb.equals("yes")) { + assertTrue(introducerBiometricPage.isThumbsScanTitleDisplayed(), + "Verify if thumbs scan page is displayed"); introducerBiometricPage.clickOnScanButton(); - if (!introducerBiometricPage.isThumbsScan()) { - introducerBiometricPage.clickOnScanButton(); - } - - assertTrue(introducerBiometricPage.isThumbsScan(), "Verify if thumb scan 1st attempt"); - + assertTrue(introducerBiometricPage.isThumbsScan(), "Verify if thumbs scan 1st attempt"); introducerBiometricPage.closeScanCapturePopUp(); - - assertTrue(introducerBiometricPage.isNextButtonDisplayed(), "Verify if next button displayed"); introducerBiometricPage.clickOnNextButton(); } // face if (FetchUiSpec.face.equals("yes")) { + assertTrue(introducerBiometricPage.isFaceScanTitleDisplayed(), + "Verify if face scan page is displayed"); introducerBiometricPage.clickOnScanButton(); - assertTrue(introducerBiometricPage.isFaceScan(), "Verify if Face scan 1st attempt"); - + + assertTrue(introducerBiometricPage.isFaceScan(), "Verify if face scan 1st attempt"); introducerBiometricPage.closeScanCapturePopUp(); - assertTrue(introducerBiometricPage.isNextButtonDisplayed(), "Verify if next button displayed"); - introducerBiometricPage.clickOnNextButton(); + biometricDetailsPage = introducerBiometricPage.clickOnNextButton(); } biometricDetailsPage.clickOnContinueButton(); diff --git a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationMinor.java b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationMinor.java index 1dbfdd2f6..3421b89fe 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationMinor.java +++ b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationMinor.java @@ -132,7 +132,7 @@ public void newRegistrationMinor() throws InterruptedException { FetchUiSpec.getUiSpec("newProcess"); FetchUiSpec.getBiometricDetails("individualBiometrics"); List screenOrder = FetchUiSpec.getAllScreenOrder(); - BasePage.disableAutoRotation(); + LoginPage loginPage = null; RegistrationTasksPage registrationTasksPage = null; SelectLanguagePage selectLanguagePage = null; diff --git a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationMinorException.java b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationMinorException.java index 445e0ce3a..801680f61 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationMinorException.java +++ b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationMinorException.java @@ -132,7 +132,7 @@ public void newRegistrationMinorException() throws InterruptedException { FetchUiSpec.getUiSpec("newProcess"); FetchUiSpec.getBiometricDetails("individualBiometrics"); List screenOrder = FetchUiSpec.getAllScreenOrder(); - BasePage.disableAutoRotation(); + LoginPage loginPage = null; RegistrationTasksPage registrationTasksPage = null; SelectLanguagePage selectLanguagePage = null; diff --git a/ui-test/src/main/java/regclient/androidTestCases/PreRegFetchingPacket.java b/ui-test/src/main/java/regclient/androidTestCases/PreRegFetchingPacket.java index 36e79ae2a..3c1c15b35 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/PreRegFetchingPacket.java +++ b/ui-test/src/main/java/regclient/androidTestCases/PreRegFetchingPacket.java @@ -129,7 +129,7 @@ public class PreRegFetchingPacket extends AndroidBaseTest { @Test(priority = 0, description = "Verify adult pre-reg fetching registration") public void adultPreRegFetching() throws InterruptedException { - BasePage.disableAutoRotation(); + FetchUiSpec.getUiSpec("newProcess"); FetchUiSpec.getBiometricDetails("individualBiometrics"); List screenOrder = FetchUiSpec.getAllScreenOrder(); @@ -612,7 +612,6 @@ public void adultPreRegFetching() throws InterruptedException { @Test(priority = 1, description = "Verify minor pre-reg fetching registration") public void minorPreRegFetching() throws InterruptedException { - BasePage.disableAutoRotation(); FetchUiSpec.getUiSpec("newProcess"); FetchUiSpec.getBiometricDetails("individualBiometrics"); List screenOrder = FetchUiSpec.getAllScreenOrder(); @@ -650,6 +649,7 @@ public void minorPreRegFetching() throws InterruptedException { } else { throw new IllegalStateException("Unsupported language in testdata.json: " + language); } + loginPage.selectLanguage(); assertTrue(loginPage.isWelcomeMessageInSelectedLanguageDisplayed(), @@ -1180,7 +1180,6 @@ public void minorPreRegFetching() throws InterruptedException { @Test(priority = 2, description = "Verify infant pre-reg fetching registration") public void infantPreRegFetching() throws InterruptedException { - BasePage.disableAutoRotation(); FetchUiSpec.getUiSpec("newProcess"); FetchUiSpec.getBiometricDetails("individualBiometrics"); List screenOrder = FetchUiSpec.getAllScreenOrder(); @@ -1218,6 +1217,7 @@ public void infantPreRegFetching() throws InterruptedException { } else { throw new IllegalStateException("Unsupported language in testdata.json: " + language); } + loginPage.selectLanguage(); assertTrue(loginPage.isWelcomeMessageInSelectedLanguageDisplayed(), diff --git a/ui-test/src/main/java/regclient/androidTestCases/ResetPassword.java b/ui-test/src/main/java/regclient/androidTestCases/ResetPassword.java index f2a688f79..112678250 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/ResetPassword.java +++ b/ui-test/src/main/java/regclient/androidTestCases/ResetPassword.java @@ -36,7 +36,7 @@ public class ResetPassword extends AndroidBaseTest { @Test(priority = 0, description = "Verify reset password") public void resetPassword() throws IOException { - BasePage.disableAutoRotation(); + LoginPage loginPage = null; RegistrationTasksPage registrationTasksPage = null; ProfilePage profilePage = null; @@ -156,7 +156,6 @@ public void resetPassword() throws IOException { keycloakPage.clickOnSignoutButton(); keycloakPage.resumeArcApplication(); - assertTrue(profilePage.isLogoutPopUpMessageDisplayed(), "Verify if logout displayed in profile page"); profilePage.clickOnLogoutButton(); @@ -221,7 +220,7 @@ public void resetPassword() throws IOException { @Test(priority = 1, description = "Reset to default password", dependsOnMethods = "resetPassword") public void resetToDefaultPassword() throws IOException { - BasePage.disableAutoRotation(); + LoginPage loginPage = null; RegistrationTasksPage registrationTasksPage = null; ProfilePage profilePage = null; @@ -336,7 +335,6 @@ public void resetToDefaultPassword() throws IOException { keycloakPage.clickOnSignoutButton(); keycloakPage.resumeArcApplication(); - assertTrue(profilePage.isLogoutPopUpMessageDisplayed(), "Verify if logout displayed in profile page"); profilePage.clickOnLogoutButton(); } diff --git a/ui-test/src/main/java/regclient/androidTestCases/Settings.java b/ui-test/src/main/java/regclient/androidTestCases/Settings.java index f63e4ece3..dd7d2ef5d 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/Settings.java +++ b/ui-test/src/main/java/regclient/androidTestCases/Settings.java @@ -60,12 +60,9 @@ public class Settings extends AndroidBaseTest { @Test(priority = 0, description = "Verify machine settings functionality") public void settings() throws InterruptedException { - BasePage.disableAutoRotation(); LoginPage loginPage = null; RegistrationTasksPage registrationTasksPage = null; SettingsPage settingsPage = null; - OperationalTaskPage operationalTaskPage = null; - UpdateOperatorBiometricspage UpdateOperatorBiometricspage = null; final String language = TestDataReader.readData("language"); if ("eng".equalsIgnoreCase(language)) { @@ -198,5 +195,4 @@ public void settings() throws InterruptedException { // assertTrue(settingsPage.isToastVisible("Master Data Sync Completed"), "Toast not found!"); } - } diff --git a/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUINUpdateDemographicDetails.java b/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUINUpdateDemographicDetails.java index 45c528634..fbbc2bdd1 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUINUpdateDemographicDetails.java +++ b/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUINUpdateDemographicDetails.java @@ -131,7 +131,6 @@ public class UpdateMyUinUpdateDemographicDetails extends AndroidBaseTest { public void updateMyUinUpdateDemographicDetails() throws InterruptedException { FetchUiSpec.getUiSpec("updateProcess"); List screenOrder = FetchUiSpec.getAllScreenOrder(); - BasePage.disableAutoRotation(); LoginPage loginPage = null; RegistrationTasksPage registrationTasksPage = null; SelectLanguagePage selectLanguagePage = null; diff --git a/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUinInfant.java b/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUinInfant.java index 8087b7741..0e908be72 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUinInfant.java +++ b/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUinInfant.java @@ -137,7 +137,7 @@ public class UpdateMyUinInfant extends AndroidBaseTest { @Test(priority = 0, description = "Verify infant UIN update") public void updateMyUinInfant() throws InterruptedException { FetchUiSpec.getUiSpec("updateProcess"); - BasePage.disableAutoRotation(); + List screenOrder = FetchUiSpec.getAllScreenOrder(); LoginPage loginPage = null; RegistrationTasksPage registrationTasksPage = null; diff --git a/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUinMinor.java b/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUinMinor.java index 28bdd5268..199c526e1 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUinMinor.java +++ b/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUinMinor.java @@ -139,7 +139,7 @@ public void updateMyUinMinor() throws InterruptedException { FetchUiSpec.getUiSpec("updateProcess"); FetchUiSpec.getBiometricDetails("individualBiometrics"); List screenOrder = FetchUiSpec.getAllScreenOrder(); - BasePage.disableAutoRotation(); + LoginPage loginPage = null; RegistrationTasksPage registrationTasksPage = null; SelectLanguagePage selectLanguagePage = null; @@ -524,7 +524,7 @@ public void updateMyUinMinor() throws InterruptedException { "Verify if Demographic Information In PreviewPage is displayed"); assertTrue(previewPage.isDocumentsInformationInPreviewPageDisplayed(), "Verify if Documents Information In PreviewPage is displayed"); -// assertTrue(previewPage.isBiometricsInformationInPreviewPagePageDisplayed(),"Verify if Biometrics Information In PreviewPage is displayed"); + assertTrue(previewPage.isBiometricsInformationInPreviewPagePageDisplayed(),"Verify if Biometrics Information In PreviewPage is displayed"); String Aid = previewPage.getAID(); if ("eng".equalsIgnoreCase(language)) { authenticationPage = new AuthenticationPageEnglish(driver); diff --git a/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUinUpdateBiometrics.java b/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUinUpdateBiometrics.java index 60ac73830..9675c90eb 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUinUpdateBiometrics.java +++ b/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUinUpdateBiometrics.java @@ -131,7 +131,6 @@ public class UpdateMyUinUpdateBiometrics extends AndroidBaseTest { public void updateMyUinUpdateBiometrics() throws InterruptedException { FetchUiSpec.getUiSpec("updateProcess"); List screenOrder = FetchUiSpec.getAllScreenOrder(); - BasePage.disableAutoRotation(); LoginPage loginPage = null; RegistrationTasksPage registrationTasksPage = null; SelectLanguagePage selectLanguagePage = null; diff --git a/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUinUpdateDocuments.java b/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUinUpdateDocuments.java index 746e772a0..af8c666e2 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUinUpdateDocuments.java +++ b/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUinUpdateDocuments.java @@ -131,7 +131,6 @@ public class UpdateMyUinUpdateDocuments extends AndroidBaseTest { public void updateMyUinUpdateDocuments() throws InterruptedException { FetchUiSpec.getUiSpec("updateProcess"); List screenOrder = FetchUiSpec.getAllScreenOrder(); - BasePage.disableAutoRotation(); LoginPage loginPage = null; RegistrationTasksPage registrationTasksPage = null; SelectLanguagePage selectLanguagePage = null; diff --git a/ui-test/src/main/java/regclient/page/BasePage.java b/ui-test/src/main/java/regclient/page/BasePage.java index 5e121ec4c..51eb1ec69 100644 --- a/ui-test/src/main/java/regclient/page/BasePage.java +++ b/ui-test/src/main/java/regclient/page/BasePage.java @@ -10,14 +10,19 @@ import io.appium.java_client.android.nativekey.KeyEvent; import io.appium.java_client.pagefactory.AppiumFieldDecorator; import io.appium.java_client.remote.SupportsContextSwitching; +import io.appium.java_client.remote.SupportsRotation; import io.appium.java_client.touch.WaitOptions; import io.appium.java_client.touch.offset.PointOption; +import regclient.pages.english.BiometricDetailsPageEnglish; +import regclient.utils.TestDataReader; import org.openqa.selenium.By; import org.openqa.selenium.Dimension; +import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.Keys; import org.openqa.selenium.NoSuchElementException; import org.openqa.selenium.Rectangle; +import org.openqa.selenium.ScreenOrientation; import org.openqa.selenium.StaleElementReferenceException; import org.openqa.selenium.TimeoutException; import org.openqa.selenium.WebElement; @@ -27,6 +32,8 @@ import org.openqa.selenium.support.PageFactory; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -38,7 +45,9 @@ import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStreamReader; import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; @@ -65,6 +74,8 @@ public BasePage(AppiumDriver driver) { } + private static final Logger logger = LoggerFactory.getLogger(BasePage.class); + protected boolean isElementDisplayed(WebElement element) { try { waitForElementToBeVisible(element); @@ -105,9 +116,9 @@ private void waitForElementToBeVisible(WebElement element) { wait.until(ExpectedConditions.visibilityOf(element)); } - protected void waitForElementToBeClickable(WebElement element) { - WebDriverWait wait = new WebDriverWait(driver, ofSeconds(20)); - wait.until(ExpectedConditions.refreshed(ExpectedConditions.elementToBeClickable(element))); + protected WebElement waitForElementToBeClickable(WebElement element) { + WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(20)); + return wait.until(ExpectedConditions.elementToBeClickable(element)); } protected boolean isElementDisplayed(WebElement element, int waitTime) { @@ -148,6 +159,17 @@ protected void clickAndsendKeysToTextBox(WebElement element, String text) { ((HidesKeyboard) driver).hideKeyboard(); } + protected void clickAndsendKeysToTextBox3(WebElement element, String text) { + this.waitForElementToBeClickable(element); + element.click(); + waitTime(1); + element.clear(); + waitTime(1); + element.sendKeys(text); + waitTime(1); + ((HidesKeyboard) driver).hideKeyboard(); + } + protected void clickAndsendKeysToTextBox2(WebElement element, String text) { this.waitForElementToBeVisible(element); element.click(); @@ -170,16 +192,14 @@ protected void sendKeysToTextBox(WebElement element, String text) { } protected void sendKeys(By locator, String text) { - WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(20)); - WebElement el = wait.until( - ExpectedConditions.elementToBeClickable(locator) - ); - el.click(); - el.clear(); - el.sendKeys(text); + WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(20)); + WebElement el = wait.until(ExpectedConditions.elementToBeClickable(locator)); + el.click(); + el.clear(); + el.sendKeys(text); + ((HidesKeyboard) driver).hideKeyboard(); } - protected String getTextFromLocator(WebElement element) { this.waitForElementToBeVisible(element); return element.getText(); @@ -235,25 +255,6 @@ protected boolean isElementDisplayedOnScreen(WebElement element) { } } - public static void disableAutoRotation() { - try { - ProcessBuilder processBuilder; - String osName = System.getProperty("os.name"); - if (osName.contains("Windows")) { - processBuilder = new ProcessBuilder("cmd.exe", "/c", - "adb shell settings put system accelerometer_rotation 0"); - - } else { - processBuilder = new ProcessBuilder("/bin/bash", "-c", - "adb shell settings put system accelerometer_rotation 0"); - } - processBuilder.redirectErrorStream(true); - processBuilder.start(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - protected String getCurrentDate() { LocalDateTime currentDateTime = LocalDateTime.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); @@ -285,10 +286,10 @@ public WebElement retryFindElement(WebElement element, Duration timeout) { wait.until(ExpectedConditions.visibilityOf(element)); return element; } catch (StaleElementReferenceException e) { - System.out.println("StaleElementReferenceException caught. Retrying... " + attempts); + logger.info("StaleElementReferenceException caught. Retrying... " + attempts); attempts++; } catch (TimeoutException e) { - System.out.println("TimeoutException caught. Retrying... " + attempts); + logger.info("TimeoutException caught. Retrying... " + attempts); attempts++; } } @@ -343,7 +344,6 @@ public WebElement findElementWithRetry(By by) { try { element = driver.findElement(by); - // 🔑 force staleness check element.isDisplayed(); return element; @@ -399,7 +399,7 @@ protected void clickAtCoordinates(int x, int y) { Sequence clickSequence = new Sequence(finger, 1) .addAction(finger.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), x, y)) .addAction(finger.createPointerDown(PointerInput.MouseButton.LEFT.asArg())) - .addAction(new Pause(finger, Duration.ofMillis(600))) // Pause for 200ms + .addAction(new Pause(finger, Duration.ofMillis(600))) // Pause for 600ms .addAction(finger.createPointerUp(PointerInput.MouseButton.LEFT.asArg())); // Release at x, y // coordinates driver.perform(Collections.singletonList(clickSequence)); @@ -528,7 +528,7 @@ public WebElement findElementIfExists(By locator) { return findElementWithRetry(locator); // reuse your existing retry logic } catch (Exception e) { // Optional: log for debugging - System.out.println("Element not found after retries: " + locator); + logger.info("Element not found after retries: " + locator); return null; // prevents NoSuchElementException / NPE } } @@ -708,21 +708,6 @@ public void switchToNativeContext() { } } - public void switchToWebContext() { - SupportsContextSwitching ctx = (SupportsContextSwitching) driver; - - if (!ctx.getContext().contains("WEBVIEW") && !ctx.getContext().contains("CHROMIUM")) { - - for (String context : ctx.getContextHandles()) { - if (context.contains("WEBVIEW") || context.contains("CHROMIUM")) { - ctx.context(context); - return; - } - } - throw new RuntimeException("No web context found"); - } - } - public void scrollToTopSafe() { try { if (!((SupportsContextSwitching) driver).getContext().equals("NATIVE_APP")) { @@ -731,7 +716,7 @@ public void scrollToTopSafe() { driver.manage().window().getSize(); // safe now scrollToTop(); } catch (Exception e) { - System.out.println("scrollToTop skipped — not in a native window"); + logger.info("scrollToTop skipped — not in a native window"); } } @@ -829,19 +814,6 @@ protected void scrollUntilElementVisible(By locator) { throw new NoSuchElementException("Element not visible after scrolling: " + locator); } - public void clickAndsendKeysToTextBoxByLocator(By locator, String value) { - WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(20)); - wait.ignoring(StaleElementReferenceException.class); - - wait.until(Webdriver -> { - WebElement element = Webdriver.findElement(locator); - element.click(); - element.clear(); - element.sendKeys(value); - return true; - }); - } - public boolean isElementEnabled(By locator) { try { WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(20)); @@ -889,24 +861,92 @@ public void scrollUntilVisible(By locator, int maxScrolls) { } protected void clickAndSendKeysToTextBox(By locator, String text) { - this.waitForElementToBeVisible(locator, 10); - WebElement element = driver.findElement(locator); + WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); - element.click(); - waitTime(1); + for (int i = 0; i < 2; i++) { + try { + WebElement element = wait.until(ExpectedConditions.elementToBeClickable(locator)); - element.clear(); - waitTime(1); + element.click(); + element.clear(); + element.sendKeys(text); - element.sendKeys(text); - waitTime(1); + hideKeyboardIfVisible(); + return; - hideKeyboardIfVisible(); + } catch (StaleElementReferenceException e) { + + } + } + + throw new RuntimeException("Unable to interact with textbox"); } protected void waitForElementToBeVisible(By locator, int waitTime) { WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(waitTime)); wait.until(ExpectedConditions.visibilityOfElementLocated(locator)); } + + private ScreenOrientation desiredOrientation; + + public void applyOrientation() { + String orientation = TestDataReader.readData("orientation"); + ScreenOrientation finalOrientation = ScreenOrientation.PORTRAIT; // default fallback + if (orientation != null && !orientation.isBlank()) { + try { + finalOrientation = ScreenOrientation.valueOf(orientation.trim().toUpperCase()); + } catch (IllegalArgumentException e) { + logger.info( + "Invalid orientation value in testdata.json: " + orientation + ". Falling back to PORTRAIT."); + } + + } else { + logger.info("Orientation not provided or empty. Using default PORTRAIT."); + } + + lockSystemRotation(finalOrientation); + ((SupportsRotation) driver).rotate(finalOrientation); + + logger.info("Orientation applied: " + finalOrientation); + } + + private void lockSystemRotation(ScreenOrientation orientation) { + + String rotationValue = "0"; // Portrait default + + if (orientation == ScreenOrientation.LANDSCAPE) { + rotationValue = "1"; + } + + executeAdbCommand(new String[] { "adb", "shell", "settings", "put", "system", "accelerometer_rotation", "0" }); + + executeAdbCommand(new String[] { "adb", "shell", "settings", "put", "system", "user_rotation", rotationValue }); + } + + private void executeAdbCommand(String[] command) { + try { + ProcessBuilder processBuilder = new ProcessBuilder(command); + processBuilder.redirectErrorStream(true); + + Process process = processBuilder.start(); + + // Read output (important to prevent stream blocking) + try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) { + while (reader.readLine() != null) { + // optionally log output + } + } + + int exitCode = process.waitFor(); + + if (exitCode != 0) { + System.out.println("ADB command failed with exit code: " + exitCode); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } diff --git a/ui-test/src/main/java/regclient/page/BiometricDetailsPage.java b/ui-test/src/main/java/regclient/page/BiometricDetailsPage.java index ea07e18a9..d570ce4a1 100644 --- a/ui-test/src/main/java/regclient/page/BiometricDetailsPage.java +++ b/ui-test/src/main/java/regclient/page/BiometricDetailsPage.java @@ -40,5 +40,6 @@ public BiometricDetailsPage(AppiumDriver driver) { public abstract void enterAdditionalInfoUsingEmail(String emailId); +// Below commentout method may be required in future // public abstract void handleBiometricDetails(); } diff --git a/ui-test/src/main/java/regclient/page/KeycloakPage.java b/ui-test/src/main/java/regclient/page/KeycloakPage.java index 59748d4b1..242f90d6c 100644 --- a/ui-test/src/main/java/regclient/page/KeycloakPage.java +++ b/ui-test/src/main/java/regclient/page/KeycloakPage.java @@ -169,7 +169,7 @@ public void resumeArcApplication() { } public void openKeycloakPage() { - switchToWebContext(); + openKeycloakWebView(); waitForLoginPage(); } diff --git a/ui-test/src/main/java/regclient/page/SettingsPage.java b/ui-test/src/main/java/regclient/page/SettingsPage.java index f6ff5d725..8917d6736 100644 --- a/ui-test/src/main/java/regclient/page/SettingsPage.java +++ b/ui-test/src/main/java/regclient/page/SettingsPage.java @@ -55,6 +55,5 @@ public SettingsPage(AppiumDriver driver) { public abstract boolean validateJobCardFields(String jobName); public abstract boolean isJobDisplayed(String jobName); - } diff --git a/ui-test/src/main/java/regclient/pages/arabic/BiometricDetailsPageArabic.java b/ui-test/src/main/java/regclient/pages/arabic/BiometricDetailsPageArabic.java index 09e1234ff..3d3fe3045 100644 --- a/ui-test/src/main/java/regclient/pages/arabic/BiometricDetailsPageArabic.java +++ b/ui-test/src/main/java/regclient/pages/arabic/BiometricDetailsPageArabic.java @@ -51,10 +51,10 @@ public class BiometricDetailsPageArabic extends BiometricDetailsPage { @AndroidFindBy(xpath = "//android.widget.EditText[contains(@hint, 'أدخل معرف طلب المعلومات الإضافية')]") private WebElement additionalInfoRequestIdTextbox; - + @AndroidFindBy(uiAutomator = "new UiSelector().descriptionContains(\"لقد كنت خاملاً\")") private WebElement autoLogoutPopup; - + @AndroidFindBy(accessibility = "البقاء مسجلاً الدخول") private WebElement stayLoggedInButton; @@ -152,7 +152,7 @@ public PreviewPage clickOnContinueButton() { clickOnElement(continueButton); return new PreviewPageArabic(driver); } - + public RegistrationTasksPage clickOnStayLoggedInButton() { clickOnElement(stayLoggedInButton); return new RegistrationTasksPageArabic(driver); @@ -178,21 +178,20 @@ public void enterAdditionalInfoUsingEmail(String emailId) { id = OTPListener.getAdditionalReqId(emailId); } catch (Exception e) { // If getAdditionalReqId can throw, log and continue polling - System.out.println("OTPListener.getAdditionalReqId threw: " + e.getMessage()); + logger.info("OTPListener.getAdditionalReqId threw: " + e.getMessage()); } if (id != null && !id.isEmpty() && !"{Failed}".equals(id)) { String finalId = id.trim() + (id.endsWith(SUFFIX) ? "" : SUFFIX); - System.out.println("Found id: " + id + " -> finalId: " + finalId); + logger.info("Found id: " + id + " -> finalId: " + finalId); // typeAndVerify should return true on success; handle its failure/exception try { - typeAndVerify(additionalInfoRequestIdTextbox, finalId); - System.out.println("Entered finalId: " + finalId); - return; // success + typeAndVerify(additionalInfoRequestIdTextbox, finalId); + logger.info("Entered finalId: " + finalId); + return; // success } catch (Exception e) { - throw new AssertionError( - "Failed while typing finalId: " + finalId + " : " + e.getMessage(), e); + throw new AssertionError("Failed while typing finalId: " + finalId + " : " + e.getMessage(), e); } } @@ -200,7 +199,7 @@ public void enterAdditionalInfoUsingEmail(String emailId) { // handle auto logout popup try { if (isAutoLogoutPopupDisplayed()) { - System.out.println("Auto-logout popup displayed — staying logged in."); + logger.info("Auto-logout popup displayed — staying logged in."); clickOnStayLoggedInButton(); } } catch (Exception ignored) { @@ -209,7 +208,7 @@ public void enterAdditionalInfoUsingEmail(String emailId) { // log remaining time long elapsed = System.currentTimeMillis() - startMs; long remainingMs = Math.max(0, timeoutMs - elapsed); - System.out.println("ID not found yet. Elapsed " + (elapsed / 1000) + "s, remaining " + (remainingMs / 1000) + logger.info("ID not found yet. Elapsed " + (elapsed / 1000) + "s, remaining " + (remainingMs / 1000) + "s. Sleeping " + pollIntervalSeconds + "s."); try { @@ -226,10 +225,11 @@ public void enterAdditionalInfoUsingEmail(String emailId) { } private void typeAndVerify(WebElement el, String value) { - el.click(); - el.clear(); - el.sendKeys(value); + el.click(); + el.clear(); + el.sendKeys(value); } + public boolean isAutoLogoutPopupDisplayed() { try { WebDriverWait wait = new WebDriverWait(driver, Duration.ofMinutes(10)); diff --git a/ui-test/src/main/java/regclient/pages/arabic/DemographicDetailsPageArabic.java b/ui-test/src/main/java/regclient/pages/arabic/DemographicDetailsPageArabic.java index 9ac6aa4ca..212a0661b 100644 --- a/ui-test/src/main/java/regclient/pages/arabic/DemographicDetailsPageArabic.java +++ b/ui-test/src/main/java/regclient/pages/arabic/DemographicDetailsPageArabic.java @@ -425,8 +425,8 @@ public void clickOnScanButton() { public void fetchPreregApplicationId(String age) { By appIdLabel = By.xpath("//android.widget.EditText[contains(@hint,'Application ID')]"); - By appIdTextbox = MobileBy - .AndroidUIAutomator("new UiSelector().className(\"android.widget.EditText\").instance(0)"); + By appIdTextbox = MobileBy.AndroidUIAutomator( + "new UiSelector().className(\"android.widget.EditText\").instance(0)"); // Verify label is displayed boolean isDisplayed = isElementDisplayed(appIdLabel); diff --git a/ui-test/src/main/java/regclient/pages/arabic/DocumentUploadPageArabic.java b/ui-test/src/main/java/regclient/pages/arabic/DocumentUploadPageArabic.java index 13b814880..0a9395443 100644 --- a/ui-test/src/main/java/regclient/pages/arabic/DocumentUploadPageArabic.java +++ b/ui-test/src/main/java/regclient/pages/arabic/DocumentUploadPageArabic.java @@ -110,6 +110,8 @@ public void uploadDoccuments(String age, String type) { cameraPage.handleCameraPermission(); cameraPage.clickimage(); cameraPage.clickOkButton(); + waitTime(1); + applyOrientation(); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); @@ -142,6 +144,7 @@ public void uploadDoccuments(String age, String type) { waitTime(1); cameraPage.clickOkButton(); waitTime(1); + applyOrientation(); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); @@ -176,6 +179,8 @@ public void uploadDoccuments(String age, String type) { cameraPage.clickimage(); waitTime(1); cameraPage.clickOkButton(); + waitTime(1); + applyOrientation(); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); @@ -214,6 +219,8 @@ public void uploadDoccumentsUpdate(String age, String type) { cameraPage.handleCameraPermission(); cameraPage.clickimage(); cameraPage.clickOkButton(); + waitTime(1); + applyOrientation(); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); @@ -242,6 +249,8 @@ public void uploadDoccumentsUpdate(String age, String type) { cameraPage.handleCameraPermission(); cameraPage.clickimage(); cameraPage.clickOkButton(); + waitTime(1); + applyOrientation(); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); diff --git a/ui-test/src/main/java/regclient/pages/arabic/PreviewPageArabic.java b/ui-test/src/main/java/regclient/pages/arabic/PreviewPageArabic.java index 94be9da44..7a4038484 100644 --- a/ui-test/src/main/java/regclient/pages/arabic/PreviewPageArabic.java +++ b/ui-test/src/main/java/regclient/pages/arabic/PreviewPageArabic.java @@ -76,7 +76,7 @@ public boolean isDemographicInformationInPreviewPageDisplayed() { public boolean isDocumentsInformationInPreviewPageDisplayed() { try { scrollToText("وثائق"); - return documentsInformationInPreviewPage.isDisplayed(); + return isElementDisplayed(documentsInformationInPreviewPage); } catch (Exception e) { return false; } @@ -85,7 +85,7 @@ public boolean isDocumentsInformationInPreviewPageDisplayed() { public boolean isBiometricsInformationInPreviewPagePageDisplayed() { try { scrollToText("القياسات الحيوية"); - return biometricsInformationInPreviewPage.isDisplayed(); + return isElementDisplayed(biometricsInformationInPreviewPage); } catch (Exception e) { return false; } @@ -105,6 +105,7 @@ public boolean updateUINTitleDisplayed() { } public boolean isApplicationIDPreviewPagePageDisplayed() { + waitTime(1); return isElementDisplayed(applicationIDPreviewPage); } diff --git a/ui-test/src/main/java/regclient/pages/english/BiometricDetailsPageEnglish.java b/ui-test/src/main/java/regclient/pages/english/BiometricDetailsPageEnglish.java index 40d677d75..a0dc00d7e 100644 --- a/ui-test/src/main/java/regclient/pages/english/BiometricDetailsPageEnglish.java +++ b/ui-test/src/main/java/regclient/pages/english/BiometricDetailsPageEnglish.java @@ -9,6 +9,7 @@ import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.TimeoutException; import org.openqa.selenium.WebElement; import org.openqa.selenium.remote.RemoteWebElement; import org.openqa.selenium.support.ui.ExpectedConditions; @@ -168,10 +169,10 @@ public boolean isAdditionalInfoRequestIdTextboxDisplayed() { public boolean isAutoLogoutPopupDisplayed() { try { - WebDriverWait wait = new WebDriverWait(driver, Duration.ofMinutes(10)); - wait.until(ExpectedConditions.visibilityOf(autoLogoutPopup)); + WebDriverWait shortWait = new WebDriverWait(driver, Duration.ofSeconds(3)); + shortWait.until(ExpectedConditions.visibilityOf(autoLogoutPopup)); return true; - } catch (Exception e) { + } catch (TimeoutException e) { return false; } } @@ -182,107 +183,125 @@ public RegistrationTasksPage clickOnStayLoggedInButton() { } public void enterAdditionalInfoUsingEmail(String emailId) { - final int totalTimeoutMinutes = 10; // stop after this many minutes - final int pollIntervalSeconds = 10; // poll every N seconds - final String SUFFIX = "-BIOMETRIC_CORRECTION-1"; - - long startMs = System.currentTimeMillis(); - long timeoutMs = TimeUnit.MINUTES.toMillis(totalTimeoutMinutes); - - while (System.currentTimeMillis() - startMs < timeoutMs) { - String id = null; - try { - id = OTPListener.getAdditionalReqId(emailId); - } catch (Exception e) { - // If getAdditionalReqId can throw, log and continue polling - System.out.println("OTPListener.getAdditionalReqId threw: " + e.getMessage()); - } - - if (id != null && !id.isEmpty() && !"{Failed}".equals(id)) { - String finalId = id.trim() + (id.endsWith(SUFFIX) ? "" : SUFFIX); - System.out.println("Found id: " + id + " -> finalId: " + finalId); - - // typeAndVerify should return true on success; handle its failure/exception - try { - if (typeAndVerify(additionalInfoRequestIdTextbox, finalId)) { - System.out.println("typeAndVerify succeeded."); - return; // success - } else { - throw new AssertionError("Textbox did not accept the id: " + finalId); - } - } catch (Exception e) { - // Fail fast if typing fails unexpectedly - throw new AssertionError("Failed while typing/verifying finalId: " + finalId + " : " + e.getMessage()); - } - } - - // handle auto logout popup - try { - if (isAutoLogoutPopupDisplayed()) { - System.out.println("Auto-logout popup displayed — staying logged in."); - clickOnStayLoggedInButton(); - } - } catch (Exception ignored) {} - - // log remaining time - long elapsed = System.currentTimeMillis() - startMs; - long remainingMs = Math.max(0, timeoutMs - elapsed); - System.out.println("ID not found yet. Elapsed " + (elapsed/1000) + "s, remaining " + (remainingMs/1000) + "s. Sleeping " + pollIntervalSeconds + "s."); - - try { - Thread.sleep(TimeUnit.SECONDS.toMillis(pollIntervalSeconds)); - } catch (InterruptedException ie) { - Thread.currentThread().interrupt(); - throw new AssertionError("Interrupted while waiting for AdditionalInfoReqId", ie); - } - } - - // If we reach here, timeout expired - throw new AssertionError("AdditionalInfoReqId not found within " + totalTimeoutMinutes + " minutes for " + emailId); + + final int totalTimeoutMinutes = 15; + final int pollIntervalSeconds = 20; + final String SUFFIX = "-BIOMETRIC_CORRECTION-1"; + + long startMs = System.currentTimeMillis(); + long timeoutMs = TimeUnit.MINUTES.toMillis(totalTimeoutMinutes); + + try { + logger.info("Waiting 30 seconds for email delivery..."); + Thread.sleep(30000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + + while (System.currentTimeMillis() - startMs < timeoutMs) { + + String id = null; + + try { + id = OTPListener.getAdditionalReqId(emailId); + } catch (Exception e) { + logger.info("OTPListener.getAdditionalReqId threw: {}", e.getMessage()); + } + + if (id != null) { + + String trimmedId = id.trim(); + + if (!trimmedId.isEmpty() && !"[Failed]".equals(trimmedId)) { + + String finalId = trimmedId.endsWith(SUFFIX) ? trimmedId : trimmedId + SUFFIX; + + logger.info("Found id: {} -> finalId: {}", trimmedId, finalId); + + try { + if (typeAndVerify(additionalInfoRequestIdTextbox, finalId)) { + logger.info("typeAndVerify succeeded."); + return; // SUCCESS → exit method + } else { + throw new AssertionError("Textbox did not accept the id: " + finalId); + } + } catch (Exception e) { + throw new AssertionError("Failed while typing/verifying finalId: " + finalId, e); + } + } + } + + // Handle auto logout popup (quick check version recommended) + try { + if (isAutoLogoutPopupDisplayed()) { + logger.info("Auto-logout popup displayed — staying logged in."); + clickOnStayLoggedInButton(); + } + } catch (Exception ignored) { + } + + long elapsed = System.currentTimeMillis() - startMs; + long remainingMs = Math.max(0, timeoutMs - elapsed); + + logger.info("ID not found yet. Elapsed {}s, remaining {}s. Sleeping {}s.", elapsed / 1000, + remainingMs / 1000, pollIntervalSeconds); + + try { + Thread.sleep(TimeUnit.SECONDS.toMillis(pollIntervalSeconds)); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + throw new AssertionError("Interrupted while waiting for AdditionalInfoReqId", ie); + } + } + + throw new AssertionError( + "AdditionalInfoReqId not found within " + totalTimeoutMinutes + " minutes for " + emailId); } private boolean typeAndVerify(WebElement el, String value) { - el.click(); - el.clear(); - el.sendKeys(value); + el.click(); + el.clear(); + el.sendKeys(value); - // read the visible/real value in a safe way - String curr = readElementValue(el); + // read the visible/real value in a safe way + String curr = readElementValue(el); - // exact match (keeps your previous behavior) - return value.equals(curr); + // exact match (keeps your previous behavior) + return value.equals(curr); } private String readElementValue(WebElement el) { - try { - String ctx = ""; - try { ctx = ((SupportsContextSwitching) driver).getContext(); } catch (Exception ignored) {} - - if (ctx != null && ctx.toUpperCase().contains("WEBVIEW")) { - String v = el.getAttribute("value"); - return v == null ? "" : v; - } - } catch (Exception ignored) {} - - try { - String t = el.getText(); - if (t != null && !t.isEmpty()) return t; - } catch (Exception ignored) {} - - for (String attr : new String[] {"text", "hint", "content-desc", "name"}) { - try { - String v = el.getAttribute(attr); - if (v != null && !v.isEmpty()) return v; - } catch (Exception ignored) {} - } - - return ""; - } + try { + String ctx = ""; + try { + ctx = ((SupportsContextSwitching) driver).getContext(); + } catch (Exception ignored) { + } + + if (ctx != null && ctx.toUpperCase().contains("WEBVIEW")) { + String v = el.getAttribute("value"); + return v == null ? "" : v; + } + } catch (Exception ignored) { + } + + try { + String t = el.getText(); + if (t != null && !t.isEmpty()) + return t; + } catch (Exception ignored) { + } + for (String attr : new String[] { "text", "content-desc", "name" }) { + try { + String v = el.getAttribute(attr); + if (v != null && !v.isEmpty()) + return v; + } catch (Exception ignored) { + } + } - private void sleepSeconds(int s) { - try { Thread.sleep(s * 1000L); } - catch (InterruptedException ignored) { Thread.currentThread().interrupt(); } + return ""; } private static final Logger logger = LoggerFactory.getLogger(BiometricDetailsPageEnglish.class); diff --git a/ui-test/src/main/java/regclient/pages/english/DemographicDetailsPageEnglish.java b/ui-test/src/main/java/regclient/pages/english/DemographicDetailsPageEnglish.java index 7fdb4631d..1446a4ed6 100644 --- a/ui-test/src/main/java/regclient/pages/english/DemographicDetailsPageEnglish.java +++ b/ui-test/src/main/java/regclient/pages/english/DemographicDetailsPageEnglish.java @@ -139,7 +139,8 @@ public void fillDemographicDetailsPage(String age) { boolean isdisplayed = isElementDisplayed(findElementWithRetry(MobileBy.AndroidUIAutomator( "new UiSelector().descriptionContains(\"" + FetchUiSpec.getValueUsingId(id) + "\")"))); assertTrue(isdisplayed, "Verify if " + id + " header is displayed"); - clickAndsendKeysToTextBox( + waitTime(1); + clickAndsendKeysToTextBox3( findElementWithRetry(By.xpath("//android.view.View[contains(@content-desc, \"" + FetchUiSpec.getValueUsingId(id) + "\")]/parent::android.view.View/following-sibling::android.view.View/descendant::android.widget.EditText[1]")), diff --git a/ui-test/src/main/java/regclient/pages/english/DocumentuploadPageEnglish.java b/ui-test/src/main/java/regclient/pages/english/DocumentuploadPageEnglish.java index 9b293487c..d55e50c2f 100644 --- a/ui-test/src/main/java/regclient/pages/english/DocumentuploadPageEnglish.java +++ b/ui-test/src/main/java/regclient/pages/english/DocumentuploadPageEnglish.java @@ -105,6 +105,8 @@ public void uploadDoccuments(String age, String type) { cameraPage.handleCameraPermission(); cameraPage.clickimage(); cameraPage.clickOkButton(); + waitTime(1); + applyOrientation(); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); @@ -134,6 +136,8 @@ public void uploadDoccuments(String age, String type) { cameraPage.handleCameraPermission(); cameraPage.clickimage(); cameraPage.clickOkButton(); + waitTime(1); + applyOrientation(); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); @@ -166,7 +170,9 @@ public void uploadDoccuments(String age, String type) { cameraPage.handleCameraPermission(); cameraPage.clickimage(); cameraPage.clickOkButton(); -// assertTrue(isRetakeButtonDisplayed(),"Verify if retake button displayed"); + waitTime(1); + applyOrientation(); + assertTrue(isRetakeButtonDisplayed(),"Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); assertTrue(isDoccumentUploadPageDisplayed(), @@ -205,6 +211,8 @@ public void uploadDoccumentsUpdate(String age, String type) { cameraPage.handleCameraPermission(); cameraPage.clickimage(); cameraPage.clickOkButton(); + waitTime(1); + applyOrientation(); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); @@ -233,6 +241,8 @@ public void uploadDoccumentsUpdate(String age, String type) { cameraPage.handleCameraPermission(); cameraPage.clickimage(); cameraPage.clickOkButton(); + waitTime(1); + applyOrientation(); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); diff --git a/ui-test/src/main/java/regclient/pages/english/LoginPageEnglish.java b/ui-test/src/main/java/regclient/pages/english/LoginPageEnglish.java index d5ade46d3..6a90fe4b5 100644 --- a/ui-test/src/main/java/regclient/pages/english/LoginPageEnglish.java +++ b/ui-test/src/main/java/regclient/pages/english/LoginPageEnglish.java @@ -191,6 +191,7 @@ public boolean isMosipLogoDisplayed() { public void selectLanguage() { clickOnElement(englishButton); + applyOrientation(); } public boolean isSyncCompletedSuccessfullyMessageDisplayed() { diff --git a/ui-test/src/main/java/regclient/pages/english/PreviewPageEnglish.java b/ui-test/src/main/java/regclient/pages/english/PreviewPageEnglish.java index 14c8be42d..c0db0b94f 100644 --- a/ui-test/src/main/java/regclient/pages/english/PreviewPageEnglish.java +++ b/ui-test/src/main/java/regclient/pages/english/PreviewPageEnglish.java @@ -9,6 +9,7 @@ import io.appium.java_client.AppiumDriver; import io.appium.java_client.MobileBy; +import io.appium.java_client.android.AndroidDriver; import io.appium.java_client.pagefactory.AndroidFindBy; import regclient.api.AdminTestUtil; import regclient.api.FetchUiSpec; @@ -60,17 +61,34 @@ public AuthenticationPage clickOnContinueButton() { clickOnElement(continueButton); return new AuthenticationPageEnglish(driver); } - + public boolean isDemographicInformationInPreviewPageDisplayed() { - return isElementDisplayed(demographicInformationInPreviewPage); + try { + scrollToText("Demographic Information"); + WebElement demographicInformationInPreviewPage = driver + .findElement(MobileBy.AndroidUIAutomator("new UiSelector().text(\"Demographic Information\")")); + return isElementDisplayed(demographicInformationInPreviewPage); + } catch (Exception e) { + return false; + } } - + public boolean isDocumentsInformationInPreviewPageDisplayed() { - return isElementDisplayed(documentsInformationInPreviewPage); + try { + scrollToText("Documents"); + return isElementDisplayed(documentsInformationInPreviewPage); + } catch (Exception e) { + return false; + } } public boolean isBiometricsInformationInPreviewPagePageDisplayed() { - return isElementDisplayed(biometricsInformationInPreviewPage); + try { + scrollToText("Biometrics"); + return isElementDisplayed(biometricsInformationInPreviewPage); + } catch (Exception e) { + return false; + } } @SuppressWarnings("deprecation") @@ -95,8 +113,12 @@ public boolean isBiometricCorrectionTitleDisplayed() { } public boolean isApplicationIDPreviewPagePageDisplayed() { - waitTime(1); - return isElementDisplayed(applicationIDPreviewPage); + try { + waitTime(1); + return isElementDisplayed(applicationIDPreviewPage); + } catch (Exception e) { + return false; + } } @SuppressWarnings("deprecation") @@ -143,4 +165,10 @@ public boolean isLostUinTitleDisplayed() { return isElementDisplayed(lostUinTitle); } + public void scrollToText(String text) { + ((AndroidDriver) driver) + .findElement(MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector().scrollable(true))" + + ".scrollIntoView(new UiSelector().text(\"" + text + "\"))")); + } + } diff --git a/ui-test/src/main/java/regclient/pages/english/SelectLanguagePageEnglish.java b/ui-test/src/main/java/regclient/pages/english/SelectLanguagePageEnglish.java index a0cee9683..0b4967779 100644 --- a/ui-test/src/main/java/regclient/pages/english/SelectLanguagePageEnglish.java +++ b/ui-test/src/main/java/regclient/pages/english/SelectLanguagePageEnglish.java @@ -138,6 +138,7 @@ public ConsentPage clickOnSubmitButton() { } public boolean isNotificationLanguageEnglishDisplayed() { + swipeOrScroll(); return isElementDisplayed(notificationLanguageHeaderInEnglish); } } diff --git a/ui-test/src/main/java/regclient/pages/english/SettingsPageEnglish.java b/ui-test/src/main/java/regclient/pages/english/SettingsPageEnglish.java index 0c6544fce..b592cdf25 100644 --- a/ui-test/src/main/java/regclient/pages/english/SettingsPageEnglish.java +++ b/ui-test/src/main/java/regclient/pages/english/SettingsPageEnglish.java @@ -70,7 +70,7 @@ public class SettingsPageEnglish extends SettingsPage { @AndroidFindBy(accessibility = "Device Settings\nTab 3 of 3") private WebElement deviceSettingsTab; - @AndroidFindBy(accessibility = "Global Config Settings\nKey\nServer Value\nLocal Value") + @AndroidFindBy(xpath ="//android.widget.EditText/preceding::android.view.View[contains(@content-desc,'Global Config Settings')][1]") private WebElement globalConfigSettingsHeader; @AndroidFindBy(accessibility = "SUBMIT") @@ -279,5 +279,10 @@ public void clickOnSyncButton(String jobName) { By syncButton = By.xpath("//android.widget.EditText[contains(@hint,'" + jobName + "')]"); click(syncButton); } + + public boolean isGlobalConfigSettingsSearchBoxDisplayed() { + By searchBox = By.xpath("//android.view.View[@content-desc='Global Config Settings']//android.widget.EditText"); + return isElementDisplayed(searchBox); + } } diff --git a/ui-test/src/main/java/regclient/pages/english/UpdateOperatorBiometricspageEnglish.java b/ui-test/src/main/java/regclient/pages/english/UpdateOperatorBiometricspageEnglish.java index b3521b8de..36450972b 100644 --- a/ui-test/src/main/java/regclient/pages/english/UpdateOperatorBiometricspageEnglish.java +++ b/ui-test/src/main/java/regclient/pages/english/UpdateOperatorBiometricspageEnglish.java @@ -122,7 +122,7 @@ public UpdateOperatorBiometricspageEnglish(AppiumDriver driver) { @AndroidFindBy(accessibility = "Marking exceptions on Face is not allowed") private WebElement markingExceptionsOnFaceIsNotAllowedText; - @AndroidFindBy(xpath = "//android.widget.ScrollView/android.view.View[3]") + @AndroidFindBy(uiAutomator = "new UiSelector().className(\"android.view.View\").clickable(true)") private WebElement zoomButton; @AndroidFindBy(xpath = "//android.view.View[contains(@content-desc, \"Threshold\")]/following-sibling::android.view.View") @@ -294,8 +294,7 @@ public boolean isMarkingExceptionsOnFaceIsNotAllowedTextDisplayed() { } public boolean isZoomButtonDisplayed() { - return true; -// return isElementDisplayed(zoomButton); + return isElementDisplayed(zoomButton); } public void clickOnRightHandScanTitle() { diff --git a/ui-test/src/main/java/regclient/pages/french/ApplicantBiometricsPageFrench.java b/ui-test/src/main/java/regclient/pages/french/ApplicantBiometricsPageFrench.java index f331a2bdb..7e8af08d0 100644 --- a/ui-test/src/main/java/regclient/pages/french/ApplicantBiometricsPageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/ApplicantBiometricsPageFrench.java @@ -158,7 +158,7 @@ public void clickOnIrisScanButton() { public BiometricDetailsPage clickOnNextButton() { clickOnElement(nextButton); - return new BiometricDetailsPageEnglish(driver); + return new BiometricDetailsPageFrench(driver); } public void clickOnZoomButton() { diff --git a/ui-test/src/main/java/regclient/pages/french/AutoLogoutPageFrench.java b/ui-test/src/main/java/regclient/pages/french/AutoLogoutPageFrench.java index ba1e02bf1..5472e7078 100644 --- a/ui-test/src/main/java/regclient/pages/french/AutoLogoutPageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/AutoLogoutPageFrench.java @@ -14,18 +14,17 @@ public class AutoLogoutPageFrench extends AutoLogoutPage { - @AndroidFindBy(uiAutomator = "new UiSelector().descriptionContains(\"You have been idle\")") + @AndroidFindBy(uiAutomator = "new UiSelector().descriptionContains(\"Tu as été inactif\")") private WebElement autoLogoutPopup; @AndroidFindBy(accessibility = "LOG OUT") private WebElement logoutButton; - @AndroidFindBy(accessibility = "STAY LOGGED IN") + @AndroidFindBy(accessibility = "DÉCONNEXION") private WebElement stayLoggedInButton; public AutoLogoutPageFrench(AppiumDriver driver) { super(driver); - // TODO Auto-generated constructor stub } public boolean isAutoLogoutPopupDisplayed() { diff --git a/ui-test/src/main/java/regclient/pages/french/BiometricDetailsPageFrench.java b/ui-test/src/main/java/regclient/pages/french/BiometricDetailsPageFrench.java index e4fa17c98..2e1883443 100644 --- a/ui-test/src/main/java/regclient/pages/french/BiometricDetailsPageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/BiometricDetailsPageFrench.java @@ -1,8 +1,13 @@ package regclient.pages.french; +import java.time.Duration; +import java.util.concurrent.TimeUnit; + import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -15,6 +20,9 @@ import regclient.page.BiometricDetailsPage; import regclient.page.IntroducerBiometricPage; import regclient.page.PreviewPage; +import regclient.page.RegistrationTasksPage; +import regclient.pages.arabic.BiometricDetailsPageArabic; +import regclient.pages.arabic.RegistrationTasksPageArabic; import regclient.pages.english.ApplicantBiometricsPageEnglish; import regclient.pages.english.BiometricDetailsPageEnglish; import regclient.pages.english.IntroducerBiometricPageEnglish; @@ -45,10 +53,16 @@ public class BiometricDetailsPageFrench extends BiometricDetailsPage { @AndroidFindBy(accessibility = "CONTINUER") private WebElement continueButton; - + @AndroidFindBy(xpath = "//android.widget.EditText[contains(@hint, \"Identifiant de la demande d'information supplémentaire\")]") private WebElement additionalInfoRequestIdTextbox; + @AndroidFindBy(accessibility = "DÉCONNEXION") + private WebElement stayLoggedInButton; + + @AndroidFindBy(uiAutomator = "new UiSelector().className(\"android.view.View\").descriptionContains(\"Tu as été\")") + private WebElement autoLogoutPopup; + public BiometricDetailsPageFrench(AppiumDriver driver) { super(driver); } @@ -101,7 +115,7 @@ public ApplicantBiometricsPage clickOnExceptionScanIcon() { public IntroducerBiometricPage clickOnIntroducerIrisScan() { clickOnElement(findElementWithRetry(By.xpath("//android.view.View[contains(@content-desc,\"" + FetchUiSpec.getValueUsingId("introducerBiometrics") - + "\")]/following-sibling::android.view.View/descendant::android.view.View/descendant::android.widget.ImageView[@content-desc=\"Iris Scan\"]"))); + + "\")]/following-sibling::android.view.View/descendant::android.view.View/descendant::android.widget.ImageView[@content-desc=\"Iris ANALYSE\"]"))); return new IntroducerBiometricPageFrench(driver); } @@ -109,7 +123,7 @@ public IntroducerBiometricPage clickOnIntroducerIrisScan() { public IntroducerBiometricPage clickOnIntroducerRightHandScan() { clickOnElement(findElementWithRetry(By.xpath("//android.view.View[contains(@content-desc,\"" + FetchUiSpec.getValueUsingId("introducerBiometrics") - + "\")]/following-sibling::android.view.View/descendant::android.view.View/descendant::android.widget.ImageView[@content-desc=\"Right\"]"))); + + "\")]/following-sibling::android.view.View/descendant::android.view.View/descendant::android.widget.ImageView[@content-desc=\"Main droite ANALYSE\"]"))); return new IntroducerBiometricPageFrench(driver); } @@ -117,7 +131,7 @@ public IntroducerBiometricPage clickOnIntroducerRightHandScan() { public IntroducerBiometricPage clickOnIntroducerLeftHandScan() { clickOnElement(findElementWithRetry(By.xpath("//android.view.View[contains(@content-desc,\"" + FetchUiSpec.getValueUsingId("introducerBiometrics") - + "\")]/following-sibling::android.view.View/descendant::android.view.View/descendant::android.widget.ImageView[@content-desc=\"Left\"]"))); + + "\")]/following-sibling::android.view.View/descendant::android.view.View/descendant::android.widget.ImageView[@content-desc=\"Main gauche ANALYSE\"]"))); return new IntroducerBiometricPageFrench(driver); } @@ -125,7 +139,7 @@ public IntroducerBiometricPage clickOnIntroducerLeftHandScan() { public IntroducerBiometricPage clickOnIntroducerThumbScan() { clickOnElement(findElementWithRetry(By.xpath("//android.view.View[contains(@content-desc,\"" + FetchUiSpec.getValueUsingId("introducerBiometrics") - + "\")]/following-sibling::android.view.View/descendant::android.view.View/descendant::android.widget.ImageView[@content-desc=\"Thumbs\"]"))); + + "\")]/following-sibling::android.view.View/descendant::android.view.View/descendant::android.widget.ImageView[@content-desc=\"Pouces ANALYSE\"]"))); return new IntroducerBiometricPageFrench(driver); } @@ -133,7 +147,7 @@ public IntroducerBiometricPage clickOnIntroducerThumbScan() { public IntroducerBiometricPage clickOnIntroducerFaceScan() { clickOnElement(findElementWithRetry(By.xpath("//android.view.View[contains(@content-desc,\"" + FetchUiSpec.getValueUsingId("introducerBiometrics") - + "\")]/following-sibling::android.view.View/descendant::android.view.View/descendant::android.widget.ImageView[@content-desc=\"Face\"]"))); + + "\")]/following-sibling::android.view.View/descendant::android.view.View/descendant::android.widget.ImageView[@content-desc=\"Visage ANALYSE\"]"))); return new IntroducerBiometricPageFrench(driver); } @@ -147,47 +161,94 @@ public boolean isAdditionalInfoRequestIdTextboxDisplayed() { return isElementDisplayed(additionalInfoRequestIdTextbox); } + public RegistrationTasksPage clickOnStayLoggedInButton() { + clickOnElement(stayLoggedInButton); + return new RegistrationTasksPageArabic(driver); + } + + private void typeAndVerify(WebElement el, String value) { + el.click(); + el.clear(); + el.sendKeys(value); + } + + public boolean isAutoLogoutPopupDisplayed() { + try { + WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(3)); + wait.until(ExpectedConditions.visibilityOf(autoLogoutPopup)); + return true; + } catch (Exception e) { + return false; + } + } + public void enterAdditionalInfoUsingEmail(String emailId) { - int retries = 20, waitSeconds = 10; + + final int totalTimeoutMinutes = 15; + final int pollIntervalSeconds = 20; final String SUFFIX = "-BIOMETRIC_CORRECTION-1"; - for (int i = 1; i <= retries; i++) { - String id = OTPListener.getAdditionalReqId(emailId); - if (id != null && !id.isEmpty() && !id.equals("{Failed}")) { - String sanitized = id.trim().replaceAll("\\p{C}", ""); - String finalId = sanitized.endsWith(SUFFIX) ? sanitized : sanitized + SUFFIX; + long startMs = System.currentTimeMillis(); + long timeoutMs = TimeUnit.MINUTES.toMillis(totalTimeoutMinutes); - try { - WebElement el = additionalInfoRequestIdTextbox; - try { - el.clear(); - el.sendKeys(finalId); - } catch (Exception ignored) { - } - if (finalId.equals(el.getAttribute("value"))) - return; + try { + logger.info("Waiting 30 seconds for email delivery..."); + Thread.sleep(30000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + + while (System.currentTimeMillis() - startMs < timeoutMs) { + + String id = null; + + try { + id = OTPListener.getAdditionalReqId(emailId.trim().toLowerCase()); + logger.info("Polled raw id = [" + id + "]"); + } catch (Exception e) { + logger.info("Error fetching id: " + e.getMessage()); + } - ((JavascriptExecutor) driver).executeScript( - "arguments[0].value=arguments[1];arguments[0].dispatchEvent(new Event('input',{bubbles:true}));", - el, finalId); - if (finalId.equals(el.getAttribute("value"))) + if (id != null) { + id = id.trim(); + if (!id.isEmpty()) { + String finalId = id.endsWith(SUFFIX) ? id : id + SUFFIX; + logger.info("Using finalId = " + finalId); + try { + typeAndVerify(additionalInfoRequestIdTextbox, finalId); + logger.info("Successfully entered: " + finalId); return; - } catch (Exception e) { - logger.error("Enter ID failed: ", e); + } catch (Exception e) { + throw new AssertionError("Failed while typing finalId: " + finalId + " : " + e.getMessage(), e); + } } - throw new RuntimeException("Textbox not accepting: " + finalId); } - sleepSeconds(waitSeconds); - } - throw new RuntimeException("AdditionalInfoReqId not found after wait."); - } - private void sleepSeconds(int s) { - try { - Thread.sleep(s * 1000L); - } catch (InterruptedException ignored) { - Thread.currentThread().interrupt(); + try { + WebDriverWait shortWait = new WebDriverWait(driver, Duration.ofSeconds(3)); + shortWait.until(ExpectedConditions.visibilityOf(autoLogoutPopup)); + logger.info("Auto logout popup detected. Clicking Stay Logged In."); + clickOnStayLoggedInButton(); + } catch (Exception ignored) { + + } + + long elapsed = System.currentTimeMillis() - startMs; + long remainingMs = Math.max(0, timeoutMs - elapsed); + + logger.info("ID not found. Elapsed " + (elapsed / 1000) + "s, remaining " + (remainingMs / 1000) + + "s. Sleeping " + pollIntervalSeconds + "s."); + + try { + Thread.sleep(TimeUnit.SECONDS.toMillis(pollIntervalSeconds)); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + throw new AssertionError("Interrupted while waiting for AdditionalInfoReqId", ie); + } } + + throw new AssertionError( + "AdditionalInfoReqId not found within " + totalTimeoutMinutes + " minutes for " + emailId); } private static final Logger logger = LoggerFactory.getLogger(BiometricDetailsPageFrench.class); diff --git a/ui-test/src/main/java/regclient/pages/french/DashboardPageFrench.java b/ui-test/src/main/java/regclient/pages/french/DashboardPageFrench.java index 326c594d3..52a18874d 100644 --- a/ui-test/src/main/java/regclient/pages/french/DashboardPageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/DashboardPageFrench.java @@ -8,19 +8,19 @@ public class DashboardPageFrench extends DashboardPage { - @AndroidFindBy(xpath = "//android.view.View[@content-desc=\"Dashboard\"]/following-sibling::android.view.View[3]") + @AndroidFindBy(xpath = "//android.view.View[@content-desc=\"Tableau de bord\"]/following-sibling::android.view.View[3]") private WebElement packetUploadedNumber; - @AndroidFindBy(xpath = "//android.view.View[@content-desc=\"Dashboard\"]/following-sibling::android.view.View[2]") + @AndroidFindBy(xpath = "//android.view.View[@content-desc=\"Tableau de bord\"]/following-sibling::android.view.View[2]") private WebElement packetSyncedNumber; @AndroidFindBy(accessibility = "Tableau de bord") private WebElement dashboardPageTitle; - @AndroidFindBy(xpath = "//android.view.View[contains(@content-desc, \"Identifiant utilisateur\")]") + @AndroidFindBy(xpath = "//android.view.View[contains(@content-desc, \"ID de l'utilisateur\")]") private WebElement userIDTitle; - @AndroidFindBy(xpath = "//android.view.View[contains(@content-desc, \"Nom d’utilisateur\")]") + @AndroidFindBy(xpath = "//android.view.View[contains(@content-desc, \"Nom d'utilisateur\")]") private WebElement userNameTitle; @AndroidFindBy(xpath = "//android.view.View[contains(@content-desc, \"Statut\")]") diff --git a/ui-test/src/main/java/regclient/pages/french/DemographicDetailsPageFrench.java b/ui-test/src/main/java/regclient/pages/french/DemographicDetailsPageFrench.java index 1ff0b1429..fb6c798a3 100644 --- a/ui-test/src/main/java/regclient/pages/french/DemographicDetailsPageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/DemographicDetailsPageFrench.java @@ -10,6 +10,7 @@ import org.openqa.selenium.By; import org.openqa.selenium.WebElement; +import io.appium.java_client.AppiumBy; import io.appium.java_client.AppiumDriver; import io.appium.java_client.MobileBy; import io.appium.java_client.pagefactory.AndroidFindBy; @@ -50,8 +51,9 @@ public class DemographicDetailsPageFrench extends DemographicDetailsPage { @AndroidFindBy(xpath = "//android.widget.Button[@content-desc='RÉCUPÉRER DES DONNÉES']/following-sibling::android.widget.Button") private WebElement scanButton; - @AndroidFindBy(accessibility = "Postal/ بريدي") - private WebElement postalHeader; + @AndroidFindBy(xpath = "//android.view.View[contains(@content-desc,'Non-Foreigner') or " + + "contains(@content-desc,'Non-étranger')]") + private WebElement nonForeignerOption; public DemographicDetailsPageFrench(AppiumDriver driver) { super(driver); @@ -88,12 +90,10 @@ public ConsentPage clickOnPageTitle(String pageKey) { public DocumentUploadPage clickOnContinueButton() { clickOnElement(continueButton); return new DocumentUploadPageFrench(driver); - } public boolean isContinueButtonEnable() { return isElementEnabled(continueButton); - } public boolean isPreRegFetchDataTextBoxDisplay() { @@ -204,7 +204,8 @@ else if (age.equals("currentCalenderDate")) { clickOnElement(dropdownElement); waitTime(2); if (!isElementDisplayed(dropdownElement)) { - clickOnElement(findElement(By.className("android.view.View"))); +// clickOnElement(findElement(By.className("android.view.View"))); + clickOnElement(nonForeignerOption); } else if (isElementDisplayed(dropdownElement)) { swipeOrScroll(); clickOnElement(dropdownElement); @@ -418,15 +419,13 @@ public void fillIntroducerDetailsInDemographicDetailsPage(String age) { public void fetchPreregApplicationId(String age) { By appIdLabel = By.xpath("//android.widget.EditText[contains(@hint,'Application ID')]"); - By appIdTextbox = By.xpath("//android.widget.EditText[contains(@hint,'Please Enter Application ID')]"); + By appIdTextbox = By.xpath("(//android.widget.ScrollView//android.widget.EditText)[1]"); - // Verify label is displayed boolean isDisplayed = isElementDisplayed(appIdLabel); assertTrue(isDisplayed, "Verify if Application ID label is displayed"); - // Enter prereg ID applicationIdTextBox = findElementWithRetry(appIdTextbox); - clickAndsendKeysToTextBox(applicationIdTextBox, AdminTestUtil.getPreRegistrationFlow(age)); + clickAndsendKeysToTextBox3(applicationIdTextBox, AdminTestUtil.getPreRegistrationFlow(age)); clickOnElement(fetchDataButton); } diff --git a/ui-test/src/main/java/regclient/pages/french/DocumentUploadPageFrench.java b/ui-test/src/main/java/regclient/pages/french/DocumentUploadPageFrench.java index 126e3a54e..30316b2bd 100644 --- a/ui-test/src/main/java/regclient/pages/french/DocumentUploadPageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/DocumentUploadPageFrench.java @@ -106,6 +106,8 @@ public void uploadDoccuments(String age, String type) { cameraPage.handleCameraPermission(); cameraPage.clickimage(); cameraPage.clickOkButton(); + waitTime(1); + applyOrientation(); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); @@ -113,6 +115,7 @@ public void uploadDoccuments(String age, String type) { "Verify if doccumentupload page is displayed after upload of " + FetchUiSpec.getValueUsingId(id)); } else { + waitTime(1); clickOnElement(findElementWithRetry( By.xpath("//android.view.View[contains(@content-desc, \"" + FetchUiSpec.getValueUsingId(id) + "\")]/parent::android.view.View/parent::android.view.View"))); @@ -122,6 +125,7 @@ public void uploadDoccuments(String age, String type) { "//android.view.View[contains(@content-desc, \"" + FetchUiSpec.getValueUsingId(id) + "\")]/parent::android.view.View/parent::android.view.View"))); } + waitTime(1); clickOnElement(PopUpCloseButton); waitTime(1); boolean isEnabled = isElementEnabled(findElementWithRetry( @@ -134,10 +138,14 @@ public void uploadDoccuments(String age, String type) { CameraPage cameraPage = new CameraPage(driver); cameraPage.handleCameraPermission(); cameraPage.clickimage(); + waitTime(1); cameraPage.clickOkButton(); + waitTime(1); + applyOrientation(); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); + scrollToTop(); assertTrue(isDoccumentUploadPageDisplayed(), "Verify if doccumentupload page is displayed after upload of " + FetchUiSpec.getValueUsingId(id)); @@ -145,6 +153,7 @@ public void uploadDoccuments(String age, String type) { } if (id.equals("proofOfRelationship")) { if (age.equals("minor") || age.equals("infant") || age.equals("currentCalenderDate")) { + waitTime(1); clickOnElement(findElementWithRetry( By.xpath("//android.view.View[contains(@content-desc, \"" + FetchUiSpec.getValueUsingId(id) + "\")]/parent::android.view.View/parent::android.view.View"))); @@ -154,6 +163,7 @@ public void uploadDoccuments(String age, String type) { "//android.view.View[contains(@content-desc, \"" + FetchUiSpec.getValueUsingId(id) + "\")]/parent::android.view.View/parent::android.view.View"))); } + waitTime(1); clickOnElement(PopUpCloseButton); waitTime(1); boolean isEnabled = isElementEnabled(findElementWithRetry( @@ -166,7 +176,10 @@ public void uploadDoccuments(String age, String type) { CameraPage cameraPage = new CameraPage(driver); cameraPage.handleCameraPermission(); cameraPage.clickimage(); + waitTime(1); cameraPage.clickOkButton(); + waitTime(1); + applyOrientation(); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); @@ -180,6 +193,7 @@ public void uploadDoccuments(String age, String type) { } public void uploadDoccumentsUpdate(String age, String type) { + scrollToTop(); List idList = FetchUiSpec.getAllIds("Documents"); for (String id : idList) { if (type.equals("all") && !id.equals("proofOfException") && !id.equals("proofOfRelationship")) { @@ -205,6 +219,8 @@ public void uploadDoccumentsUpdate(String age, String type) { cameraPage.handleCameraPermission(); cameraPage.clickimage(); cameraPage.clickOkButton(); + waitTime(1); + applyOrientation(); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); @@ -233,6 +249,8 @@ public void uploadDoccumentsUpdate(String age, String type) { cameraPage.handleCameraPermission(); cameraPage.clickimage(); cameraPage.clickOkButton(); + waitTime(1); + applyOrientation(); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); diff --git a/ui-test/src/main/java/regclient/pages/french/LoginPageFrench.java b/ui-test/src/main/java/regclient/pages/french/LoginPageFrench.java index 5761879f8..e6365e53c 100644 --- a/ui-test/src/main/java/regclient/pages/french/LoginPageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/LoginPageFrench.java @@ -48,7 +48,7 @@ public LoginPageFrench(AppiumDriver driver) { @AndroidFindBy(accessibility = "PRÉCÉDENT") private WebElement backButton; - @AndroidFindBy(accessibility = "Mot de passe oublié?") + @AndroidFindBy(accessibility = "MOT DE PASSE OUBLIÉ ?") private WebElement forgetPasswordButton; @AndroidFindBy(accessibility = "Utilisateur introuvable !") diff --git a/ui-test/src/main/java/regclient/pages/french/OnBoardPageFrench.java b/ui-test/src/main/java/regclient/pages/french/OnBoardPageFrench.java index 759f1c998..fcf06bca0 100644 --- a/ui-test/src/main/java/regclient/pages/french/OnBoardPageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/OnBoardPageFrench.java @@ -19,7 +19,7 @@ public class OnBoardPageFrench extends OnBoardPage { @AndroidFindBy(accessibility = "PASSEZ À LA MAISON") private WebElement skipToHomeScreenButton; - @AndroidFindBy(accessibility = "Veuillez appuyer sur 'S'INSCRIRE' pour commencer le processus d'intégration.") + @AndroidFindBy(uiAutomator = "new UiSelector().descriptionContains(\"INSCRIRE\")") private WebElement onBoardWelcomeMessage; public OnBoardPageFrench(AppiumDriver driver) { diff --git a/ui-test/src/main/java/regclient/pages/french/OperationalTaskPageFrench.java b/ui-test/src/main/java/regclient/pages/french/OperationalTaskPageFrench.java index 2703af730..42bf16bb3 100644 --- a/ui-test/src/main/java/regclient/pages/french/OperationalTaskPageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/OperationalTaskPageFrench.java @@ -9,7 +9,7 @@ public class OperationalTaskPageFrench extends OperationalTaskPage { - @AndroidFindBy(accessibility = "Mettre à jour les données biométriques de l'opérateur") + @AndroidFindBy(uiAutomator = "new UiSelector().descriptionContains(\"Mettre à jour les données biométriques\")") private WebElement updateOperatorBiometricsButton; @AndroidFindBy(accessibility = "Tâches opérationnelles") diff --git a/ui-test/src/main/java/regclient/pages/french/PreviewPageFrench.java b/ui-test/src/main/java/regclient/pages/french/PreviewPageFrench.java index 4b40ed07e..b51b5b649 100644 --- a/ui-test/src/main/java/regclient/pages/french/PreviewPageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/PreviewPageFrench.java @@ -5,6 +5,7 @@ import io.appium.java_client.AppiumDriver; import io.appium.java_client.MobileBy; +import io.appium.java_client.android.AndroidDriver; import io.appium.java_client.pagefactory.AndroidFindBy; import regclient.api.AdminTestUtil; import regclient.api.FetchUiSpec; @@ -39,13 +40,13 @@ public class PreviewPageFrench extends PreviewPage { @AndroidFindBy(accessibility = "CONTINUER") private WebElement continueButton; - + @AndroidFindBy(xpath = "//android.view.View[contains(@text,'Email')]/../following-sibling::android.view.View[1]") private WebElement emailIdPreviewPage; - + @AndroidFindBy(accessibility = "UIN perdu") private WebElement lostUinTitle; - + @AndroidFindBy(accessibility = "Correction biométrique") private WebElement biometricCorrectionTitle; @@ -59,15 +60,30 @@ public AuthenticationPage clickOnContinueButton() { } public boolean isDemographicInformationInPreviewPageDisplayed() { - return isElementDisplayed(demographicInformationInPreviewPage); + try { + scrollToText("Informations démographiques"); + return isElementDisplayed(demographicInformationInPreviewPage); + } catch (Exception e) { + return false; + } } public boolean isDocumentsInformationInPreviewPageDisplayed() { - return isElementDisplayed(documentsInformationInPreviewPage); + try { + scrollToText("Documents"); + return isElementDisplayed(documentsInformationInPreviewPage); + } catch (Exception e) { + return false; + } } public boolean isBiometricsInformationInPreviewPagePageDisplayed() { - return isElementDisplayed(biometricsInformationInPreviewPage); + try { + scrollToText("Biométrie"); + return isElementDisplayed(biometricsInformationInPreviewPage); + } catch (Exception e) { + return false; + } } @SuppressWarnings("deprecation") @@ -84,7 +100,12 @@ public boolean updateUINTitleDisplayed() { } public boolean isApplicationIDPreviewPagePageDisplayed() { - return isElementDisplayed(applicationIDPreviewPage); + try { + scrollToText("Application ID"); + return isElementDisplayed(applicationIDPreviewPage); + } catch (Exception e) { + return false; + } } @SuppressWarnings("deprecation") @@ -115,23 +136,27 @@ public String getAID() { public void validatePreRegAndApplicationIdMatch(String age) { String preRegId = AdminTestUtil.getPreRegistrationFlow(age); - String applicationID = getAID(); - Assert.assertEquals(applicationID, preRegId, "Mismatch between API PreReg ID and UI Application ID!"); } public String getEmailId() { - String emailId = getTextFromLocator(emailIdPreviewPage) - .replaceAll(".*?([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}).*", "$1"); - return emailId; + String emailId = getTextFromLocator(emailIdPreviewPage) + .replaceAll(".*?([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}).*", "$1"); + return emailId; } public boolean isLostUinTitleDisplayed() { return isElementDisplayed(lostUinTitle); } - + public boolean isBiometricCorrectionTitleDisplayed() { return isElementDisplayed(biometricCorrectionTitle); } + + public void scrollToText(String text) { + ((AndroidDriver) driver) + .findElement(MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector().scrollable(true))" + + ".scrollIntoView(new UiSelector().text(\"" + text + "\"))")); + } } diff --git a/ui-test/src/main/java/regclient/pages/french/RegistrationTasksPageFrench.java b/ui-test/src/main/java/regclient/pages/french/RegistrationTasksPageFrench.java index 809d10cde..a782687e1 100644 --- a/ui-test/src/main/java/regclient/pages/french/RegistrationTasksPageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/RegistrationTasksPageFrench.java @@ -23,7 +23,7 @@ public RegistrationTasksPageFrench(AppiumDriver driver) { @AndroidFindBy(accessibility = "Tâches opérationnelles") private WebElement operationalTaskPageTitle; - @AndroidFindBy(uiAutomator = "UiSelector().className(\"android.widget.ImageView\").instance(2)") + @AndroidFindBy(uiAutomator = "new UiSelector().descriptionContains(\"Tableau de bord\")") private WebElement dashboardButton; @AndroidFindBy(accessibility = "Nouvelle inscription") @@ -140,7 +140,7 @@ public void clickSynchronizeDataButton() { public boolean checkLastSyncDate() { String contentDesc = synchronizeDataButton.getAttribute("content-desc"); - if (contentDesc.contains("Synchronize Data\n" + getCurrentDateWord() + ",")) + if (contentDesc.contains("Synchroniser les données\n" + getCurrentDateWord() + ",")) return true; else return false; diff --git a/ui-test/src/main/java/regclient/pages/french/SettingsPageFrench.java b/ui-test/src/main/java/regclient/pages/french/SettingsPageFrench.java index 4dc2d6ac9..377dbda69 100644 --- a/ui-test/src/main/java/regclient/pages/french/SettingsPageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/SettingsPageFrench.java @@ -23,13 +23,13 @@ public class SettingsPageFrench extends SettingsPage { private final AppiumDriver driver; - @AndroidFindBy(accessibility = "Scheduled Jobs Settings\nTab 1 of 3") + @AndroidFindBy(uiAutomator = "new UiSelector().descriptionContains(\"Paramètres des travaux planifiés\")") private WebElement scheduledJobsSettingsTab; - @AndroidFindBy(accessibility = "Global Config Settings\nTab 2 of 3") + @AndroidFindBy(uiAutomator = "new UiSelector().descriptionContains(\"Paramètres de configuration globale\")") private WebElement globalConfigSettingsTab; - @AndroidFindBy(accessibility = "Device Settings\nTab 3 of 3") + @AndroidFindBy(uiAutomator = "new UiSelector().descriptionContains(\"Réglages de l'appareil\")") private WebElement deviceSettingsTab; @AndroidFindBy(accessibility = "Key\nServer Value\nLocal Value") @@ -41,10 +41,10 @@ public class SettingsPageFrench extends SettingsPage { @AndroidFindBy(accessibility = "No changes to save") private WebElement noChangesToSave; - @AndroidFindBy(accessibility = "Device Settings") + @AndroidFindBy(accessibility = "Réglages de l'appareil") private WebElement deviceSettingsPage; - @AndroidFindBy(accessibility = "Scan Now") + @AndroidFindBy(accessibility = "ANALYSE") private WebElement scanNowButton; @AndroidFindBy(accessibility = "ID: e88198714e67562c\nName: io.mosip.mock.sbi.face\nStatus: Ready") @@ -68,7 +68,7 @@ public class SettingsPageFrench extends SettingsPage { @AndroidFindBy(accessibility = "CANCEL") private WebElement changesCancelButton; - @AndroidFindBy(accessibility = "Scheduled Job Settings") + @AndroidFindBy(accessibility = "Paramètres des tâches planifiées") private WebElement scheduledJobSettingsPageHeader; @AndroidFindBy(xpath = "//*[@content-desc[contains(.,'Master Data Sync')]]") diff --git a/ui-test/src/main/java/regclient/pages/french/SupervisorBiometricVerificationpageFrench.java b/ui-test/src/main/java/regclient/pages/french/SupervisorBiometricVerificationpageFrench.java index 80eaf7125..b800975d6 100644 --- a/ui-test/src/main/java/regclient/pages/french/SupervisorBiometricVerificationpageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/SupervisorBiometricVerificationpageFrench.java @@ -8,10 +8,10 @@ public class SupervisorBiometricVerificationpageFrench extends SupervisorBiometricVerificationpage { - @AndroidFindBy(accessibility = "Vérification biométrique du superviseur") + @AndroidFindBy(accessibility = "Enrôler les données biométriques de l'opérateur") private WebElement operatorBiometricVerificationPageTitle; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Iris\"))") + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Iris ANALYSE\"))") private WebElement irisScanIcon; @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Main droite\"))") @@ -89,7 +89,7 @@ public class SupervisorBiometricVerificationpageFrench extends SupervisorBiometr @AndroidFindBy(accessibility = "Marquage des exceptions sur Visage n'est pas autorisé") private WebElement markingExceptionsOnFaceIsNotAllowedText; - @AndroidFindBy(xpath = "//android.widget.ScrollView/android.view.View[3]") + @AndroidFindBy(uiAutomator = "new UiSelector().className(\"android.view.View\").clickable(true)") private WebElement zoomButton; @AndroidFindBy(accessibility = "Permanent") diff --git a/ui-test/src/main/java/regclient/pages/french/UpdateOperatorBiometricspageFrench.java b/ui-test/src/main/java/regclient/pages/french/UpdateOperatorBiometricspageFrench.java index d95312961..c5c0ab81b 100644 --- a/ui-test/src/main/java/regclient/pages/french/UpdateOperatorBiometricspageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/UpdateOperatorBiometricspageFrench.java @@ -98,7 +98,7 @@ public UpdateOperatorBiometricspageFrench(AppiumDriver driver) { @AndroidFindBy(accessibility = "Marquage des exceptions sur Visage n'est pas autorisé") private WebElement markingExceptionsOnFaceIsNotAllowedText; - @AndroidFindBy(xpath = "//android.widget.ScrollView/android.view.View[3]") + @AndroidFindBy(uiAutomator = "new UiSelector().className(\"android.view.View\").clickable(true)") private WebElement zoomButton; @AndroidFindBy(accessibility = "Permanent") diff --git a/ui-test/src/main/resources/DesiredCapabilities.json b/ui-test/src/main/resources/DesiredCapabilities.json index c32db4bf8..2b34fb15b 100644 --- a/ui-test/src/main/resources/DesiredCapabilities.json +++ b/ui-test/src/main/resources/DesiredCapabilities.json @@ -12,7 +12,7 @@ "appium:autoGrantPermissions": true, "appium:shouldTerminateApp": true, "appium:noSign": true, - "appium:newCommandTimeout": 3600, + "appium:newCommandTimeout": 7600, "appium:dontStopAppOnReset": true, "appium:appWaitForLaunch": false, diff --git a/ui-test/src/main/resources/config/Kernel.properties b/ui-test/src/main/resources/config/Kernel.properties index 9982350bc..d7f28cfbe 100644 --- a/ui-test/src/main/resources/config/Kernel.properties +++ b/ui-test/src/main/resources/config/Kernel.properties @@ -57,9 +57,13 @@ mosip_testrig_client_id=mosip-testrig-client mosip_testrig_client_secret= keycloak-realm-id=mosip iam-users-to-create=32 +iam-users-to-create-operator=33 +iam-users-to-create-onboarder=onboard #iam-users-to-create=111997,220005,111992 iam-users-password=mosip123 roles=GLOBAL_ADMIN,ID_AUTHENTICATION,PARTNER_ADMIN,PMS_ADMIN,POLICYMANAGER,REGISTRATION_ADMIN,REGISTRATION_SUPERVISOR,ZONAL_ADMIN,Default +rolesForOperator=GLOBAL_ADMIN,ID_AUTHENTICATION,PARTNER_ADMIN,PMS_ADMIN,POLICYMANAGER,REGISTRATION_OPERATOR,ZONAL_ADMIN,Default +rolesForOnboarder=GLOBAL_ADMIN,REGISTRATION_ADMIN,REGISTRATION_SUPERVISOR,REGISTRATION_OPERATOR,ZONAL_ADMIN,Default roles.globaladmin=GLOBAL_ADMIN,REGISTRATION_ADMIN,uma_authorization,ZONAL_ADMIN,default-roles-mosip##DB_Connectivity driver_class=org.postgresql.Driver pool_size=1 diff --git a/ui-test/src/main/resources/testdata.json b/ui-test/src/main/resources/testdata.json index 366a52e81..d544bae09 100644 --- a/ui-test/src/main/resources/testdata.json +++ b/ui-test/src/main/resources/testdata.json @@ -5,6 +5,7 @@ "language": "eng", "defaultlanguage": "eng", "notificationLanguage": "eng", + "orientation": "portrait", "RID": "10001142850000120251130090022", "id": "com.motorola.camera3:id/capture_bar_shutter_button", "fingerprint_threshold": "45"