From cdd838eee2c2138c1d1af3ca74d12569962bba40 Mon Sep 17 00:00:00 2001 From: damodarguru Date: Thu, 26 Mar 2026 09:31:07 +0530 Subject: [PATCH 1/5] MOSIP-44310:Fix and optimize ARC UI automation failures. Signed-off-by: damodarguru --- .../androidTestCases/BiometricCorrection.java | 136 ++++++++------- .../androidTestCases/ExportPacket.java | 57 +++++-- .../regclient/androidTestCases/LoginTest.java | 66 ++++++++ .../regclient/androidTestCases/LostUin.java | 41 +++-- .../NewRegistrationAdult.java | 7 +- .../NewRegistrationAdultException.java | 2 +- ...strationAdultUploadMultipleDoccuments.java | 10 +- .../NewRegistrationMinorException.java | 4 +- .../PreRegFetchingPacket.java | 67 ++++---- .../androidTestCases/ResetPassword.java | 91 +++++++++- .../regclient/androidTestCases/Settings.java | 4 +- .../androidTestCases/UpdateMyUinMinor.java | 4 +- .../UpdateMyUinUpdateDemographicDetails.java | 4 +- .../UpdateMyUinUpdateDocuments.java | 4 +- .../java/regclient/api/ArcConfigManager.java | 1 + .../main/java/regclient/api/FetchUiSpec.java | 17 ++ .../page/ApplicantBiometricsPage.java | 2 + .../main/java/regclient/page/BasePage.java | 70 +++++++- .../main/java/regclient/page/CameraPage.java | 6 +- .../main/java/regclient/page/ExportPage.java | 82 +++++---- .../page/ManageApplicationsPage.java | 2 +- .../regclient/page/OperationalTaskPage.java | 2 + .../main/java/regclient/page/PreviewPage.java | 4 +- .../regclient/page/RegistrationTasksPage.java | 2 + .../arabic/ApplicantBiometricsPageArabic.java | 16 +- .../arabic/AuthenticationPageArabic.java | 7 +- .../arabic/BiometricDetailsPageArabic.java | 158 +++++++++--------- .../arabic/DemographicDetailsPageArabic.java | 22 ++- .../arabic/DocumentUploadPageArabic.java | 7 + .../arabic/IntroducerBiometricPageArabic.java | 3 +- .../arabic/ManageApplicationsPageArabic.java | 13 +- .../arabic/OperationalTaskPageArabic.java | 17 ++ .../pages/arabic/PendingApprovalArabic.java | 5 +- .../pages/arabic/PreviewPageArabic.java | 20 ++- .../arabic/RegistrationTasksPageArabic.java | 24 ++- .../pages/arabic/SettingsPageArabic.java | 44 ++--- ...rvisorBiometricVerificationpageArabic.java | 15 +- .../UpdateOperatorBiometricspageArabic.java | 15 +- .../ApplicantBiometricsPageEnglish.java | 21 ++- .../english/BiometricDetailsPageEnglish.java | 149 +++++------------ .../english/DocumentUploadPageEnglish.java | 5 + .../IntroducerBiometricPageEnglish.java | 5 +- .../ManageApplicationsPageEnglish.java | 15 +- .../english/OperationalTaskPageEnglish.java | 17 ++ .../pages/english/PendingApprovalEnglish.java | 5 +- .../pages/english/PreviewPageEnglish.java | 58 +++++-- .../english/RegistrationTasksPageEnglish.java | 25 ++- .../pages/english/SettingsPageEnglish.java | 46 ++--- ...visorBiometricVerificationpageEnglish.java | 8 +- .../UpdateOperatorBiometricspageEnglish.java | 5 +- .../french/ApplicantBiometricsPageFrench.java | 16 +- .../french/BiometricDetailsPageFrench.java | 158 +++++++++--------- .../french/DemographicDetailsPageFrench.java | 46 ++--- .../french/DocumentUploadPageFrench.java | 7 + .../french/IntroducerBiometricPageFrench.java | 5 +- .../french/ManageApplicationsPageFrench.java | 8 +- .../french/OperationalTaskPageFrench.java | 17 ++ .../pages/french/PendingApprovalFrench.java | 5 +- .../pages/french/PreviewPageFrench.java | 28 +++- .../french/RegistrationTasksPageFrench.java | 17 ++ .../pages/french/SettingsPageFrench.java | 48 +++--- ...rvisorBiometricVerificationpageFrench.java | 17 +- .../UpdateOperatorBiometricspageFrench.java | 13 +- .../hindi/ApplicantBiometricsPageHindi.java | 8 + .../hindi/ManageApplicationsPageHindi.java | 6 + .../pages/hindi/OperationalTaskPageHindi.java | 17 ++ .../pages/hindi/PreviewPageHindi.java | 4 +- .../hindi/RegistrationTasksPageHindi.java | 17 ++ .../ApplicantBiometricsPageKannada.java | 8 + .../ManageApplicationsPageKannada.java | 6 + .../kannada/OperationalTaskPageKannada.java | 17 ++ .../pages/kannada/PreviewPageKannada.java | 4 +- .../kannada/RegistrationTasksPageKannada.java | 17 ++ .../tamil/ApplicantBiometricsPageTamil.java | 137 ++++++++------- .../tamil/ManageApplicationsPageTamil.java | 6 + .../pages/tamil/OperationalTaskPageTamil.java | 55 +++--- .../pages/tamil/PreviewPageTamil.java | 4 +- .../tamil/RegistrationTasksPageTamil.java | 17 ++ .../main/resources/DesiredCapabilities.json | 2 +- .../main/resources/config/Kernel.properties | 2 +- 80 files changed, 1386 insertions(+), 736 deletions(-) diff --git a/ui-test/src/main/java/regclient/androidTestCases/BiometricCorrection.java b/ui-test/src/main/java/regclient/androidTestCases/BiometricCorrection.java index 1a394c822..7b5fdcb78 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/BiometricCorrection.java +++ b/ui-test/src/main/java/regclient/androidTestCases/BiometricCorrection.java @@ -436,18 +436,17 @@ public void adultBiometricCorrection() throws InterruptedException { assertTrue(previewPage.isNewRegistrationTitleDisplayed(), "Verify if new Registration title is displayed"); -// Below commentout method may be required in future -// assertTrue(previewPage.isApplicationIDPreviewPagePageDisplayed(), -// "Verify if application ID In PreviewPage is displayed"); + assertTrue(previewPage.isApplicationIDPreviewPageDisplayed(), + "Verify if application ID In PreviewPage is displayed"); assertTrue(previewPage.isDemographicInformationInPreviewPageDisplayed(), "Verify if Demographic Information In PreviewPage is displayed"); assertTrue(previewPage.isDocumentsInformationInPreviewPageDisplayed(), "Verify if Documents Information In PreviewPage is displayed"); - assertTrue(previewPage.isBiometricsInformationInPreviewPagePageDisplayed(), + assertTrue(previewPage.isBiometricsInformationInPreviewPageDisplayed(), "Verify if Biometrics Information In PreviewPage is displayed"); String Aid = previewPage.getAID(); - previewPage.clickOnContinueButton(); + if ("eng".equalsIgnoreCase(language)) { authenticationPage = new AuthenticationPageEnglish(driver); } else if ("hin".equalsIgnoreCase(language)) { @@ -463,8 +462,18 @@ public void adultBiometricCorrection() throws InterruptedException { } else { throw new IllegalStateException("Unsupported language in testdata.json: " + language); } - assertTrue(authenticationPage.isAuthenticationPageDisplayed(), - "Verify if authentication details page is displayed"); + boolean isAuthenticationPageDisplayed = false; + + for (int i = 0; i < 3; i++) { + previewPage.clickOnContinueButton(); + + if (authenticationPage.isAuthenticationPageDisplayed()) { + isAuthenticationPageDisplayed = true; + break; + } + } + + assertTrue(isAuthenticationPageDisplayed, "Authentication page not displayed after retries"); authenticationPage.enterUserName(KeycloakUserManager.moduleSpecificUser); authenticationPage.enterPassword(ArcConfigManager.getIAMUsersPassword()); authenticationPage.clickOnAuthenticatenButton(); @@ -587,12 +596,21 @@ public void adultBiometricCorrection() throws InterruptedException { assertTrue(manageApplicationsPage.isPacketApproved(Aid), "Verify if Filtre packet is approved "); manageApplicationsPage.clickOnSearchCheckBox(); + + boolean uploadSuccess = false; + for (int i = 0; i < 3; i++) { + manageApplicationsPage.clickOnUploadButton(); - Thread.sleep(2000); - if (!manageApplicationsPage.isNoNetworkFoundDisplayed()) - break; + + uploadSuccess = manageApplicationsPage.isZeroApplicationDisplayed(); + + if (!uploadSuccess) { + + } } + + assertTrue(uploadSuccess, "Zero Application not displayed after retries"); manageApplicationsPage.clickOnBackButton(); // Return to mocksbi page @@ -602,6 +620,10 @@ public void adultBiometricCorrection() throws InterruptedException { mockSBIPage.switchBackToArcApp(); // biocorrection flow + FetchUiSpec.getUiSpec("bioCorrectionProcess"); + FetchUiSpec.getBiometricDetails("individualBiometrics"); + List screenOrder1 = FetchUiSpec.getAllScreenOrder(); + if ("eng".equalsIgnoreCase(language)) { registrationTasksPage = new RegistrationTasksPageEnglish(driver); } else if ("hin".equalsIgnoreCase(language)) { @@ -654,7 +676,7 @@ public void adultBiometricCorrection() throws InterruptedException { assertTrue(selectLanguagePage.isSubmitButtonEnabled(), "verify if the submit button enabled"); selectLanguagePage.clickOnSubmitButton(); - for (String screen : screenOrder) { + for (String screen : screenOrder1) { if (screen.equals("consentdet") || screen.equals("consent")) { if ("eng".equalsIgnoreCase(language)) { consentPage = new ConsentPageEnglish(driver); @@ -715,7 +737,6 @@ public void adultBiometricCorrection() throws InterruptedException { if (FetchUiSpec.eye.equals("yes")) { biometricDetailsPage.clickOnIrisScan(); - assertTrue(applicantBiometricsPage.isApplicantBiometricsPageDisplayed(), "Verify if applicant biometric page is displayed"); applicantBiometricsPage.clickOnScanButton(); @@ -727,9 +748,6 @@ public void adultBiometricCorrection() throws InterruptedException { } // righthand if (FetchUiSpec.rightHand.equals("yes")) { - - biometricDetailsPage.clickOnRightHandScanIcon(); - assertTrue(applicantBiometricsPage.isRightHandScanTitleDisplayed(), "Verify if right hand scan is displayed"); applicantBiometricsPage.clickOnScanButton(); @@ -740,8 +758,6 @@ public void adultBiometricCorrection() throws InterruptedException { } // lefthand if (FetchUiSpec.leftHand.equals("yes")) { - biometricDetailsPage.clickOnLeftHandScanIcon(); - assertTrue(applicantBiometricsPage.isLeftHandScanTitleDisplayed(), "Verify if left hand scan is displayed"); applicantBiometricsPage.clickOnScanButton(); @@ -752,8 +768,6 @@ public void adultBiometricCorrection() throws InterruptedException { } // thumb if (FetchUiSpec.thumb.equals("yes")) { - biometricDetailsPage.clickOnThumbsScanIcon(); - assertTrue(applicantBiometricsPage.isThumbsScanTitleDisplayed(), "Verify if thumb hand scan is displayed"); applicantBiometricsPage.clickOnScanButton(); @@ -764,8 +778,6 @@ public void adultBiometricCorrection() throws InterruptedException { } // face if (FetchUiSpec.face.equals("yes")) { - biometricDetailsPage.clickOnFaceScanIcon(); - assertTrue(applicantBiometricsPage.isFaceScanTitleDisplayed(), "Verify if applicant biometric page is displayed"); applicantBiometricsPage.clickOnScanButton(); @@ -814,11 +826,10 @@ public void adultBiometricCorrection() throws InterruptedException { } else { throw new IllegalStateException("Unsupported language in testdata.json: " + language); } - boolean isAuthenticationPageDisplayed = false; for (int i = 0; i < 3; i++) { previewPage.clickOnContinueButton(); - Thread.sleep(2000); + if (authenticationPage.isAuthenticationPageDisplayed()) { isAuthenticationPageDisplayed = true; break; @@ -906,7 +917,7 @@ public void adultBiometricCorrection() throws InterruptedException { boolean isBioCorrectionAuthenticationPageDisplayed = false; for (int i = 0; i < 3; i++) { pendingApproval.clickOnAuthenticateButton(); - Thread.sleep(2000); + if (pendingApproval.isSupervisorAuthenticationTitleDisplayed()) { isBioCorrectionAuthenticationPageDisplayed = true; break; @@ -948,12 +959,20 @@ public void adultBiometricCorrection() throws InterruptedException { assertTrue(manageApplicationsPage.isPacketApproved(Aid), "Verify if Filtre packet is approved "); manageApplicationsPage.clickOnSearchCheckBox(); + for (int i = 0; i < 3; i++) { + manageApplicationsPage.clickOnUploadButton(); - Thread.sleep(2000); - if (!manageApplicationsPage.isNoNetworkFoundDisplayed()) - break; + + uploadSuccess = manageApplicationsPage.isZeroApplicationDisplayed(); + + if (!uploadSuccess) { + + } } + + assertTrue(uploadSuccess, "Zero Application not displayed after retries"); + manageApplicationsPage.clickOnBackButton(); registrationTasksPage.clickProfileButton(); @@ -1361,15 +1380,16 @@ public void minorBiometricCorrection() throws InterruptedException { } assertTrue(previewPage.isNewRegistrationTitleDisplayed(), "Verify if new Registration title is displayed"); - assertTrue(previewPage.isApplicationIDPreviewPagePageDisplayed(), + assertTrue(previewPage.isApplicationIDPreviewPageDisplayed(), "Verify if application ID In PreviewPage is displayed"); assertTrue(previewPage.isDemographicInformationInPreviewPageDisplayed(), "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.isBiometricsInformationInPreviewPageDisplayed(), + "Verify if Biometrics Information In PreviewPage is displayed"); String Aid = previewPage.getAID(); - previewPage.clickOnContinueButton(); + if ("eng".equalsIgnoreCase(language)) { authenticationPage = new AuthenticationPageEnglish(driver); } else if ("hin".equalsIgnoreCase(language)) { @@ -1385,8 +1405,18 @@ public void minorBiometricCorrection() throws InterruptedException { } else { throw new IllegalStateException("Unsupported language in testdata.json: " + language); } - assertTrue(authenticationPage.isAuthenticationPageDisplayed(), - "Verify if authentication details page is displayed"); + boolean isAuthenticationPageDisplayed = false; + + for (int i = 0; i < 3; i++) { + previewPage.clickOnContinueButton(); + + if (authenticationPage.isAuthenticationPageDisplayed()) { + isAuthenticationPageDisplayed = true; + break; + } + } + + assertTrue(isAuthenticationPageDisplayed, "Authentication page not displayed after retries"); authenticationPage.enterUserName(KeycloakUserManager.moduleSpecificUser); authenticationPage.enterPassword(ArcConfigManager.getIAMUsersPassword()); authenticationPage.clickOnAuthenticatenButton(); @@ -1466,7 +1496,7 @@ public void minorBiometricCorrection() throws InterruptedException { boolean isPageDisplayed = false; for (int i = 0; i < 3; i++) { pendingApproval.clickOnAuthenticateButton(); - Thread.sleep(2000); + if (pendingApproval.isSupervisorAuthenticationTitleDisplayed()) { isPageDisplayed = true; break; @@ -1507,17 +1537,17 @@ public void minorBiometricCorrection() throws InterruptedException { assertTrue(manageApplicationsPage.isPacketApproved(Aid), "Verify if Filtre packet is approved "); manageApplicationsPage.clickOnSearchCheckBox(); + + boolean uploadSuccess = false; for (int i = 0; i < 3; i++) { manageApplicationsPage.clickOnUploadButton(); - Thread.sleep(2000); - if (!manageApplicationsPage.isNoNetworkFoundDisplayed()) - break; + uploadSuccess = manageApplicationsPage.isZeroApplicationDisplayed(); + if (!uploadSuccess) { + } } - manageApplicationsPage.clickOnBackButton(); - // Biometric correction packet process - // Reset biometric capabilities back to individual biometrics for correction - // flow + assertTrue(uploadSuccess, "Zero Application not displayed after retries"); + manageApplicationsPage.clickOnBackButton(); assertTrue(registrationTasksPage.isOperationalTaskDisplayed(), "Verify if operation tasks page is loaded"); @@ -1629,49 +1659,36 @@ public void minorBiometricCorrection() throws InterruptedException { } // righthand if (FetchUiSpec.rightHand.equals("yes")) { - - biometricDetailsPage.clickOnRightHandScanIcon(); - assertTrue(applicantBiometricsPage.isRightHandScanTitleDisplayed(), "Verify if right hand scan is displayed"); applicantBiometricsPage.clickOnScanButton(); - assertTrue(applicantBiometricsPage.isRightHandScan(), "Verify if right hand scan 1st attempt"); applicantBiometricsPage.closeScanCapturePopUp(); applicantBiometricsPage.clickOnNextButton(); } // lefthand if (FetchUiSpec.leftHand.equals("yes")) { - biometricDetailsPage.clickOnLeftHandScanIcon(); - assertTrue(applicantBiometricsPage.isLeftHandScanTitleDisplayed(), "Verify if left hand scan is displayed"); applicantBiometricsPage.clickOnScanButton(); - assertTrue(applicantBiometricsPage.isLeftHandScan(), "Verify if Left hand scan 1st attempt"); applicantBiometricsPage.closeScanCapturePopUp(); applicantBiometricsPage.clickOnNextButton(); } // thumb if (FetchUiSpec.thumb.equals("yes")) { - biometricDetailsPage.clickOnThumbsScanIcon(); - assertTrue(applicantBiometricsPage.isThumbsScanTitleDisplayed(), "Verify if thumb hand scan is displayed"); applicantBiometricsPage.clickOnScanButton(); - assertTrue(applicantBiometricsPage.isThumbsScan(), "Verify if thumbs scan 1st attempt"); applicantBiometricsPage.closeScanCapturePopUp(); applicantBiometricsPage.clickOnNextButton(); } // face if (FetchUiSpec.face.equals("yes")) { - biometricDetailsPage.clickOnFaceScanIcon(); - assertTrue(applicantBiometricsPage.isFaceScanTitleDisplayed(), "Verify if applicant biometric page is displayed"); applicantBiometricsPage.clickOnScanButton(); - assertTrue(applicantBiometricsPage.isFaceScan(), "Verify if face scan 1st attempt"); applicantBiometricsPage.closeScanCapturePopUp(); applicantBiometricsPage.clickOnNextButton(); @@ -1717,11 +1734,9 @@ public void minorBiometricCorrection() throws InterruptedException { } else { throw new IllegalStateException("Unsupported language in testdata.json: " + language); } - boolean isAuthenticationPageDisplayed = false; for (int i = 0; i < 3; i++) { previewPage.clickOnContinueButton(); - if (authenticationPage.isAuthenticationPageDisplayed()) { isAuthenticationPageDisplayed = true; break; @@ -1808,7 +1823,6 @@ public void minorBiometricCorrection() throws InterruptedException { boolean isBioCorrectionAuthenticationPageDisplayed = false; for (int i = 0; i < 3; i++) { pendingApproval.clickOnAuthenticateButton(); - Thread.sleep(2000); if (pendingApproval.isSupervisorAuthenticationTitleDisplayed()) { isBioCorrectionAuthenticationPageDisplayed = true; break; @@ -1850,12 +1864,15 @@ public void minorBiometricCorrection() throws InterruptedException { assertTrue(manageApplicationsPage.isPacketApproved(Aid), "Verify if Filtre packet is approved "); manageApplicationsPage.clickOnSearchCheckBox(); + for (int i = 0; i < 3; i++) { manageApplicationsPage.clickOnUploadButton(); - Thread.sleep(2000); - if (!manageApplicationsPage.isNoNetworkFoundDisplayed()) - break; + uploadSuccess = manageApplicationsPage.isZeroApplicationDisplayed(); + if (!uploadSuccess) { + } } + + assertTrue(uploadSuccess, "Zero Application not displayed after retries"); manageApplicationsPage.clickOnBackButton(); registrationTasksPage.clickProfileButton(); @@ -1880,5 +1897,4 @@ public void minorBiometricCorrection() throws InterruptedException { } - } diff --git a/ui-test/src/main/java/regclient/androidTestCases/ExportPacket.java b/ui-test/src/main/java/regclient/androidTestCases/ExportPacket.java index 8ecfd1c3f..b4700fa22 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/ExportPacket.java +++ b/ui-test/src/main/java/regclient/androidTestCases/ExportPacket.java @@ -1,5 +1,7 @@ package regclient.androidTestCases; +import static org.junit.Assert.assertFalse; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.testng.Assert.assertTrue; import java.util.List; @@ -124,7 +126,7 @@ public class ExportPacket extends AndroidBaseTest { @Test(priority = 0, description = "Verify exporting of created packet") public void exportPacket() throws InterruptedException { - FetchUiSpec.getUiSpec("newProcess"); + FetchUiSpec.getUiSpec("lostProcess"); FetchUiSpec.getBiometricDetails("individualBiometrics"); List screenOrder = FetchUiSpec.getAllScreenOrder(); LoginPage loginPage = null; @@ -392,16 +394,16 @@ public void exportPacket() throws InterruptedException { } assertTrue(previewPage.isLostUinTitleDisplayed(), "Verify if lost uin title is displayed"); - assertTrue(previewPage.isApplicationIDPreviewPagePageDisplayed(), + assertTrue(previewPage.isApplicationIDPreviewPageDisplayed(), "Verify if application ID In PreviewPage is displayed"); assertTrue(previewPage.isDemographicInformationInPreviewPageDisplayed(), "Verify if Demographic Information In PreviewPage is displayed"); assertTrue(previewPage.isDocumentsInformationInPreviewPageDisplayed(), "Verify if Documents Information In PreviewPage is displayed"); - assertTrue(previewPage.isBiometricsInformationInPreviewPagePageDisplayed(), + assertTrue(previewPage.isBiometricsInformationInPreviewPageDisplayed(), "Verify if Biometrics Information In PreviewPage is displayed"); String Aid = previewPage.getAID(); - previewPage.clickOnContinueButton(); + if ("eng".equalsIgnoreCase(language)) { authenticationPage = new AuthenticationPageEnglish(driver); } else if ("hin".equalsIgnoreCase(language)) { @@ -417,8 +419,18 @@ public void exportPacket() throws InterruptedException { } else { throw new IllegalStateException("Unsupported language in testdata.json: " + language); } - assertTrue(authenticationPage.isAuthenticationPageDisplayed(), - "Verify if authentication details page is displayed"); + boolean isAuthenticationPageDisplayed = false; + + for (int i = 0; i < 3; i++) { + previewPage.clickOnContinueButton(); + + if (authenticationPage.isAuthenticationPageDisplayed()) { + isAuthenticationPageDisplayed = true; + break; + } + } + + assertTrue(isAuthenticationPageDisplayed, "Authentication page not displayed after retries"); authenticationPage.enterUserName(KeycloakUserManager.moduleSpecificUser); authenticationPage.enterPassword(ArcConfigManager.getIAMUsersPassword()); authenticationPage.clickOnAuthenticatenButton(); @@ -440,8 +452,6 @@ public void exportPacket() throws InterruptedException { assertTrue(acknowledgementPage.isAcknowledgementPageDisplayed(), "Verify if acknowledgement details page is displayed"); - // assertTrue(acknowledgementPage.isQrCodeImageDisplayed(),"Verify if qr code - // image is displayed"); acknowledgementPage.clickOnGoToHomeButton(); assertTrue(registrationTasksPage.isRegistrationTasksPageLoaded(), @@ -494,10 +504,19 @@ public void exportPacket() throws InterruptedException { assertTrue(pendingApproval.isAuthenticateButtonEnabled(), "Verify if authenticate button is enable after selecting packet"); - pendingApproval.clickOnAuthenticateButton(); - assertTrue(pendingApproval.isSupervisorAuthenticationTitleDisplayed(), - "Verify if Supervisor Authentication page displayed"); + boolean isPageDisplayed = false; + + for (int i = 0; i < 3; i++) { + pendingApproval.clickOnAuthenticateButton(); + + if (pendingApproval.isSupervisorAuthenticationTitleDisplayed()) { + isPageDisplayed = true; + break; + } + } + + assertTrue(isPageDisplayed, "Supervisor Authentication page not displayed after retries"); pendingApproval.enterUserName(KeycloakUserManager.moduleSpecificUser); @@ -539,11 +558,23 @@ public void exportPacket() throws InterruptedException { assertTrue(manageApplicationsPage.isSearchAIDDisplayed(Aid), "Verify if Search Aid should displayed"); manageApplicationsPage.clickOnSearchCheckBox(); - manageApplicationsPage.clickOnExportButton(); + + boolean success = false; + + for (int i = 0; i < 3; i++) { + manageApplicationsPage.clickOnExportButton(); + + if (!manageApplicationsPage.isManageApplicationPageDisplayed()) { + success = true; + break; + } + } + + assertTrue(success, "Export failed after retries"); exportPage = new ExportPage(driver); exportPage.handleAccessConsentIfPresent(); - + exportPage.exportToFolder("ExportPacket"); manageApplicationsPage.clickOnBackButton(); diff --git a/ui-test/src/main/java/regclient/androidTestCases/LoginTest.java b/ui-test/src/main/java/regclient/androidTestCases/LoginTest.java index bb47b897b..a52726b3e 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/LoginTest.java +++ b/ui-test/src/main/java/regclient/androidTestCases/LoginTest.java @@ -180,6 +180,72 @@ public void userloginTest() { assertTrue(operationalTaskPage.isOperationalTaskPageLoaded(), "Verify if operational Task Page is loaded"); operationalTaskPage.clickSynchronizeDataButton(); + + operationalTaskPage.handleIfSyncPopUpDisplayed(); + + if ("eng".equalsIgnoreCase(language)) { + loginPage = new LoginPageEnglish(driver); + } else if ("hin".equalsIgnoreCase(language)) { + loginPage = new LoginPageHindi(driver); + } else if ("fra".equalsIgnoreCase(language)) { + loginPage = new LoginPageFrench(driver); + } else if ("kan".equalsIgnoreCase(language)) { + loginPage = new LoginPageKannada(driver); + } else if ("tam".equalsIgnoreCase(language)) { + loginPage = new LoginPageTamil(driver); + } else if ("ara".equalsIgnoreCase(language)) { + loginPage = new LoginPageArabic(driver); + } else { + throw new IllegalStateException("Unsupported language in testdata.json: " + language); + } + + loginPage.selectLanguage(); + + loginPage.enterUserName(KeycloakUserManager.moduleSpecificUser); + + assertTrue(loginPage.isNextButtonEnabled(), "verify if the next button enabled"); + loginPage.clickOnNextButton(); + + loginPage.enterPassword(ArcConfigManager.getIAMUsersPassword()); + assertTrue(loginPage.isLoginButtonEnabled(), "Verify if the login button enabled"); + + loginPage.clickOnloginButton(); + if ("eng".equalsIgnoreCase(language)) { + registrationTasksPage = new RegistrationTasksPageEnglish(driver); + } else if ("hin".equalsIgnoreCase(language)) { + registrationTasksPage = new RegistrationTasksPageHindi(driver); + } else if ("fra".equalsIgnoreCase(language)) { + registrationTasksPage = new RegistrationTasksPageFrench(driver); + } else if ("kan".equalsIgnoreCase(language)) { + registrationTasksPage = new RegistrationTasksPageKannada(driver); + } else if ("tam".equalsIgnoreCase(language)) { + registrationTasksPage = new RegistrationTasksPageTamil(driver); + } else if ("ara".equalsIgnoreCase(language)) { + registrationTasksPage = new RegistrationTasksPageArabic(driver); + } else { + throw new IllegalStateException("Unsupported language in testdata.json: " + language); + } + assertTrue(registrationTasksPage.isRegistrationTasksPageLoaded(), + "Verify if registration tasks page is loaded"); + + registrationTasksPage.clickOnOperationalTasksTitle(); + if ("eng".equalsIgnoreCase(language)) { + operationalTaskPage = new OperationalTaskPageEnglish(driver); + } else if ("hin".equalsIgnoreCase(language)) { + operationalTaskPage = new OperationalTaskPageHindi(driver); + } else if ("fra".equalsIgnoreCase(language)) { + operationalTaskPage = new OperationalTaskPageFrench(driver); + } else if ("kan".equalsIgnoreCase(language)) { + operationalTaskPage = new OperationalTaskPageKannada(driver); + } else if ("tam".equalsIgnoreCase(language)) { + operationalTaskPage = new OperationalTaskPageTamil(driver); + } else if ("ara".equalsIgnoreCase(language)) { + operationalTaskPage = new OperationalTaskPageArabic(driver); + } else { + throw new IllegalStateException("Unsupported language in testdata.json: " + language); + } + assertTrue(operationalTaskPage.isOperationalTaskPageLoaded(), "Verify if operational Task Page is loaded"); + assertTrue(operationalTaskPage.checkLastSyncDate(), "Verify last sync date and time"); registrationTasksPage.clickOnDashboardButton(); diff --git a/ui-test/src/main/java/regclient/androidTestCases/LostUin.java b/ui-test/src/main/java/regclient/androidTestCases/LostUin.java index 63e04d51f..875f7f9ef 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/LostUin.java +++ b/ui-test/src/main/java/regclient/androidTestCases/LostUin.java @@ -117,7 +117,7 @@ public class LostUin extends AndroidBaseTest { @Test(priority = 0, description = "Verify lost UIN") public void lostUinAdult() { - FetchUiSpec.getUiSpec("newProcess"); + FetchUiSpec.getUiSpec("lostProcess"); FetchUiSpec.getBiometricDetails("individualBiometrics"); List screenOrder = FetchUiSpec.getAllScreenOrder(); LoginPage loginPage = null; @@ -392,16 +392,16 @@ public void lostUinAdult() { } assertTrue(previewPage.isLostUinTitleDisplayed(), "Verify if lost uin title is displayed"); - assertTrue(previewPage.isApplicationIDPreviewPagePageDisplayed(), + assertTrue(previewPage.isApplicationIDPreviewPageDisplayed(), "Verify if application ID In PreviewPage is displayed"); assertTrue(previewPage.isDemographicInformationInPreviewPageDisplayed(), "Verify if Demographic Information In PreviewPage is displayed"); assertTrue(previewPage.isDocumentsInformationInPreviewPageDisplayed(), "Verify if Documents Information In PreviewPage is displayed"); - assertTrue(previewPage.isBiometricsInformationInPreviewPagePageDisplayed(), + assertTrue(previewPage.isBiometricsInformationInPreviewPageDisplayed(), "Verify if Biometrics Information In PreviewPage is displayed"); String Aid = previewPage.getAID(); - previewPage.clickOnContinueButton(); + if ("eng".equalsIgnoreCase(language)) { authenticationPage = new AuthenticationPageEnglish(driver); } else if ("hin".equalsIgnoreCase(language)) { @@ -417,8 +417,18 @@ public void lostUinAdult() { } else { throw new IllegalStateException("Unsupported language in testdata.json: " + language); } - assertTrue(authenticationPage.isAuthenticationPageDisplayed(), - "Verify if authentication details page is displayed"); + boolean isAuthenticationPageDisplayed = false; + + for (int i = 0; i < 3; i++) { + previewPage.clickOnContinueButton(); + + if (authenticationPage.isAuthenticationPageDisplayed()) { + isAuthenticationPageDisplayed = true; + break; + } + } + + assertTrue(isAuthenticationPageDisplayed, "Authentication page not displayed after retries"); authenticationPage.enterUserName(KeycloakUserManager.moduleSpecificUser); authenticationPage.enterPassword(ArcConfigManager.getIAMUsersPassword()); authenticationPage.clickOnAuthenticatenButton(); @@ -440,8 +450,6 @@ public void lostUinAdult() { assertTrue(acknowledgementPage.isAcknowledgementPageDisplayed(), "Verify if acknowledgement details page is displayed"); - // assertTrue(acknowledgementPage.isQrCodeImageDisplayed(),"Verify if qr code - // image is displayed"); acknowledgementPage.clickOnGoToHomeButton(); assertTrue(registrationTasksPage.isRegistrationTasksPageLoaded(), @@ -494,10 +502,19 @@ public void lostUinAdult() { assertTrue(pendingApproval.isAuthenticateButtonEnabled(), "Verify if authenticate button is enable after selecting packet"); - pendingApproval.clickOnAuthenticateButton(); - assertTrue(pendingApproval.isSupervisorAuthenticationTitleDisplayed(), - "Verify if Supervisor Authentication page displayed"); + boolean isPageDisplayed = false; + + for (int i = 0; i < 3; i++) { + pendingApproval.clickOnAuthenticateButton(); + + if (pendingApproval.isSupervisorAuthenticationTitleDisplayed()) { + isPageDisplayed = true; + break; + } + } + + assertTrue(isPageDisplayed, "Supervisor Authentication page not displayed after retries"); pendingApproval.enterUserName(KeycloakUserManager.moduleSpecificUser + "123"); @@ -542,7 +559,7 @@ public void lostUinAdult() { assertTrue(manageApplicationsPage.isSearchAIDDisplayed(Aid), "Verify if Search Aid should displayed"); manageApplicationsPage.clickOnSearchCheckBox(); - + boolean uploadSuccess = false; for (int i = 0; i < 3; i++) { diff --git a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdult.java b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdult.java index 2018688d5..c92d2a24e 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdult.java +++ b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdult.java @@ -293,6 +293,7 @@ public void newRegistrationAdult() throws InterruptedException { "Verify if doccumentupload page is displayed"); documentuploadPage.uploadDoccuments("adult", "ReferenceNumber"); + documentuploadPage.clickOnContinueButton(); } else if (screen.equals("BiometricDetails")) { @@ -360,7 +361,7 @@ public void newRegistrationAdult() throws InterruptedException { assertTrue(applicantBiometricsPage.isRightHandScan(), "Verify if right hand scan 1st attempt"); applicantBiometricsPage.closeScanCapturePopUp(); - biometricDetailsPage = applicantBiometricsPage.clickOnBackButton(); + biometricDetailsPage = applicantBiometricsPage.clickOnBiometricsMenuButton(); } // lefthand if (FetchUiSpec.leftHand.equals("yes")) { @@ -426,13 +427,13 @@ public void newRegistrationAdult() throws InterruptedException { } assertTrue(previewPage.isNewRegistrationTitleDisplayed(), "Verify if new Registration title is displayed"); - assertTrue(previewPage.isApplicationIDPreviewPagePageDisplayed(), + assertTrue(previewPage.isApplicationIDPreviewPageDisplayed(), "Verify if application ID In PreviewPage is displayed"); assertTrue(previewPage.isDemographicInformationInPreviewPageDisplayed(), "Verify if Demographic Information In PreviewPage is displayed"); assertTrue(previewPage.isDocumentsInformationInPreviewPageDisplayed(), "Verify if Documents Information In PreviewPage is displayed"); - assertTrue(previewPage.isBiometricsInformationInPreviewPagePageDisplayed(), + assertTrue(previewPage.isBiometricsInformationInPreviewPageDisplayed(), "Verify if Biometrics Information In PreviewPage is displayed"); String Aid = previewPage.getAID(); if ("eng".equalsIgnoreCase(language)) { diff --git a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdultException.java b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdultException.java index e01cb4e21..a34e04808 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdultException.java +++ b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdultException.java @@ -450,7 +450,7 @@ public void newRegistrationAdultException() throws InterruptedException { throw new IllegalStateException("Unsupported language in testdata.json: " + language); } assertTrue(previewPage.isNewRegistrationTitleDisplayed(), "Verify if new Registration title is displayed"); - assertTrue(previewPage.isApplicationIDPreviewPagePageDisplayed(), + assertTrue(previewPage.isApplicationIDPreviewPageDisplayed(), "Verify if application ID In PreviewPage is displayed"); assertTrue(previewPage.isDemographicInformationInPreviewPageDisplayed(), "Verify if Demographic Information In PreviewPage is displayed"); diff --git a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdultUploadMultipleDoccuments.java b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdultUploadMultipleDoccuments.java index d074ebfa5..7b7c503d8 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdultUploadMultipleDoccuments.java +++ b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdultUploadMultipleDoccuments.java @@ -424,7 +424,7 @@ public void newRegistrationAdultUploadMultipleDoccuments() throws InterruptedExc assertTrue(previewPage.isBothIrisImageDisplayed(), "Verify if both iris image In PreviewPage is displayed"); assertTrue(previewPage.isDemographicInformationInPreviewPageDisplayed(), "Verify if Demographic Information In PreviewPage is displayed"); - assertTrue(previewPage.isBiometricsInformationInPreviewPagePageDisplayed(), + assertTrue(previewPage.isBiometricsInformationInPreviewPageDisplayed(), "Verify if Biometrics Information In PreviewPage is displayed"); assertTrue(previewPage.isDocumentsInformationInPreviewPageDisplayed(), "Verify if Documents Information In PreviewPage is displayed"); @@ -504,7 +504,9 @@ public void newRegistrationAdultUploadMultipleDoccuments() throws InterruptedExc throw new IllegalStateException("Unsupported language in testdata.json: " + language); } if (FetchUiSpec.eye.equals("yes")) { - biometricDetailsPage.clickOnIrisScan(); + assertTrue(biometricDetailsPage.isBiometricDetailsPageDisplayed(), + "Verify if biometric details page is displayed"); + applicantBiometricsPage = biometricDetailsPage.clickOnIrisScan(); assertTrue(applicantBiometricsPage.isApplicantBiometricsPageDisplayed(), "Verify if applicant biometric page is displayed"); @@ -663,13 +665,13 @@ public void newRegistrationAdultUploadMultipleDoccuments() throws InterruptedExc throw new IllegalStateException("Unsupported language in testdata.json: " + language); } assertTrue(previewPage.isNewRegistrationTitleDisplayed(), "Verify if new Registration title is displayed"); - assertTrue(previewPage.isApplicationIDPreviewPagePageDisplayed(), + assertTrue(previewPage.isApplicationIDPreviewPageDisplayed(), "Verify if application ID In PreviewPage is displayed"); assertTrue(previewPage.isDemographicInformationInPreviewPageDisplayed(), "Verify if Demographic Information In PreviewPage is displayed"); assertTrue(previewPage.isDocumentsInformationInPreviewPageDisplayed(), "Verify if Documents Information In PreviewPage is displayed"); - assertTrue(previewPage.isBiometricsInformationInPreviewPagePageDisplayed(), + assertTrue(previewPage.isBiometricsInformationInPreviewPageDisplayed(), "Verify if Biometrics Information In PreviewPage is displayed"); String Aid = previewPage.getAID(); diff --git a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationMinorException.java b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationMinorException.java index 801680f61..65482346b 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationMinorException.java +++ b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationMinorException.java @@ -557,13 +557,13 @@ public void newRegistrationMinorException() throws InterruptedException { } assertTrue(previewPage.isNewRegistrationTitleDisplayed(), "Verify if new Registration title is displayed"); - assertTrue(previewPage.isApplicationIDPreviewPagePageDisplayed(), + assertTrue(previewPage.isApplicationIDPreviewPageDisplayed(), "Verify if application ID In PreviewPage is displayed"); assertTrue(previewPage.isDemographicInformationInPreviewPageDisplayed(), "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.isBiometricsInformationInPreviewPageDisplayed(),"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/PreRegFetchingPacket.java b/ui-test/src/main/java/regclient/androidTestCases/PreRegFetchingPacket.java index 3c1c15b35..5714b1e25 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/PreRegFetchingPacket.java +++ b/ui-test/src/main/java/regclient/androidTestCases/PreRegFetchingPacket.java @@ -413,15 +413,15 @@ public void adultPreRegFetching() throws InterruptedException { } assertTrue(previewPage.isNewRegistrationTitleDisplayed(), "Verify if new Registration title is displayed"); + assertTrue(previewPage.isApplicationIDPreviewPageDisplayed(), + "Verify if application ID In PreviewPage is displayed"); assertTrue(previewPage.isDocumentsInformationInPreviewPageDisplayed(), "Verify if Documents Information In PreviewPage is displayed"); - assertTrue(previewPage.isApplicationIDPreviewPagePageDisplayed(), - "Verify if application ID In PreviewPage is displayed"); assertTrue(previewPage.isDemographicInformationInPreviewPageDisplayed(), "Verify if Demographic Information In PreviewPage is displayed"); - assertTrue(previewPage.isBiometricsInformationInPreviewPagePageDisplayed(), + assertTrue(previewPage.isBiometricsInformationInPreviewPageDisplayed(), "Verify if Biometrics Information In PreviewPage is displayed"); String Aid = previewPage.getAID(); @@ -516,7 +516,7 @@ public void adultPreRegFetching() throws InterruptedException { } assertTrue(pendingApproval.isPendingApprovalTitleDisplayed(), "Verify if pending approval page displayed"); - pendingApproval.clickOnLatestAid(); + pendingApproval.clickOnAID(Aid); assertTrue(pendingApproval.isApprovalButtonDisplayed(), "Verify if approval button displayed"); pendingApproval.clickOnApproveButton(); @@ -524,8 +524,7 @@ public void adultPreRegFetching() throws InterruptedException { assertTrue(pendingApproval.isPendingApprovalTitleDisplayed(), "Verify if pending approval page displayed after approving packet"); - - pendingApproval.selectLatestAIdCheckBox(); + pendingApproval.clickOnCheckBox(); assertTrue(pendingApproval.isAuthenticateButtonEnabled(), "Verify if authenticate button is enable after selecting packet"); @@ -569,18 +568,20 @@ public void adultPreRegFetching() throws InterruptedException { assertTrue(manageApplicationsPage.isManageApplicationPageDisplayed(), "Verify if manage Applications Page displayed"); - manageApplicationsPage.selectLatestAidCheckBox(); - boolean uploadSuccess = false; + manageApplicationsPage.clickCheckboxByAID(Aid); + assertTrue(manageApplicationsPage.isSearchAIDDisplayed(Aid), "Verify if Search Aid should displayed"); + assertTrue(manageApplicationsPage.isPacketApproved(Aid), + "Verify if packet is approved after approve in pending approval"); + + boolean uploadSuccess = false; for (int i = 0; i < 3; i++) { manageApplicationsPage.clickOnUploadButton(); - if (!manageApplicationsPage.isNoNetworkFoundDisplayed()) { uploadSuccess = true; break; } } - assertTrue(uploadSuccess, "Upload failed after retries: No Network Found still displayed"); manageApplicationsPage.clickOnBackButton(); @@ -990,15 +991,16 @@ public void minorPreRegFetching() throws InterruptedException { } assertTrue(previewPage.isNewRegistrationTitleDisplayed(), "Verify if new Registration title is displayed"); + assertTrue(previewPage.isApplicationIDPreviewPageDisplayed(), + "Verify if application ID In PreviewPage is displayed"); assertTrue(previewPage.isDocumentsInformationInPreviewPageDisplayed(), "Verify if Documents Information In PreviewPage is displayed"); - assertTrue(previewPage.isApplicationIDPreviewPagePageDisplayed(), - "Verify if application ID In PreviewPage is displayed"); assertTrue(previewPage.isDemographicInformationInPreviewPageDisplayed(), "Verify if Demographic Information In PreviewPage is displayed"); -// assertTrue(previewPage.isBiometricsInformationInPreviewPagePageDisplayed(),"Verify if Biometrics Information In PreviewPage is displayed"); + assertTrue(previewPage.isBiometricsInformationInPreviewPageDisplayed(), + "Verify if Biometrics Information In PreviewPage is displayed"); String Aid = previewPage.getAID(); if ("eng".equalsIgnoreCase(language)) { @@ -1090,7 +1092,7 @@ public void minorPreRegFetching() throws InterruptedException { } assertTrue(pendingApproval.isPendingApprovalTitleDisplayed(), "Verify if pending approval page displayed"); - pendingApproval.clickOnLatestAid(); + pendingApproval.clickOnAID(Aid); assertTrue(pendingApproval.isApprovalButtonDisplayed(), "Verify if approval button displayed"); pendingApproval.clickOnApproveButton(); @@ -1098,8 +1100,7 @@ public void minorPreRegFetching() throws InterruptedException { assertTrue(pendingApproval.isPendingApprovalTitleDisplayed(), "Verify if pending approval page displayed after approving packet"); - - pendingApproval.selectLatestAIdCheckBox(); + pendingApproval.clickOnCheckBox(); assertTrue(pendingApproval.isAuthenticateButtonEnabled(), "Verify if authenticate button is enable after selecting packet"); @@ -1143,14 +1144,22 @@ public void minorPreRegFetching() throws InterruptedException { assertTrue(manageApplicationsPage.isManageApplicationPageDisplayed(), "Verify if manage Applications Page displayed"); - manageApplicationsPage.selectLatestAidCheckBox(); + manageApplicationsPage.clickCheckboxByAID(Aid); + + assertTrue(manageApplicationsPage.isSearchAIDDisplayed(Aid), "Verify if Search Aid should displayed"); + assertTrue(manageApplicationsPage.isPacketApproved(Aid), + "Verify if packet is approved after approve in pending approval"); + + boolean uploadSuccess = false; for (int i = 0; i < 3; i++) { manageApplicationsPage.clickOnUploadButton(); - if (!manageApplicationsPage.isNoNetworkFoundDisplayed()) { + uploadSuccess = true; break; } } + assertTrue(uploadSuccess, "Upload failed after retries: No Network Found still displayed"); + manageApplicationsPage.clickOnBackButton(); assertTrue(registrationTasksPage.isProfileTitleDisplayed(), "Verify if profile title display on homepage"); @@ -1492,15 +1501,16 @@ public void infantPreRegFetching() throws InterruptedException { } assertTrue(previewPage.isNewRegistrationTitleDisplayed(), "Verify if new Registration title is displayed"); + assertTrue(previewPage.isApplicationIDPreviewPageDisplayed(), + "Verify if application ID In PreviewPage is displayed"); assertTrue(previewPage.isDocumentsInformationInPreviewPageDisplayed(), "Verify if Documents Information In PreviewPage is displayed"); - assertTrue(previewPage.isApplicationIDPreviewPagePageDisplayed(), - "Verify if application ID In PreviewPage is displayed"); assertTrue(previewPage.isDemographicInformationInPreviewPageDisplayed(), "Verify if Demographic Information In PreviewPage is displayed"); -// assertTrue(previewPage.isBiometricsInformationInPreviewPagePageDisplayed(),"Verify if Biometrics Information In PreviewPage is displayed"); + assertTrue(previewPage.isBiometricsInformationInPreviewPageDisplayed(), + "Verify if Biometrics Information In PreviewPage is displayed"); String Aid = previewPage.getAID(); if ("eng".equalsIgnoreCase(language)) { @@ -1593,7 +1603,7 @@ public void infantPreRegFetching() throws InterruptedException { } assertTrue(pendingApproval.isPendingApprovalTitleDisplayed(), "Verify if pending approval page displayed"); - pendingApproval.clickOnLatestAid(); + pendingApproval.clickOnAID(Aid); assertTrue(pendingApproval.isApprovalButtonDisplayed(), "Verify if approval button displayed"); pendingApproval.clickOnApproveButton(); @@ -1601,8 +1611,7 @@ public void infantPreRegFetching() throws InterruptedException { assertTrue(pendingApproval.isPendingApprovalTitleDisplayed(), "Verify if pending approval page displayed after approving packet"); - - pendingApproval.selectLatestAIdCheckBox(); + pendingApproval.clickOnCheckBox(); assertTrue(pendingApproval.isAuthenticateButtonEnabled(), "Verify if authenticate button is enable after selecting packet"); @@ -1646,18 +1655,20 @@ public void infantPreRegFetching() throws InterruptedException { assertTrue(manageApplicationsPage.isManageApplicationPageDisplayed(), "Verify if manage Applications Page displayed"); - manageApplicationsPage.selectLatestAidCheckBox(); - boolean uploadSuccess = false; + manageApplicationsPage.clickCheckboxByAID(Aid); + + assertTrue(manageApplicationsPage.isSearchAIDDisplayed(Aid), "Verify if Search Aid should displayed"); + assertTrue(manageApplicationsPage.isPacketApproved(Aid), + "Verify if packet is approved after approve in pending approval"); + boolean uploadSuccess = false; for (int i = 0; i < 3; i++) { manageApplicationsPage.clickOnUploadButton(); - if (!manageApplicationsPage.isNoNetworkFoundDisplayed()) { uploadSuccess = true; break; } } - assertTrue(uploadSuccess, "Upload failed after retries: No Network Found still displayed"); manageApplicationsPage.clickOnBackButton(); diff --git a/ui-test/src/main/java/regclient/androidTestCases/ResetPassword.java b/ui-test/src/main/java/regclient/androidTestCases/ResetPassword.java index 2eb879c35..868be824d 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/ResetPassword.java +++ b/ui-test/src/main/java/regclient/androidTestCases/ResetPassword.java @@ -86,6 +86,51 @@ public void resetPassword() throws IOException { assertTrue(registrationTasksPage.isRegistrationTasksPageLoaded(), "Verify if registration tasks page is loaded"); registrationTasksPage.clickSynchronizeDataButton(); + + registrationTasksPage.handleIfSyncPopUpDisplayed(); + + if ("eng".equalsIgnoreCase(language)) { + loginPage = new LoginPageEnglish(driver); + } else if ("hin".equalsIgnoreCase(language)) { + loginPage = new LoginPageHindi(driver); + } else if ("fra".equalsIgnoreCase(language)) { + loginPage = new LoginPageFrench(driver); + } else if ("kan".equalsIgnoreCase(language)) { + loginPage = new LoginPageKannada(driver); + } else if ("tam".equalsIgnoreCase(language)) { + loginPage = new LoginPageTamil(driver); + } else if ("ara".equalsIgnoreCase(language)) { + loginPage = new LoginPageArabic(driver); + } else { + throw new IllegalStateException("Unsupported language in testdata.json: " + language); + } + loginPage.selectLanguage(); + + loginPage.enterUserName(KeycloakUserManager.moduleSpecificUser); + + loginPage.clickOnNextButton(); + loginPage.enterPassword(ArcConfigManager.getIAMUsersPassword()); + loginPage.clickOnloginButton(); + + if ("eng".equalsIgnoreCase(language)) { + registrationTasksPage = new RegistrationTasksPageEnglish(driver); + } else if ("hin".equalsIgnoreCase(language)) { + registrationTasksPage = new RegistrationTasksPageHindi(driver); + } else if ("fra".equalsIgnoreCase(language)) { + registrationTasksPage = new RegistrationTasksPageFrench(driver); + } else if ("kan".equalsIgnoreCase(language)) { + registrationTasksPage = new RegistrationTasksPageKannada(driver); + } else if ("tam".equalsIgnoreCase(language)) { + registrationTasksPage = new RegistrationTasksPageTamil(driver); + } else if ("ara".equalsIgnoreCase(language)) { + registrationTasksPage = new RegistrationTasksPageArabic(driver); + } else { + throw new IllegalStateException("Unsupported language in testdata.json: " + language); + } + + assertTrue(registrationTasksPage.isRegistrationTasksPageLoaded(), + "Verify if registration tasks page is loaded"); + assertTrue(registrationTasksPage.checkLastSyncDate(), "Verify last sync date and time"); assertTrue(registrationTasksPage.isProfileTitleDisplayed(), "Verify if profile title display on homepage"); @@ -109,7 +154,7 @@ public void resetPassword() throws IOException { profilePage.clickOnLogoutButton(); profilePage.clickOnLogoutButton(); - BasePage.waitTime(5); + assertTrue(loginPage.isLoginPageLoaded(), "verify if login page is displayeded in Selected language"); loginPage.enterUserName(KeycloakUserManager.onlyOperatorRoleUser); loginPage.clickOnNextButton(); @@ -272,6 +317,50 @@ public void resetToDefaultPassword() throws IOException { assertTrue(registrationTasksPage.isRegistrationTasksPageLoaded(), "Verify if registration tasks page is loaded"); registrationTasksPage.clickSynchronizeDataButton(); + + registrationTasksPage.handleIfSyncPopUpDisplayed(); + + if ("eng".equalsIgnoreCase(language)) { + loginPage = new LoginPageEnglish(driver); + } else if ("hin".equalsIgnoreCase(language)) { + loginPage = new LoginPageHindi(driver); + } else if ("fra".equalsIgnoreCase(language)) { + loginPage = new LoginPageFrench(driver); + } else if ("kan".equalsIgnoreCase(language)) { + loginPage = new LoginPageKannada(driver); + } else if ("tam".equalsIgnoreCase(language)) { + loginPage = new LoginPageTamil(driver); + } else if ("ara".equalsIgnoreCase(language)) { + loginPage = new LoginPageArabic(driver); + } else { + throw new IllegalStateException("Unsupported language in testdata.json: " + language); + } + loginPage.selectLanguage(); + + loginPage.enterUserName(KeycloakUserManager.moduleSpecificUser); + loginPage.clickOnNextButton(); + loginPage.enterPassword(ArcConfigManager.getIAMUsersPassword()); + loginPage.clickOnloginButton(); + + if ("eng".equalsIgnoreCase(language)) { + registrationTasksPage = new RegistrationTasksPageEnglish(driver); + } else if ("hin".equalsIgnoreCase(language)) { + registrationTasksPage = new RegistrationTasksPageHindi(driver); + } else if ("fra".equalsIgnoreCase(language)) { + registrationTasksPage = new RegistrationTasksPageFrench(driver); + } else if ("kan".equalsIgnoreCase(language)) { + registrationTasksPage = new RegistrationTasksPageKannada(driver); + } else if ("tam".equalsIgnoreCase(language)) { + registrationTasksPage = new RegistrationTasksPageTamil(driver); + } else if ("ara".equalsIgnoreCase(language)) { + registrationTasksPage = new RegistrationTasksPageArabic(driver); + } else { + throw new IllegalStateException("Unsupported language in testdata.json: " + language); + } + + assertTrue(registrationTasksPage.isRegistrationTasksPageLoaded(), + "Verify if registration tasks page is loaded"); + registrationTasksPage.clickProfileButton(); if ("eng".equalsIgnoreCase(language)) { diff --git a/ui-test/src/main/java/regclient/androidTestCases/Settings.java b/ui-test/src/main/java/regclient/androidTestCases/Settings.java index dd7d2ef5d..aba8d49c8 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/Settings.java +++ b/ui-test/src/main/java/regclient/androidTestCases/Settings.java @@ -163,9 +163,9 @@ public void settings() throws InterruptedException { settingsPage.clickOnDeviceSettingsTab(); - assertFalse(settingsPage.isScanNowButtonDisplayed(), "Verify if scan now button displayed"); + assertTrue(settingsPage.isScanNowButtonDisplayed(), "Verify if scan now button displayed"); - assertTrue(settingsPage.isNoDevicesFoundDisplayed(), "Verify if no devices found displayed"); +// assertTrue(settingsPage.isNoDevicesFoundDisplayed(), "Verify if no devices found displayed"); settingsPage.clickOnGlobalConfigSettingsTab(); diff --git a/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUinMinor.java b/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUinMinor.java index 199c526e1..5f8ec039f 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUinMinor.java +++ b/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUinMinor.java @@ -518,13 +518,13 @@ public void updateMyUinMinor() throws InterruptedException { throw new IllegalStateException("Unsupported language in testdata.json: " + language); } assertTrue(previewPage.updateUINTitleDisplayed(), "Verify if new update uin title is displayed"); - assertTrue(previewPage.isApplicationIDPreviewPagePageDisplayed(), + assertTrue(previewPage.isApplicationIDPreviewPageDisplayed(), "Verify if application ID In PreviewPage is displayed"); assertTrue(previewPage.isDemographicInformationInPreviewPageDisplayed(), "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.isBiometricsInformationInPreviewPageDisplayed(),"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/UpdateMyUinUpdateDemographicDetails.java b/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUinUpdateDemographicDetails.java index fbbc2bdd1..6a67b60d4 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUinUpdateDemographicDetails.java +++ b/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUinUpdateDemographicDetails.java @@ -378,13 +378,13 @@ public void updateMyUinUpdateDemographicDetails() throws InterruptedException { throw new IllegalStateException("Unsupported language in testdata.json: " + language); } assertTrue(previewPage.updateUINTitleDisplayed(), "Verify if new update uin title is displayed"); - assertTrue(previewPage.isApplicationIDPreviewPagePageDisplayed(), + assertTrue(previewPage.isApplicationIDPreviewPageDisplayed(), "Verify if application ID In PreviewPage is displayed"); assertTrue(previewPage.isDemographicInformationInPreviewPageDisplayed(), "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.isBiometricsInformationInPreviewPageDisplayed(),"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/UpdateMyUinUpdateDocuments.java b/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUinUpdateDocuments.java index af8c666e2..70e7701f2 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUinUpdateDocuments.java +++ b/ui-test/src/main/java/regclient/androidTestCases/UpdateMyUinUpdateDocuments.java @@ -375,13 +375,13 @@ public void updateMyUinUpdateDocuments() throws InterruptedException { throw new IllegalStateException("Unsupported language in testdata.json: " + language); } assertTrue(previewPage.updateUINTitleDisplayed(), "Verify if new update uin title is displayed"); - assertTrue(previewPage.isApplicationIDPreviewPagePageDisplayed(), + assertTrue(previewPage.isApplicationIDPreviewPageDisplayed(), "Verify if application ID In PreviewPage is displayed"); assertTrue(previewPage.isDemographicInformationInPreviewPageDisplayed(), "Verify if Demographic Information In PreviewPage is displayed"); assertTrue(previewPage.isDocumentsInformationInPreviewPageDisplayed(), "Verify if Documents Information In PreviewPage is displayed"); - assertTrue(previewPage.isBiometricsInformationInPreviewPagePageDisplayed(), + assertTrue(previewPage.isBiometricsInformationInPreviewPageDisplayed(), "Verify if Biometrics Information In PreviewPage is displayed"); String Aid = previewPage.getAID(); if ("eng".equalsIgnoreCase(language)) { diff --git a/ui-test/src/main/java/regclient/api/ArcConfigManager.java b/ui-test/src/main/java/regclient/api/ArcConfigManager.java index 8b1f09018..4fbd3e213 100644 --- a/ui-test/src/main/java/regclient/api/ArcConfigManager.java +++ b/ui-test/src/main/java/regclient/api/ArcConfigManager.java @@ -6,6 +6,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Properties; +import java.lang.NumberFormatException; import org.apache.log4j.Level; import org.apache.log4j.Logger; diff --git a/ui-test/src/main/java/regclient/api/FetchUiSpec.java b/ui-test/src/main/java/regclient/api/FetchUiSpec.java index afd3cf9c1..7e18bb226 100644 --- a/ui-test/src/main/java/regclient/api/FetchUiSpec.java +++ b/ui-test/src/main/java/regclient/api/FetchUiSpec.java @@ -54,7 +54,24 @@ public static void getUiSpec(String type) { Response response = RestClient.getRequestWithCookieAndQueryParm(url, map, MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON, "Authorization", token); UiSpec = response.asString(); + }else if (type.equals("bioCorrectionProcess")) { + String token = kernelAuthLib.getTokenByRole("globalAdmin"); + String url = ApplnURI + "/v1/masterdata/uispec/registration-client/latest"; + HashMap map = new HashMap(); + map.put("type", type); + Response response = RestClient.getRequestWithCookieAndQueryParm(url, map, MediaType.APPLICATION_JSON, + MediaType.APPLICATION_JSON, "Authorization", token); + UiSpec = response.asString(); + }else if (type.equals("lostProcess")) { + String token = kernelAuthLib.getTokenByRole("globalAdmin"); + String url = ApplnURI + "/v1/masterdata/uispec/registration-client/latest"; + HashMap map = new HashMap(); + map.put("type", type); + Response response = RestClient.getRequestWithCookieAndQueryParm(url, map, MediaType.APPLICATION_JSON, + MediaType.APPLICATION_JSON, "Authorization", token); + UiSpec = response.asString(); } + } public static List getAllScreenOrder() { diff --git a/ui-test/src/main/java/regclient/page/ApplicantBiometricsPage.java b/ui-test/src/main/java/regclient/page/ApplicantBiometricsPage.java index 9cbc75364..61f87f8de 100644 --- a/ui-test/src/main/java/regclient/page/ApplicantBiometricsPage.java +++ b/ui-test/src/main/java/regclient/page/ApplicantBiometricsPage.java @@ -75,4 +75,6 @@ public ApplicantBiometricsPage(AppiumDriver driver) { public abstract boolean isExceptionCountDisplayed(); public abstract boolean isAuthenticationBiometricsPageDisplayed(); + + public abstract BiometricDetailsPage clickOnBiometricsMenuButton(); } diff --git a/ui-test/src/main/java/regclient/page/BasePage.java b/ui-test/src/main/java/regclient/page/BasePage.java index 51eb1ec69..bce29c9b5 100644 --- a/ui-test/src/main/java/regclient/page/BasePage.java +++ b/ui-test/src/main/java/regclient/page/BasePage.java @@ -158,6 +158,15 @@ protected void clickAndsendKeysToTextBox(WebElement element, String text) { waitTime(1); ((HidesKeyboard) driver).hideKeyboard(); } + + protected void clickAndsendKeysToTextBox4(WebElement element, String text) { + this.waitForElementToBeVisible(element); + element.click(); + waitTime(1); + element.clear(); + waitTime(1); + element.sendKeys(text); + } protected void clickAndsendKeysToTextBox3(WebElement element, String text) { this.waitForElementToBeClickable(element); @@ -212,7 +221,7 @@ protected void cropCaptureImage(WebElement element) { getCenterOfElement(element.getLocation(), element.getSize()))) // ,43,1166 .addAction(finger1.createPointerDown(PointerInput.MouseButton.LEFT.asArg())) .addAction(new Pause(finger1, Duration.ofMillis(200))) - .addAction(finger1.createPointerMove(Duration.ofMillis(500), PointerInput.Origin.viewport(), 414, 598)) + .addAction(finger1.createPointerMove(Duration.ofMillis(500), PointerInput.Origin.viewport(), 623, 261)) .addAction(finger1.createPointerUp(PointerInput.MouseButton.LEFT.asArg())); driver.perform(Collections.singletonList(sequence)); } @@ -409,12 +418,12 @@ protected void clickAtCoordinates(int x, int y) { public static String generateData(String validator) { if (validator == null || validator.isEmpty()) { - return generateStringOfLength(3, 30); + return generateStringOfLength(3, 10); } switch (validator) { case "^(?=.{2,50}$).*": - return generateStringOfLength(2, 30); + return generateStringOfLength(2, 10); case "^([0-9]{10})$": return generateTenDigitNumber(); @@ -423,7 +432,7 @@ public static String generateData(String validator) { return generateDateInRange(); case "^(?=.{3,50}$).*": - return generateStringOfLength(3, 30); + return generateStringOfLength(3, 10); case "^[+]*([0-9]{1})([0-9]{9})$": return generateNineDigitNumber() + "1"; @@ -949,4 +958,57 @@ private void executeAdbCommand(String[] command) { } } + protected void scrollUntilElementVisible(WebElement element) { + hideKeyboardIfVisible(); + try { + if (element.isDisplayed()) { + return; + } + } catch (Exception ignored) { + } + + for (int i = 0; i < 6; i++) { + swipeUp(); + try { + if (element.isDisplayed()) { + return; + } + } catch (Exception ignored) { + } + } + + scrollToTopSafe(); + hideKeyboardIfVisible(); + + for (int i = 0; i < 6; i++) { + swipeUp(); + try { + if (element.isDisplayed()) { + return; + } + } catch (Exception ignored) { + } + } + + throw new NoSuchElementException("Element not visible after scrolling: " + element); + } + + protected void tapScreenCenter() { + + Dimension size = driver.manage().window().getSize(); + + int x = size.width / 2; + int y = size.height / 2; + + PointerInput finger = new PointerInput(PointerInput.Kind.TOUCH, "finger"); + + Sequence tap = new Sequence(finger, 1); + tap.addAction(finger.createPointerMove(Duration.ZERO, + PointerInput.Origin.viewport(), x, y)); + tap.addAction(finger.createPointerDown(PointerInput.MouseButton.LEFT.asArg())); + tap.addAction(finger.createPointerUp(PointerInput.MouseButton.LEFT.asArg())); + + driver.perform(Arrays.asList(tap)); + } + } diff --git a/ui-test/src/main/java/regclient/page/CameraPage.java b/ui-test/src/main/java/regclient/page/CameraPage.java index 8e64a9bee..944815ca9 100644 --- a/ui-test/src/main/java/regclient/page/CameraPage.java +++ b/ui-test/src/main/java/regclient/page/CameraPage.java @@ -24,7 +24,7 @@ public class CameraPage extends BasePage { @AndroidFindBy(accessibility = "RETAKE") private WebElement retakeButton; - @AndroidFindBy(id = "com.hihonor.camera:id/done_button") + @AndroidFindBy(id = "com.android.camera2:id/done_button") private WebElement okBtn; public CameraPage(AppiumDriver driver) { @@ -33,9 +33,9 @@ public CameraPage(AppiumDriver driver) { public void clickimage() { for (int i = 0; i < 3; i++) { - clickAtCoordinates(1840, 598); + clickAtCoordinates(732, 696); - if (isElementDisplayed(okButton, 2)) { + if (isElementDisplayed(okBtn, 2)) { break; } } diff --git a/ui-test/src/main/java/regclient/page/ExportPage.java b/ui-test/src/main/java/regclient/page/ExportPage.java index ec4c81fbe..d1d883ca1 100644 --- a/ui-test/src/main/java/regclient/page/ExportPage.java +++ b/ui-test/src/main/java/regclient/page/ExportPage.java @@ -116,7 +116,7 @@ public boolean isFolderDisplayed(String folderName) { } public void enterFolderName(String foldername) { - clickAndsendKeysToTextBox(newfolderTextBox, foldername); + clickAndsendKeysToTextBox4(newfolderTextBox, foldername); } public void clickOnOkButton() { @@ -159,38 +159,49 @@ private void scrollToText(String text) { } public void exportPacketIntoFolder(String folderName) { - if (isFolderTitleDisplayed(folderName)) { - logger.info(folderName + " folder already exists. Using it."); + + // STEP 1: If already opened → just return + if (exportIfTargetFolderAlreadyOpened(folderName)) { + logger.info("Target folder already opened: " + folderName); + return; + } + + // STEP 2: Scroll till end and check folder + boolean folderExists = false; + + try { + scrollToText(folderName); // ideally should scroll till end + folderExists = isFolderDisplayed(folderName); + } catch (Exception e) { + logger.info("Folder not found during scroll: " + folderName); + } + + // STEP 3: If folder exists → select + use + if (folderExists) { + logger.info(folderName + " folder exists. Selecting it."); + + selectFolderByName(folderName); + clickOnUseThisFolderButton(); handleAllowFolderConsentIfPresent(); - if (exportIfTargetFolderAlreadyOpened(folderName)) { - return; - } - if (!isPacketManagerTitleDisplayed()) { - throw new IllegalStateException("Packet Manager page is not displayed."); - } - boolean folderExists = false; - try { - scrollToText(folderName); - folderExists = isFolderDisplayed(folderName); - } catch (Exception e) { - logger.info("Folder not found during scroll: " + folderName); - } - if (folderExists) { - logger.info(folderName + " folder exists. Selecting it."); - selectFolderByName(folderName); - } else { - logger.info(folderName + " folder not found. Creating new folder."); - clickNewFolderButton(); - if (!isNewFolderPopupDisplayed()) { - throw new RuntimeException("New Folder popup not displayed"); - } - enterFolderName(folderName); - clickOnOkButton(); - clickOnUseThisFolderButton(); - handleAllowFolderConsentIfPresent(); - } + + return; + } + + // STEP 4: If folder NOT exists → create new + logger.info(folderName + " folder not found. Creating new folder."); + + clickNewFolderButton(); + + if (!isNewFolderPopupDisplayed()) { + throw new RuntimeException("New Folder popup not displayed"); } + + enterFolderName(folderName); + clickOnOkButton(); + + clickOnUseThisFolderButton(); + handleAllowFolderConsentIfPresent(); } public boolean isFolderTitleDisplayed(String folderName) { @@ -202,17 +213,24 @@ public void navigateToFolderPath(String... folderPath) { try { + String targetFolder = folderPath[folderPath.length - 1]; + + // ✅ STEP 1: If already inside final folder → skip everything + if (isFolderTitleDisplayed(targetFolder)) { + logger.info("Already inside target folder: " + targetFolder); + return; + } + + // ✅ STEP 2: Navigate step by step for (String folder : folderPath) { logger.info("Navigating to folder: " + folder); - // If already inside this folder → skip if (isFolderHeaderDisplayed(folder)) { logger.info("Already inside folder: " + folder); continue; } - // Scroll and click folder scrollToText(folder); click(getFolderLocator(folder)); diff --git a/ui-test/src/main/java/regclient/page/ManageApplicationsPage.java b/ui-test/src/main/java/regclient/page/ManageApplicationsPage.java index 70f9917d6..3999f0023 100644 --- a/ui-test/src/main/java/regclient/page/ManageApplicationsPage.java +++ b/ui-test/src/main/java/regclient/page/ManageApplicationsPage.java @@ -68,6 +68,6 @@ public ManageApplicationsPage(AppiumDriver driver) { public abstract boolean isNoNetworkFoundDisplayed(); - public abstract void selectLatestAidCheckBox(); + public abstract void clickCheckboxByAID(String aid); } diff --git a/ui-test/src/main/java/regclient/page/OperationalTaskPage.java b/ui-test/src/main/java/regclient/page/OperationalTaskPage.java index 9e72a7b52..dab6afd8a 100644 --- a/ui-test/src/main/java/regclient/page/OperationalTaskPage.java +++ b/ui-test/src/main/java/regclient/page/OperationalTaskPage.java @@ -23,4 +23,6 @@ public OperationalTaskPage(AppiumDriver driver) { public abstract void clickPendingApprovalTitle(); public abstract boolean isPendingApprovalTitleDisplayed(); + + public abstract void handleIfSyncPopUpDisplayed(); } diff --git a/ui-test/src/main/java/regclient/page/PreviewPage.java b/ui-test/src/main/java/regclient/page/PreviewPage.java index a9fbb739e..4e4a353e6 100644 --- a/ui-test/src/main/java/regclient/page/PreviewPage.java +++ b/ui-test/src/main/java/regclient/page/PreviewPage.java @@ -14,11 +14,11 @@ public PreviewPage(AppiumDriver driver) { public abstract boolean isDocumentsInformationInPreviewPageDisplayed(); - public abstract boolean isBiometricsInformationInPreviewPagePageDisplayed(); + public abstract boolean isBiometricsInformationInPreviewPageDisplayed(); public abstract boolean isNewRegistrationTitleDisplayed(); - public abstract boolean isApplicationIDPreviewPagePageDisplayed(); + public abstract boolean isApplicationIDPreviewPageDisplayed(); public abstract DemographicDetailsPage clickOnDemographicDetailsTitle(); diff --git a/ui-test/src/main/java/regclient/page/RegistrationTasksPage.java b/ui-test/src/main/java/regclient/page/RegistrationTasksPage.java index c728e18d5..e5d640c50 100644 --- a/ui-test/src/main/java/regclient/page/RegistrationTasksPage.java +++ b/ui-test/src/main/java/regclient/page/RegistrationTasksPage.java @@ -51,5 +51,7 @@ public RegistrationTasksPage(AppiumDriver driver) { public abstract void clickOnRegistrationTasksTab(); public abstract boolean isSettingsButtonDisplayed(); + + public abstract void handleIfSyncPopUpDisplayed(); } diff --git a/ui-test/src/main/java/regclient/pages/arabic/ApplicantBiometricsPageArabic.java b/ui-test/src/main/java/regclient/pages/arabic/ApplicantBiometricsPageArabic.java index 1e1c61262..4622b9701 100644 --- a/ui-test/src/main/java/regclient/pages/arabic/ApplicantBiometricsPageArabic.java +++ b/ui-test/src/main/java/regclient/pages/arabic/ApplicantBiometricsPageArabic.java @@ -61,7 +61,7 @@ public class ApplicantBiometricsPageArabic extends ApplicantBiometricsPage { @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"استثناء مسح\"))") private WebElement exceptionScanTitle; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().description(\"مسح\"))") + @AndroidFindBy(accessibility = "مسح") private WebElement scanButton; @AndroidFindBy(xpath = "//*[contains(@content-desc, 'Iris')]") @@ -82,7 +82,7 @@ public class ApplicantBiometricsPageArabic extends ApplicantBiometricsPage { @AndroidFindBy(xpath = "//*[contains(@content-desc, 'Exception')]") private WebElement exceptionCapturerHeader; - @AndroidFindBy(xpath = "//android.widget.ScrollView/android.view.View[2]") + @AndroidFindBy(accessibility = "zoom_in_button") private WebElement zoomButton; @AndroidFindBy(xpath = "//android.view.View[contains(@content-desc, \"التعليقات\")]/following-sibling::android.widget.EditText") @@ -100,6 +100,9 @@ public class ApplicantBiometricsPageArabic extends ApplicantBiometricsPage { @AndroidFindBy(xpath = "//android.view.View[@content-desc=\"الاستثناءات\"]/following-sibling::android.view.View[@content-desc=\"1\"]") private WebElement exceptionCount; + @AndroidFindBy(accessibility = "menu_back_button") + private WebElement biometricsMenuButton; + public ApplicantBiometricsPageArabic(AppiumDriver driver) { super(driver); } @@ -112,6 +115,7 @@ public void enterCommentsInTextBox(String comments) { } public void clickOnScanButton() { + scrollUntilElementVisible(scanButton); clickOnElement(scanButton); } @@ -163,8 +167,7 @@ public BiometricDetailsPage clickOnNextButton() { } public void clickOnZoomButton() { - waitTime(1); - clickAtCoordinates(1035, 1077); + clickOnElement(zoomButton); } public void clickOnIrisScanTitle() { @@ -266,4 +269,9 @@ public boolean isExceptionCountDisplayed() { return isElementDisplayed(exceptionCount); } + public BiometricDetailsPage clickOnBiometricsMenuButton() { + clickOnElement(biometricsMenuButton); + return new BiometricDetailsPageArabic(driver); + } + } diff --git a/ui-test/src/main/java/regclient/pages/arabic/AuthenticationPageArabic.java b/ui-test/src/main/java/regclient/pages/arabic/AuthenticationPageArabic.java index 142d96012..6ecbb5e81 100644 --- a/ui-test/src/main/java/regclient/pages/arabic/AuthenticationPageArabic.java +++ b/ui-test/src/main/java/regclient/pages/arabic/AuthenticationPageArabic.java @@ -1,5 +1,7 @@ package regclient.pages.arabic; +import java.util.List; + import org.openqa.selenium.WebElement; import io.appium.java_client.AppiumDriver; @@ -19,7 +21,7 @@ public class AuthenticationPageArabic extends AuthenticationPage { private WebElement passwordTextBox; @AndroidFindBy(accessibility = "المصادقة") - private WebElement authenticateButton; + private List authenticateButtons;; @AndroidFindBy(xpath = "//android.view.View[@content-desc='المصادقة باستخدام كلمة المرور']/preceding-sibling::android.widget.ImageView") private WebElement authenticationImage; @@ -41,7 +43,8 @@ public boolean isAuthenticationPageDisplayed() { } public AcknowledgementPage clickOnAuthenticatenButton() { - clickOnElement2(authenticateButton); + int size=authenticateButtons.size()-1; + clickOnElement2(authenticateButtons.get(size)); return new AcknowledgementPageArabic(driver); } 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 3d3fe3045..07b430ed2 100644 --- a/ui-test/src/main/java/regclient/pages/arabic/BiometricDetailsPageArabic.java +++ b/ui-test/src/main/java/regclient/pages/arabic/BiometricDetailsPageArabic.java @@ -24,26 +24,27 @@ import regclient.page.IntroducerBiometricPage; import regclient.page.PreviewPage; import regclient.page.RegistrationTasksPage; +import regclient.pages.english.BiometricDetailsPageEnglish; import regclient.pages.english.RegistrationTasksPageEnglish; public class BiometricDetailsPageArabic extends BiometricDetailsPage { - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"القزحية مسح\"))") + @AndroidFindBy(accessibility = "Iris") private WebElement irisScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"اليد اليمنى مسح\"))") - private WebElement rightHandScanIcon; - - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"اليد اليسرى مسح\"))") - private WebElement leftHandScanIcon; + @AndroidFindBy(accessibility = "Face") + private WebElement faceScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"الأبهام مسح\"))") + @AndroidFindBy(accessibility = "Thumbs") private WebElement thumbsScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"الوجه مسح\"))") - private WebElement faceScanIcon; + @AndroidFindBy(accessibility = "Left Hand") + private WebElement leftHandScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"استثناء مسح\"))") + @AndroidFindBy(accessibility = "Right Hand") + private WebElement rightHandScanIcon; + + @AndroidFindBy(accessibility = "Exception") private WebElement exceptionScanIcon; @AndroidFindBy(accessibility = "يكمل") @@ -64,10 +65,9 @@ public BiometricDetailsPageArabic(AppiumDriver driver) { @SuppressWarnings("deprecation") public boolean isBiometricDetailsPageDisplayed() { - scrollToTop(); - return isElementDisplayed( - findElementWithRetry(MobileBy.AndroidUIAutomator("new UiSelector().descriptionContains(\"" - + FetchUiSpec.getValueUsingId("individualBiometrics") + "\")"))); + return isElementDisplayed(findElementWithRetry(MobileBy.AndroidUIAutomator( + "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"" + + FetchUiSpec.getValueUsingId("individualBiometrics") + "\"))"))); } @SuppressWarnings("deprecation") @@ -78,74 +78,74 @@ public boolean isAuthenticationBiometricTitleDisplayed() { } public ApplicantBiometricsPage clickOnIrisScan() { + scrollUntilElementVisible(irisScanIcon); clickOnElement(irisScanIcon); return new ApplicantBiometricsPageArabic(driver); } public ApplicantBiometricsPage clickOnRightHandScanIcon() { + scrollUntilElementVisible(rightHandScanIcon); clickOnElement(rightHandScanIcon); return new ApplicantBiometricsPageArabic(driver); } public ApplicantBiometricsPage clickOnLeftHandScanIcon() { + scrollUntilElementVisible(leftHandScanIcon); clickOnElement(leftHandScanIcon); return new ApplicantBiometricsPageArabic(driver); } public ApplicantBiometricsPage clickOnThumbsScanIcon() { + scrollUntilElementVisible(thumbsScanIcon); clickOnElement(thumbsScanIcon); return new ApplicantBiometricsPageArabic(driver); } public ApplicantBiometricsPage clickOnFaceScanIcon() { + scrollUntilElementVisible(faceScanIcon); clickOnElement(faceScanIcon); return new ApplicantBiometricsPageArabic(driver); } public ApplicantBiometricsPage clickOnExceptionScanIcon() { + scrollUntilElementVisible(exceptionScanIcon); clickOnElement(exceptionScanIcon); return new ApplicantBiometricsPageArabic(driver); - } 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=\"القزحية مسح\"]"))); + clickOnElement(findElementWithRetry(By.xpath( + "//android.view.View[contains(@content-desc,\"" + FetchUiSpec.getValueUsingId("introducerBiometrics") + + "\")]/following-sibling::android.view.View//android.view.View[@content-desc='Iris']"))); return new IntroducerBiometricPageArabic(driver); - } 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=\"اليد اليمنى مسح\"]"))); + clickOnElement(findElementWithRetry(By.xpath( + "//android.view.View[contains(@content-desc,\"" + FetchUiSpec.getValueUsingId("introducerBiometrics") + + "\")]/following-sibling::android.view.View//android.view.View[@content-desc='Right Hand']"))); return new IntroducerBiometricPageArabic(driver); - } 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=\"اليد اليسرى مسح\"]"))); + + "\")]/following-sibling::android.view.View/descendant::android.view.View/descendant::android.widget.ImageView[@content-desc=\"Left Hand\"]"))); return new IntroducerBiometricPageArabic(driver); - } 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=\"الأبهام مسح\"]"))); + + "\")]/following-sibling::android.view.View/descendant::android.view.View/descendant::android.widget.ImageView[@content-desc=\"Thumbs\"]"))); return new IntroducerBiometricPageArabic(driver); - } 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=\"الوجه مسح\"]"))); + + "\")]/following-sibling::android.view.View/descendant::android.view.View/descendant::android.widget.ImageView[@content-desc=\"Face\"]"))); return new IntroducerBiometricPageArabic(driver); - } public PreviewPage clickOnContinueButton() { @@ -165,69 +165,71 @@ public boolean isAdditionalInfoRequestIdTextboxDisplayed() { } public void enterAdditionalInfoUsingEmail(String emailId) { - final int totalTimeoutMinutes = 15; // 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 - logger.info("OTPListener.getAdditionalReqId threw: " + e.getMessage()); + System.out.println(emailId); + String additionalInfoReqId = OTPListener.getAdditionalReqId(emailId); + if (additionalInfoReqId == null || additionalInfoReqId.trim().isEmpty()) { + throw new IllegalStateException("Additional Info Request ID is missing for email: " + emailId); + } + additionalInfoReqId = additionalInfoReqId + "-BIOMETRIC_CORRECTION-1"; + + + try { + if (typeAndVerify(additionalInfoRequestIdTextbox, additionalInfoReqId)) { + logger.info("typeAndVerify succeeded."); + return; // SUCCESS → exit method + } else { + throw new AssertionError("Textbox did not accept the id: " + additionalInfoReqId); } + } catch (Exception e) { + throw new AssertionError("Failed while typing/verifying finalId: " + additionalInfoReqId, e); + } - if (id != null && !id.isEmpty() && !"{Failed}".equals(id)) { - String finalId = id.trim() + (id.endsWith(SUFFIX) ? "" : SUFFIX); - logger.info("Found id: " + id + " -> finalId: " + finalId); + } - // typeAndVerify should return true on success; handle its failure/exception - try { - typeAndVerify(additionalInfoRequestIdTextbox, finalId); - logger.info("Entered finalId: " + finalId); - return; // success - } catch (Exception e) { - throw new AssertionError("Failed while typing finalId: " + finalId + " : " + e.getMessage(), e); - } + private boolean typeAndVerify(WebElement el, String value) { + el.click(); + el.clear(); + el.sendKeys(value); - } + // read the visible/real value in a safe way + String curr = readElementValue(el); - // handle auto logout popup + // exact match (keeps your previous behavior) + return value.equals(curr); + } + + private String readElementValue(WebElement el) { + try { + String ctx = ""; try { - if (isAutoLogoutPopupDisplayed()) { - logger.info("Auto-logout popup displayed — staying logged in."); - clickOnStayLoggedInButton(); - } + ctx = ((SupportsContextSwitching) driver).getContext(); } catch (Exception ignored) { } - // log remaining time - long elapsed = System.currentTimeMillis() - startMs; - long remainingMs = Math.max(0, timeoutMs - elapsed); - logger.info("ID not found yet. Elapsed " + (elapsed / 1000) + "s, remaining " + (remainingMs / 1000) - + "s. Sleeping " + pollIntervalSeconds + "s."); + 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 { - Thread.sleep(TimeUnit.SECONDS.toMillis(pollIntervalSeconds)); - } catch (InterruptedException ie) { - Thread.currentThread().interrupt(); - throw new AssertionError("Interrupted while waiting for AdditionalInfoReqId", ie); + String v = el.getAttribute(attr); + if (v != null && !v.isEmpty()) + return v; + } catch (Exception ignored) { } } - // If we reach here, timeout expired - throw new AssertionError( - "AdditionalInfoReqId not found within " + totalTimeoutMinutes + " minutes for " + emailId); - } - - private void typeAndVerify(WebElement el, String value) { - el.click(); - el.clear(); - el.sendKeys(value); + return ""; } public boolean isAutoLogoutPopupDisplayed() { 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 212a0661b..835b18005 100644 --- a/ui-test/src/main/java/regclient/pages/arabic/DemographicDetailsPageArabic.java +++ b/ui-test/src/main/java/regclient/pages/arabic/DemographicDetailsPageArabic.java @@ -103,6 +103,7 @@ public boolean isPreRegFetchDataTextBoxDisplay() { } public void fillDemographicDetailsPage(String age) { + scrollToTop(); List idList = FetchUiSpec.getAllIds("DemographicDetails"); for (String id : idList) { if (FetchUiSpec.getRequiredTypeUsingId(id)) { @@ -111,7 +112,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]")), @@ -126,12 +128,14 @@ public void fillDemographicDetailsPage(String age) { "new UiSelector().descriptionContains(\"" + FetchUiSpec.getValueUsingId(id) + "\")"))) { swipeOrScroll(); } + boolean isdisplayed = isElementDisplayed(MobileBy.AndroidUIAutomator( "new UiSelector().descriptionContains(\"" + FetchUiSpec.getValueUsingId(id) + "\")")); assertTrue(isdisplayed, "Verify if " + id + " header is displayed"); WebElement dropdownElement = findElement( - By.xpath("//android.view.View[contains(@content-desc, \"" + FetchUiSpec.getValueUsingId(id) - + "\")]/parent::android.view.View/parent::android.widget.Button")); + By.xpath("//android.widget.Button[.//android.view.View[contains(@content-desc,'" + + FetchUiSpec.getValueUsingId(id) + "')]]")); + clickOnElement(dropdownElement); waitTime(1); if (!isElementDisplayed(dropdownElement)) { @@ -145,7 +149,7 @@ public void fillDemographicDetailsPage(String age) { waitTime(1); if (isElementDisplayed(By.xpath("//android.view.View[contains(@content-desc, \"" + FetchUiSpec.getValueUsingId(id) - + "\")]/parent::android.view.View/parent::android.widget.Button[contains(@content-desc, \"Select Option\")]"))) { + + "\")]/parent::android.view.View/parent::android.widget.Button[contains(@content-desc, \"اختر خياراً\")]"))) { clickOnElement(dropdownElement); waitTime(1); clickOnElement(findElement(By.className("android.view.View"))); @@ -217,7 +221,7 @@ else if (age.equals("currentCalenderDate")) { waitTime(1); if (isElementDisplayed(By.xpath("//android.view.View[contains(@content-desc, \"" + FetchUiSpec.getValueUsingId(id) - + "\")]/parent::android.view.View/parent::android.widget.Button[contains(@content-desc, \"Select Option\")]"))) { + + "\")]/parent::android.view.View/parent::android.widget.Button[contains(@content-desc, \"اختر خياراً\")]"))) { clickOnElement(dropdownElement); waitTime(1); clickOnElement(findElement(By.className("android.view.View"))); @@ -227,7 +231,7 @@ else if (age.equals("currentCalenderDate")) { if (id.equals("introducerName") && FetchUiSpec.getFlowType().equals("newProcess")) { if (age.equals("minor") || age.equals("infant") || age.equals("currentCalenderDate")) { if (FetchUiSpec.getControlTypeUsingId(id).equals("textbox")) { - waitTime(3); + waitTime(1); boolean isdisplayed = isElementDisplayed(findElementWithRetry(MobileBy.AndroidUIAutomator( "new UiSelector().descriptionContains(\"" + FetchUiSpec.getValueUsingId(id) + "\")"))); assertTrue(isdisplayed, "Verify if " + id + " header is displayed"); @@ -245,7 +249,7 @@ else if (age.equals("currentCalenderDate")) { if (id.equals("introducerRID") && FetchUiSpec.getFlowType().equals("newProcess")) { if (age.equals("minor") || age.equals("infant") || age.equals("currentCalenderDate")) { if (FetchUiSpec.getControlTypeUsingId(id).equals("textbox")) { - waitTime(3); + waitTime(1); boolean isdisplayed = isElementDisplayed(findElementWithRetry(MobileBy.AndroidUIAutomator( "new UiSelector().descriptionContains(\"" + FetchUiSpec.getValueUsingId(id) + "\")"))); assertTrue(isdisplayed, "Verify if " + id + " header is displayed"); @@ -688,7 +692,7 @@ public void fillRemainDemographicDetailsPage(String age) { waitTime(2); if (isElementDisplayed(By.xpath("//android.view.View[contains(@content-desc, \"" + FetchUiSpec.getValueUsingId(id) - + "\")]/parent::android.view.View/parent::android.widget.Button[contains(@content-desc, \"Select Option\")]"))) { + + "\")]/parent::android.view.View/parent::android.widget.Button[contains(@content-desc, \"اختر خياراً\")]"))) { clickOnElement(dropdownElement); waitTime(2); clickOnElement(findElement(By.className("android.view.View"))); @@ -696,7 +700,7 @@ public void fillRemainDemographicDetailsPage(String age) { } } else if (FetchUiSpec.getRequiredTypeUsingId(id) && id.equals("Postal")) { By postalDropdown = By.xpath("//android.view.View[contains(@content-desc, 'Postal')]" - + "/parent::android.view.View/parent::android.widget.Button[contains(@content-desc, 'Select Option')]"); + + "/parent::android.view.View/parent::android.widget.Button[contains(@content-desc, \"اختر خياراً\")]"); int attempts = 0; while (attempts < 3) { 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 0a9395443..9738ce637 100644 --- a/ui-test/src/main/java/regclient/pages/arabic/DocumentUploadPageArabic.java +++ b/ui-test/src/main/java/regclient/pages/arabic/DocumentUploadPageArabic.java @@ -53,7 +53,9 @@ public DocumentUploadPageArabic(AppiumDriver driver) { } public BiometricDetailsPage clickOnContinueButton() { + waitTime(1); clickOnElement(continueButton); + waitTime(1); return new BiometricDetailsPageArabic(driver); } @@ -112,6 +114,7 @@ public void uploadDoccuments(String age, String type) { cameraPage.clickOkButton(); waitTime(1); applyOrientation(); + waitTime(1); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); @@ -145,6 +148,7 @@ public void uploadDoccuments(String age, String type) { cameraPage.clickOkButton(); waitTime(1); applyOrientation(); + waitTime(1); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); @@ -181,6 +185,7 @@ public void uploadDoccuments(String age, String type) { cameraPage.clickOkButton(); waitTime(1); applyOrientation(); + waitTime(1); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); @@ -221,6 +226,7 @@ public void uploadDoccumentsUpdate(String age, String type) { cameraPage.clickOkButton(); waitTime(1); applyOrientation(); + waitTime(1); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); @@ -251,6 +257,7 @@ public void uploadDoccumentsUpdate(String age, String type) { cameraPage.clickOkButton(); waitTime(1); applyOrientation(); + waitTime(1); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); diff --git a/ui-test/src/main/java/regclient/pages/arabic/IntroducerBiometricPageArabic.java b/ui-test/src/main/java/regclient/pages/arabic/IntroducerBiometricPageArabic.java index b7728c3ad..e4bbb0744 100644 --- a/ui-test/src/main/java/regclient/pages/arabic/IntroducerBiometricPageArabic.java +++ b/ui-test/src/main/java/regclient/pages/arabic/IntroducerBiometricPageArabic.java @@ -42,7 +42,7 @@ public class IntroducerBiometricPageArabic extends IntroducerBiometricPage { @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"استثناء مسح\"))") private WebElement exceptionScanTitle; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().description(\"مسح\"))") + @AndroidFindBy(accessibility = "مسح") private WebElement scanButton; @AndroidFindBy(xpath = "//*[contains(@content-desc, 'Iris')]") @@ -77,6 +77,7 @@ public IntroducerBiometricPageArabic(AppiumDriver driver) { } public void clickOnScanButton() { + scrollUntilElementVisible(scanButton); clickOnElement(scanButton); } diff --git a/ui-test/src/main/java/regclient/pages/arabic/ManageApplicationsPageArabic.java b/ui-test/src/main/java/regclient/pages/arabic/ManageApplicationsPageArabic.java index 04cd27c96..c1cb738ef 100644 --- a/ui-test/src/main/java/regclient/pages/arabic/ManageApplicationsPageArabic.java +++ b/ui-test/src/main/java/regclient/pages/arabic/ManageApplicationsPageArabic.java @@ -24,7 +24,7 @@ public class ManageApplicationsPageArabic extends ManageApplicationsPage { @AndroidFindBy(accessibility = "حالة الملقم") private WebElement serverStatusDropdown; - @AndroidFindBy(accessibility = "تصدير") + @AndroidFindBy(accessibility = "يصدّر") private WebElement exportButton; @AndroidFindBy(accessibility = "تم الإنشاء") @@ -80,6 +80,9 @@ public class ManageApplicationsPageArabic extends ManageApplicationsPage { @AndroidFindBy(uiAutomator = "UiSelector().className(\"android.widget.CheckBox\").instance(1)") private WebElement latestAidCheckBox; + + @AndroidFindBy(accessibility = "manage_application_back_button") + private WebElement backButton; public ManageApplicationsPageArabic(AppiumDriver driver) { super(driver); @@ -223,7 +226,7 @@ public boolean isDeletionDropdownOptionDisplayed() { } public void clickOnBackButton() { - driver.navigate().back(); + clickOnElement(backButton); } public void clickOnExportButton() { @@ -256,4 +259,10 @@ public void selectLatestAidCheckBox() { clickOnElement(latestAidCheckBox); } + public void clickCheckboxByAID(String aid) { + By checkbox = By + .xpath("//android.view.View[contains(@content-desc,'" + aid + "')]" + "//android.widget.CheckBox"); + click(checkbox); + } + } diff --git a/ui-test/src/main/java/regclient/pages/arabic/OperationalTaskPageArabic.java b/ui-test/src/main/java/regclient/pages/arabic/OperationalTaskPageArabic.java index f8829775f..b6d854393 100644 --- a/ui-test/src/main/java/regclient/pages/arabic/OperationalTaskPageArabic.java +++ b/ui-test/src/main/java/regclient/pages/arabic/OperationalTaskPageArabic.java @@ -29,6 +29,12 @@ public class OperationalTaskPageArabic extends OperationalTaskPage { @AndroidFindBy(accessibility = "المهام التشغيلية") private WebElement operationalTaskPageTitle; + @AndroidFindBy(accessibility = "مزامنة. تم بنجاح") + private WebElement syncCompletedPopup; + + @AndroidFindBy(accessibility = "إعادة التشغيل") + private WebElement restartButton; + public OperationalTaskPageArabic(AppiumDriver driver) { super(driver); } @@ -79,4 +85,15 @@ public boolean isPendingApprovalTitleDisplayed() { return isElementDisplayed(pendingApprovalTitle); } + public void handleIfSyncPopUpDisplayed() { + for (int i = 0; i < 120; i++) { + if (isElementDisplayed(syncCompletedPopup)) { + clickOnElement(restartButton); + return; + } + waitTime(5); + } + throw new RuntimeException("Sync popup not displayed"); + } + } diff --git a/ui-test/src/main/java/regclient/pages/arabic/PendingApprovalArabic.java b/ui-test/src/main/java/regclient/pages/arabic/PendingApprovalArabic.java index 7012a6f7c..a3e5c65aa 100644 --- a/ui-test/src/main/java/regclient/pages/arabic/PendingApprovalArabic.java +++ b/ui-test/src/main/java/regclient/pages/arabic/PendingApprovalArabic.java @@ -47,7 +47,7 @@ public class PendingApprovalArabic extends PendingApproval { @AndroidFindBy(uiAutomator = "UiSelector().className(\"android.widget.EditText\").instance(1)") private WebElement passwordTextBox; - @AndroidFindBy(xpath = "//*[contains(@content-desc,\"ما زال يحتاج بتصدير\")]//preceding-sibling::android.widget.Button") + @AndroidFindBy(accessibility = "pending_approval_back_button") private WebElement backButton; @AndroidFindBy(accessibility = "يرفض") @@ -102,7 +102,8 @@ public boolean isPendingApprovalTitleDisplayed() { @SuppressWarnings("deprecation") public void clickOnAID(String AID) { - clickOnElement(findElementWithRetry(MobileBy.AccessibilityId(AID))); + By RID = MobileBy.AndroidUIAutomator("new UiSelector().descriptionContains(\"" + AID + "\")"); + click(RID); } public void clickOnApproveButton() { 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 7a4038484..be929b629 100644 --- a/ui-test/src/main/java/regclient/pages/arabic/PreviewPageArabic.java +++ b/ui-test/src/main/java/regclient/pages/arabic/PreviewPageArabic.java @@ -1,5 +1,6 @@ package regclient.pages.arabic; +import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.testng.Assert; @@ -82,7 +83,7 @@ public boolean isDocumentsInformationInPreviewPageDisplayed() { } } - public boolean isBiometricsInformationInPreviewPagePageDisplayed() { + public boolean isBiometricsInformationInPreviewPageDisplayed() { try { scrollToText("القياسات الحيوية"); return isElementDisplayed(biometricsInformationInPreviewPage); @@ -104,9 +105,20 @@ public boolean updateUINTitleDisplayed() { + FetchUiSpec.getTitleUsingId("UPDATE") + "\"))"))); } - public boolean isApplicationIDPreviewPagePageDisplayed() { - waitTime(1); - return isElementDisplayed(applicationIDPreviewPage); + public boolean isApplicationIDPreviewPageDisplayed() { + By applicationIdLocator = By.xpath("//android.view.View[contains(@text,'Application ID')]"); + for (int i = 0; i < 5; i++) { + try { + waitTime(1); + tapScreenCenter(); + waitTime(1); + if (driver.findElement(applicationIdLocator).isDisplayed()) { + return true; + } + } catch (Exception e) { + } + } + return false; } @SuppressWarnings("deprecation") diff --git a/ui-test/src/main/java/regclient/pages/arabic/RegistrationTasksPageArabic.java b/ui-test/src/main/java/regclient/pages/arabic/RegistrationTasksPageArabic.java index 406ee1f1f..488446155 100644 --- a/ui-test/src/main/java/regclient/pages/arabic/RegistrationTasksPageArabic.java +++ b/ui-test/src/main/java/regclient/pages/arabic/RegistrationTasksPageArabic.java @@ -34,13 +34,10 @@ public class RegistrationTasksPageArabic extends RegistrationTasksPage { @AndroidFindBy(xpath = "//android.widget.Toast[@text=\"اكتملت مزامنة البرنامج النصي\"]") private WebElement scriptSyncCompletedMessage; -// @AndroidFindBy(uiAutomator = "new UiSelector().descriptionEndsWith(\"لوحة القيادة\")") -// private WebElement dashboardButton; - - @AndroidFindBy(uiAutomator = "new UiSelector().descriptionMatches(\".*لوحة القيادة.*\")") + @AndroidFindBy(uiAutomator = "new UiSelector().descriptionContains(\"لوحة القيادة\")") private WebElement dashboardButton; - @AndroidFindBy(uiAutomator = "new UiSelector().descriptionMatches(\".*حساب تعريفي.*\")") + @AndroidFindBy(uiAutomator = "new UiSelector().descriptionContains(\"حساب تعريفي\")") private WebElement profileButton; @AndroidFindBy(accessibility = "تحديث UIN") @@ -67,6 +64,12 @@ public class RegistrationTasksPageArabic extends RegistrationTasksPage { @AndroidFindBy(id = "com.android.permissioncontroller:id/permission_deny_button") private WebElement dontAllowButton; + @AndroidFindBy(accessibility = "مزامنة. تم بنجاح") + private WebElement syncCompletedPopup; + + @AndroidFindBy(accessibility = "إعادة التشغيل") + private WebElement restartButton; + public RegistrationTasksPageArabic(AppiumDriver driver) { super(driver); } @@ -182,4 +185,15 @@ public boolean isSettingsButtonDisplayed() { return isElementDisplayed(settingsButton); } + public void handleIfSyncPopUpDisplayed() { + for (int i = 0; i < 120; i++) { + if (isElementDisplayed(syncCompletedPopup)) { + clickOnElement(restartButton); + return; + } + waitTime(5); + } + throw new RuntimeException("Sync popup not displayed"); + } + } diff --git a/ui-test/src/main/java/regclient/pages/arabic/SettingsPageArabic.java b/ui-test/src/main/java/regclient/pages/arabic/SettingsPageArabic.java index b250ae094..96ad11b51 100644 --- a/ui-test/src/main/java/regclient/pages/arabic/SettingsPageArabic.java +++ b/ui-test/src/main/java/regclient/pages/arabic/SettingsPageArabic.java @@ -47,13 +47,13 @@ public class SettingsPageArabic extends SettingsPage { @AndroidFindBy(accessibility = "مسح") private WebElement scanNowButton; - @AndroidFindBy(accessibility = "ID: e88198714e67562c\nName: io.mosip.mock.sbi.face\nStatus: Ready") + @AndroidFindBy(uiAutomator = "new UiSelector().descriptionContains(\"mock.sbi.face\")") private WebElement faceDeviceCard; - @AndroidFindBy(accessibility = "ID: e88198714e67562c\nName: io.mosip.mock.sbi.iris\nStatus: Ready") + @AndroidFindBy(uiAutomator = "new UiSelector().descriptionContains(\"mock.sbi.iris\")") private WebElement irisDeviceCard; - @AndroidFindBy(accessibility = "ID: e88198714e67562c\nName: io.mosip.mock.sbi.finger\nStatus: Ready") + @AndroidFindBy(uiAutomator = "new UiSelector().descriptionContains(\"mock.sbi.finger\")") private WebElement fingerDeviceCard; @AndroidFindBy(accessibility = "No devices found") @@ -68,7 +68,7 @@ public class SettingsPageArabic extends SettingsPage { @AndroidFindBy(accessibility = "CANCEL") private WebElement changesCancelButton; - @AndroidFindBy(accessibility = "إعدادات المهمة المجدولة") + @AndroidFindBy(accessibility = "إعدادات الوظائف المجدولة") private WebElement scheduledJobSettingsPageHeader; @AndroidFindBy(uiAutomator = "new UiSelector().descriptionContains(\"Master Data Sync\")") @@ -162,20 +162,16 @@ public void clickOnScheduledJobsSettingsTab() { } public void validateDeviceCard(String deviceName) { - // Wait a bit for the card to appear (helps if page loads slowly) WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); - WebElement card = wait.until(ExpectedConditions - .presenceOfElementLocated(By.xpath("//*[contains(@content-desc,'" + deviceName + "')]"))); - + WebElement card = wait.until(ExpectedConditions.presenceOfElementLocated( + MobileBy.AndroidUIAutomator("new UiSelector().descriptionContains(\"" + deviceName + "\")"))); String desc = card.getAttribute("content-desc"); System.out.println("Card text: " + desc); - - Pattern p = Pattern.compile("ID:\\s*([a-zA-Z0-9]+)"); + assertTrue(desc.contains(deviceName), "Device name not found"); + assertTrue(desc.toLowerCase().contains("ready"), "Device status not Ready"); + Pattern p = Pattern.compile("\\b[a-f0-9]{10,}\\b"); Matcher m = p.matcher(desc); - assertTrue(m.find(), "ID not found or empty"); - - assertTrue(desc.contains("Name: " + deviceName), "Device name mismatch"); - assertTrue(desc.contains("Status: Ready"), "Device status not Ready"); + assertTrue(m.find(), "Device ID not found or empty"); } public boolean isSubmitChangesPopupDisplayed() { @@ -192,18 +188,24 @@ public boolean isScheduledJobSettingsPageHeaderDisplayed() { public boolean isJobDisplayed(String jobName) { - // Scroll to jobs list (safe for long lists) - driver.findElement(MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector().scrollable(true))" - + ".scrollIntoView(new UiSelector().className(\"android.widget.EditText\"))")); + try { + By locator = MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector().scrollable(true))" + + ".scrollIntoView(new UiSelector().descriptionContains(\"" + jobName + "\"))"); - By job = By.xpath("//android.widget.EditText[contains(@hint,'" + jobName + "')]"); + WebElement element = driver.findElement(locator); + return element.isDisplayed(); - return isElementDisplayed(job); + } catch (Exception e) { + return false; + } } public void clickOnSyncButton(String jobName) { - By syncButton = By.xpath("//android.widget.EditText[contains(@hint,'" + jobName + "')]"); - click(syncButton); + By job = MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector().scrollable(true))" + + ".scrollIntoView(new UiSelector().descriptionContains(\"" + jobName + "\"))"); + WebElement jobElement = driver.findElement(job); + WebElement syncBtn = jobElement.findElement(By.xpath(".//android.widget.Button[1]")); + syncBtn.click(); } public boolean isToastVisible(String toastMessage) { diff --git a/ui-test/src/main/java/regclient/pages/arabic/SupervisorBiometricVerificationpageArabic.java b/ui-test/src/main/java/regclient/pages/arabic/SupervisorBiometricVerificationpageArabic.java index 692ee0d28..87e25ba72 100644 --- a/ui-test/src/main/java/regclient/pages/arabic/SupervisorBiometricVerificationpageArabic.java +++ b/ui-test/src/main/java/regclient/pages/arabic/SupervisorBiometricVerificationpageArabic.java @@ -11,19 +11,19 @@ public class SupervisorBiometricVerificationpageArabic extends SupervisorBiometr @AndroidFindBy(accessibility = "تسجيل القياسات الحيوية للمشغل") private WebElement operatorBiometricVerificationPageTitle; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"القزحية مسح\"))") + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Iris\"))") private WebElement irisScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"اليد اليمنى مسح\"))") + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"Right Hand\"))") private WebElement rightHandScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"اليد اليسرى مسح\"))") + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().className(\"android.widget.ScrollView\")).scrollIntoView(new UiSelector().className(\"android.widget.ImageView\").description(\"Left Hand\"))") private WebElement leftHandScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"الأبهام مسح\"))") + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"Thumbs\"))") private WebElement thumbsScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"الوجه مسح\"))") + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().className(\"android.widget.ScrollView\")).scrollIntoView(new UiSelector().className(\"android.widget.ImageView\").description(\"Face\"))") private WebElement faceScanIcon; @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"استثناء مسح\"))") @@ -47,7 +47,7 @@ public class SupervisorBiometricVerificationpageArabic extends SupervisorBiometr @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"استثناء مسح\"))") private WebElement exceptionScanTitle; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().description(\"مسح\"))") + @AndroidFindBy(accessibility = "مسح") private WebElement scanButton; @AndroidFindBy(xpath = "//*[contains(@content-desc, 'Iris')]") @@ -113,7 +113,7 @@ public class SupervisorBiometricVerificationpageArabic extends SupervisorBiometr @AndroidFindBy(accessibility = "وضع علامة على الاستثناءات على الوجه غير مسموح") private WebElement markingExceptionsOnFaceIsNotAllowedText; - @AndroidFindBy(uiAutomator = "new UiSelector().className(\"android.view.View\").clickable(true)") + @AndroidFindBy(accessibility = "zoom_in_button") private WebElement zoomButton; @AndroidFindBy(xpath = "//android.view.View[contains(@content-desc, \"الحد \")]/following-sibling::android.view.View") @@ -164,6 +164,7 @@ public void clickOnExceptionScanIcon() { } public void clickOnScanButton() { + scrollUntilElementVisible(scanButton); clickOnElement(scanButton); } diff --git a/ui-test/src/main/java/regclient/pages/arabic/UpdateOperatorBiometricspageArabic.java b/ui-test/src/main/java/regclient/pages/arabic/UpdateOperatorBiometricspageArabic.java index 8147bb233..fe49ed986 100644 --- a/ui-test/src/main/java/regclient/pages/arabic/UpdateOperatorBiometricspageArabic.java +++ b/ui-test/src/main/java/regclient/pages/arabic/UpdateOperatorBiometricspageArabic.java @@ -20,19 +20,19 @@ public UpdateOperatorBiometricspageArabic(AppiumDriver driver) { @AndroidFindBy(accessibility = "تحديث المشرف الحيوي") private WebElement supervisorBiometricUpdatePageTitle; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"القزحية مسح\"))") + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Iris\"))") private WebElement irisScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"اليد اليمنى مسح\"))") + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"Right Hand\"))") private WebElement rightHandScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"اليد اليسرى مسح\"))") + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().className(\"android.widget.ScrollView\")).scrollIntoView(new UiSelector().className(\"android.widget.ImageView\").description(\"Left Hand\"))") private WebElement leftHandScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"الأبهام مسح\"))") + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"Thumbs\"))") private WebElement thumbsScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"الوجه مسح\"))") + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().className(\"android.widget.ScrollView\")).scrollIntoView(new UiSelector().className(\"android.widget.ImageView\").description(\"Face\"))") private WebElement faceScanIcon; @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"استثناء مسح\"))") @@ -56,7 +56,7 @@ public UpdateOperatorBiometricspageArabic(AppiumDriver driver) { @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"استثناء مسح\"))") private WebElement exceptionScanTitle; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().description(\"مسح\"))") + @AndroidFindBy(accessibility = "مسح") private WebElement scanButton; @AndroidFindBy(xpath = "//*[contains(@content-desc, 'Iris')]") @@ -122,7 +122,7 @@ public UpdateOperatorBiometricspageArabic(AppiumDriver driver) { @AndroidFindBy(accessibility = "وضع علامة على الاستثناءات على الوجه غير مسموح") private WebElement markingExceptionsOnFaceIsNotAllowedText; - @AndroidFindBy(uiAutomator = "new UiSelector().className(\"android.view.View\").clickable(true)") + @AndroidFindBy(accessibility = "zoom_in_button") private WebElement zoomButton; @AndroidFindBy(xpath = "//android.view.View[contains(@content-desc, \"الحد \")]/following-sibling::android.view.View") @@ -172,6 +172,7 @@ public void clickOnExceptionScanIcon() { } public void clickOnScanButton() { + scrollUntilElementVisible(scanButton); clickOnElement(scanButton); } diff --git a/ui-test/src/main/java/regclient/pages/english/ApplicantBiometricsPageEnglish.java b/ui-test/src/main/java/regclient/pages/english/ApplicantBiometricsPageEnglish.java index aabfe5564..a500c29d9 100644 --- a/ui-test/src/main/java/regclient/pages/english/ApplicantBiometricsPageEnglish.java +++ b/ui-test/src/main/java/regclient/pages/english/ApplicantBiometricsPageEnglish.java @@ -59,7 +59,7 @@ public class ApplicantBiometricsPageEnglish extends ApplicantBiometricsPage { @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"Exception Scan\"))") private WebElement exceptionScanTitle; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().description(\"Scan\"))") + @AndroidFindBy(accessibility = "Scan") private WebElement scanButton; @AndroidFindBy(xpath = "//*[contains(@content-desc, 'Iris Capture')]") @@ -80,7 +80,7 @@ public class ApplicantBiometricsPageEnglish extends ApplicantBiometricsPage { @AndroidFindBy(xpath = "//*[contains(@content-desc, 'Exception Capture')]") private WebElement exceptionCapturerHeader; - @AndroidFindBy(xpath = "//android.widget.ScrollView/android.view.View[10]") + @AndroidFindBy(accessibility = "zoom_in_button") private WebElement zoomButton; @AndroidFindBy(xpath = "//android.view.View[contains(@content-desc, \"Comments\")]/following-sibling::android.widget.EditText") @@ -98,6 +98,9 @@ public class ApplicantBiometricsPageEnglish extends ApplicantBiometricsPage { @AndroidFindBy(xpath = "//android.view.View[@content-desc=\"Exceptions\"]/following-sibling::android.view.View[@content-desc=\"1\"]") private WebElement exceptionCount; + @AndroidFindBy(accessibility = "menu_back_button") + private WebElement biometricsMenuButton; + public ApplicantBiometricsPageEnglish(AppiumDriver driver) { super(driver); } @@ -110,10 +113,8 @@ public void enterCommentsInTextBox(String comments) { } public void clickOnScanButton() { - WebElement scanBtn = driver.findElement(MobileBy - .AndroidUIAutomator("new UiScrollable(new UiSelector().className(\"android.widget.ScrollView\"))" - + ".scrollIntoView(new UiSelector().description(\"Scan\"))")); - clickOnElement(scanBtn); + scrollUntilElementVisible(scanButton); + clickOnElement(scanButton); } public void clickOnExceptionTypePermanentButton() { @@ -164,8 +165,7 @@ public BiometricDetailsPage clickOnNextButton() { } public void clickOnZoomButton() { - waitTime(1); - clickAtCoordinates(1035, 1077); + clickOnElement(zoomButton); } public void clickOnIrisScanTitle() { @@ -266,4 +266,9 @@ public boolean isExceptionCountDisplayed() { } return isElementDisplayed(exceptionCount); } + + public BiometricDetailsPage clickOnBiometricsMenuButton() { + clickOnElement(biometricsMenuButton); + return new BiometricDetailsPageEnglish(driver); + } } 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 ccc479091..9364eaed7 100644 --- a/ui-test/src/main/java/regclient/pages/english/BiometricDetailsPageEnglish.java +++ b/ui-test/src/main/java/regclient/pages/english/BiometricDetailsPageEnglish.java @@ -31,24 +31,26 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.amazonaws.services.budgets.model.Notification; + public class BiometricDetailsPageEnglish extends BiometricDetailsPage { - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Iris\"))") + @AndroidFindBy(accessibility = "Iris") private WebElement irisScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Right\"))") - private WebElement rightHandScanIcon; - - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Left\"))") - private WebElement leftHandScanIcon; + @AndroidFindBy(accessibility = "Face") + private WebElement faceScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Thumbs\"))") + @AndroidFindBy(accessibility = "Thumbs") private WebElement thumbsScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Face\"))") - private WebElement faceScanIcon; + @AndroidFindBy(accessibility = "Left Hand") + private WebElement leftHandScanIcon; + + @AndroidFindBy(accessibility = "Right Hand") + private WebElement rightHandScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Exception Scan\"))") + @AndroidFindBy(accessibility = "Exception") private WebElement exceptionScanIcon; @AndroidFindBy(accessibility = "CONTINUE") @@ -88,70 +90,60 @@ public boolean isAuthenticationBiometricTitleDisplayed() { } public ApplicantBiometricsPage clickOnIrisScan() { + scrollUntilElementVisible(irisScanIcon); clickOnElement(irisScanIcon); return new ApplicantBiometricsPageEnglish(driver); } public ApplicantBiometricsPage clickOnRightHandScanIcon() { + scrollUntilElementVisible(rightHandScanIcon); clickOnElement(rightHandScanIcon); return new ApplicantBiometricsPageEnglish(driver); } public ApplicantBiometricsPage clickOnLeftHandScanIcon() { - - WebElement leftHandScanIcon = driver.findElement(MobileBy - .AndroidUIAutomator("new UiScrollable(new UiSelector().className(\"android.widget.ScrollView\"))" - + ".scrollIntoView(new UiSelector().description(\"Left Hand Scan\"))")); - + scrollUntilElementVisible(leftHandScanIcon); clickOnElement(leftHandScanIcon); return new ApplicantBiometricsPageEnglish(driver); } public ApplicantBiometricsPage clickOnThumbsScanIcon() { - WebElement thumbsScanIcon = driver.findElement(MobileBy - .AndroidUIAutomator("new UiScrollable(new UiSelector().className(\"android.widget.ScrollView\"))" - + ".scrollIntoView(new UiSelector().description(\"Thumbs Scan\"))")); + scrollUntilElementVisible(thumbsScanIcon); clickOnElement(thumbsScanIcon); return new ApplicantBiometricsPageEnglish(driver); } public ApplicantBiometricsPage clickOnFaceScanIcon() { - WebElement faceScanIcon = driver.findElement(MobileBy - .AndroidUIAutomator("new UiScrollable(new UiSelector().className(\"android.widget.ScrollView\"))" - + ".scrollIntoView(new UiSelector().description(\"Face Scan\"))")); + scrollUntilElementVisible(faceScanIcon); clickOnElement(faceScanIcon); - return new ApplicantBiometricsPageEnglish(driver); + return new ApplicantBiometricsPageEnglish(driver); } - public ApplicantBiometricsPage clickOnExceptionScanIcon() { + scrollUntilElementVisible(exceptionScanIcon); clickOnElement(exceptionScanIcon); return new ApplicantBiometricsPageEnglish(driver); - } 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\"]"))); + clickOnElement(findElementWithRetry(By.xpath( + "//android.view.View[contains(@content-desc,\"" + FetchUiSpec.getValueUsingId("introducerBiometrics") + + "\")]/following-sibling::android.view.View//android.view.View[@content-desc='Iris']"))); return new IntroducerBiometricPageEnglish(driver); - } 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\"]"))); + clickOnElement(findElementWithRetry(By.xpath( + "//android.view.View[contains(@content-desc,\"" + FetchUiSpec.getValueUsingId("introducerBiometrics") + + "\")]/following-sibling::android.view.View//android.view.View[@content-desc='Right Hand']"))); return new IntroducerBiometricPageEnglish(driver); - } 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=\"Left Hand\"]"))); return new IntroducerBiometricPageEnglish(driver); - } public IntroducerBiometricPage clickOnIntroducerThumbScan() { @@ -159,7 +151,6 @@ public IntroducerBiometricPage clickOnIntroducerThumbScan() { + FetchUiSpec.getValueUsingId("introducerBiometrics") + "\")]/following-sibling::android.view.View/descendant::android.view.View/descendant::android.widget.ImageView[@content-desc=\"Thumbs\"]"))); return new IntroducerBiometricPageEnglish(driver); - } public IntroducerBiometricPage clickOnIntroducerFaceScan() { @@ -167,7 +158,6 @@ public IntroducerBiometricPage clickOnIntroducerFaceScan() { + FetchUiSpec.getValueUsingId("introducerBiometrics") + "\")]/following-sibling::android.view.View/descendant::android.view.View/descendant::android.widget.ImageView[@content-desc=\"Face\"]"))); return new IntroducerBiometricPageEnglish(driver); - } public PreviewPage clickOnContinueButton() { @@ -195,79 +185,26 @@ public RegistrationTasksPage clickOnStayLoggedInButton() { } public void enterAdditionalInfoUsingEmail(String 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); + System.out.println(emailId); + String additionalInfoReqId = OTPListener.getAdditionalReqId(emailId); + if (additionalInfoReqId == null || additionalInfoReqId.trim().isEmpty()) { + throw new IllegalStateException("Additional Info Request ID is missing for email: " + emailId); + } + additionalInfoReqId = additionalInfoReqId + "-BIOMETRIC_CORRECTION-1"; + + + try { + if (typeAndVerify(additionalInfoRequestIdTextbox, additionalInfoReqId)) { + logger.info("typeAndVerify succeeded."); + return; // SUCCESS → exit method + } else { + throw new AssertionError("Textbox did not accept the id: " + additionalInfoReqId); } + } catch (Exception e) { + throw new AssertionError("Failed while typing/verifying finalId: " + additionalInfoReqId, e); } - throw new AssertionError( - "AdditionalInfoReqId not found within " + totalTimeoutMinutes + " minutes for " + emailId); + // continue logic if valid } private boolean typeAndVerify(WebElement el, String value) { 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 267188e45..29aa040ab 100644 --- a/ui-test/src/main/java/regclient/pages/english/DocumentUploadPageEnglish.java +++ b/ui-test/src/main/java/regclient/pages/english/DocumentUploadPageEnglish.java @@ -46,7 +46,9 @@ public DocumentUploadPageEnglish(AppiumDriver driver) { } public BiometricDetailsPage clickOnContinueButton() { + waitTime(1); clickOnElement(continueButton); + waitTime(1); return new BiometricDetailsPageEnglish(driver); } @@ -107,6 +109,7 @@ public void uploadDoccuments(String age, String type) { cameraPage.clickOkButton(); waitTime(1); applyOrientation(); + waitTime(1); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); @@ -138,6 +141,7 @@ public void uploadDoccuments(String age, String type) { cameraPage.clickOkButton(); waitTime(1); applyOrientation(); + waitTime(1); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); @@ -172,6 +176,7 @@ public void uploadDoccuments(String age, String type) { cameraPage.clickOkButton(); waitTime(1); applyOrientation(); + waitTime(1); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); diff --git a/ui-test/src/main/java/regclient/pages/english/IntroducerBiometricPageEnglish.java b/ui-test/src/main/java/regclient/pages/english/IntroducerBiometricPageEnglish.java index c2aec7b08..39da056a9 100644 --- a/ui-test/src/main/java/regclient/pages/english/IntroducerBiometricPageEnglish.java +++ b/ui-test/src/main/java/regclient/pages/english/IntroducerBiometricPageEnglish.java @@ -41,7 +41,7 @@ public class IntroducerBiometricPageEnglish extends IntroducerBiometricPage { @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"Exception Scan\"))") private WebElement exceptionScanTitle; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().description(\"Scan\"))") + @AndroidFindBy(accessibility = "Scan") private WebElement scanButton; @AndroidFindBy(xpath = "//*[contains(@content-desc, 'Iris Capture')]") @@ -76,6 +76,7 @@ public IntroducerBiometricPageEnglish(AppiumDriver driver) { } public void clickOnScanButton() { + scrollUntilElementVisible(scanButton); clickOnElement(scanButton); } @@ -183,7 +184,7 @@ public boolean isFaceScan() { public boolean isExceptionScan() { return isElementDisplayed(exceptionCapturerHeader, 2000); } - + public boolean isNextButtonDisplayed() { return isElementDisplayed(nextButton); } diff --git a/ui-test/src/main/java/regclient/pages/english/ManageApplicationsPageEnglish.java b/ui-test/src/main/java/regclient/pages/english/ManageApplicationsPageEnglish.java index 3df6f8b33..1926efe68 100644 --- a/ui-test/src/main/java/regclient/pages/english/ManageApplicationsPageEnglish.java +++ b/ui-test/src/main/java/regclient/pages/english/ManageApplicationsPageEnglish.java @@ -1,7 +1,11 @@ package regclient.pages.english; +import java.time.Duration; + import org.openqa.selenium.By; import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; import io.appium.java_client.AppiumDriver; import io.appium.java_client.pagefactory.AndroidFindBy; @@ -84,8 +88,7 @@ public class ManageApplicationsPageEnglish extends ManageApplicationsPage { @AndroidFindBy(accessibility = "Displaying 1 Applications") private WebElement displayOneApplication; - @AndroidFindBy(xpath = "(//android.widget.TextView[@content-desc='Manage Applications']" - + "/ancestor::android.view.View)[1]//android.widget.Button") + @AndroidFindBy(accessibility = "manage_application_back_button") private WebElement backButton; public ManageApplicationsPageEnglish(AppiumDriver driver) { @@ -229,7 +232,7 @@ public boolean isDeletionDropdownOptionDisplayed() { } public void clickOnBackButton() { - driver.navigate().back(); + clickOnElement(backButton); } public void clickOnExportButton() { @@ -258,8 +261,10 @@ public boolean isNoNetworkFoundDisplayed() { return isElementDisplayed(noNetworkFound); } - public void selectLatestAidCheckBox() { - clickOnElement(latestAidCheckBox); + public void clickCheckboxByAID(String aid) { + By checkbox = By + .xpath("//android.view.View[contains(@content-desc,'" + aid + "')]" + "//android.widget.CheckBox"); + click(checkbox); } } diff --git a/ui-test/src/main/java/regclient/pages/english/OperationalTaskPageEnglish.java b/ui-test/src/main/java/regclient/pages/english/OperationalTaskPageEnglish.java index 93d2a2794..659a075cf 100644 --- a/ui-test/src/main/java/regclient/pages/english/OperationalTaskPageEnglish.java +++ b/ui-test/src/main/java/regclient/pages/english/OperationalTaskPageEnglish.java @@ -23,6 +23,12 @@ public class OperationalTaskPageEnglish extends OperationalTaskPage { @AndroidFindBy(uiAutomator = "new UiSelector().descriptionContains(\"Pending Approval\")") private WebElement pendingApprovalTitle; + + @AndroidFindBy(accessibility = "Sync Completed Successfully") + private WebElement syncCompletedPopup; + + @AndroidFindBy(accessibility = "Restart") + private WebElement restartButton; public OperationalTaskPageEnglish(AppiumDriver driver) { super(driver); @@ -71,5 +77,16 @@ public boolean isPendingApprovalTitleDisplayed() { } return isElementDisplayed(pendingApprovalTitle); } + + public void handleIfSyncPopUpDisplayed() { + for (int i = 0; i < 120; i++) { + if (isElementDisplayed(syncCompletedPopup)) { + clickOnElement(restartButton); + return; + } + waitTime(5); + } + throw new RuntimeException("Sync popup not displayed"); + } } diff --git a/ui-test/src/main/java/regclient/pages/english/PendingApprovalEnglish.java b/ui-test/src/main/java/regclient/pages/english/PendingApprovalEnglish.java index 205291d75..0bd7ac4ff 100644 --- a/ui-test/src/main/java/regclient/pages/english/PendingApprovalEnglish.java +++ b/ui-test/src/main/java/regclient/pages/english/PendingApprovalEnglish.java @@ -53,7 +53,7 @@ public class PendingApprovalEnglish extends PendingApproval { @AndroidFindBy(uiAutomator = "UiSelector().className(\"android.widget.EditText\").instance(1)") private WebElement passwordTextBox; - @AndroidFindBy(xpath = "//*[contains(@content-desc,\"Pending Approval\")]//preceding-sibling::android.widget.Button") + @AndroidFindBy(accessibility = "pending_approval_back_button") private WebElement backButton; @AndroidFindBy(accessibility = "Sl.no Application ID Reg. Date Client Status Review Status Operator ID") @@ -105,7 +105,8 @@ public boolean isPendingApprovalTitleDisplayed() { @SuppressWarnings("deprecation") public void clickOnAID(String AID) { - clickOnElement(findElementWithRetry(MobileBy.AccessibilityId(AID))); + By RID = MobileBy.AndroidUIAutomator("new UiSelector().descriptionContains(\"" + AID + "\")"); + click(RID); } public void clickOnApproveButton() { 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 4054a0de5..5d761dff7 100644 --- a/ui-test/src/main/java/regclient/pages/english/PreviewPageEnglish.java +++ b/ui-test/src/main/java/regclient/pages/english/PreviewPageEnglish.java @@ -67,12 +67,11 @@ public AuthenticationPage clickOnContinueButton() { public boolean isDemographicInformationInPreviewPageDisplayed() { try { - WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); By locator = MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector().scrollable(true))" - + ".scrollIntoView(new UiSelector().text(\"Demographic Information\"))"); + + ".scrollIntoView(new UiSelector().textContains(\"Demographic\"))"); - wait.until(ExpectedConditions.visibilityOfElementLocated(locator)); + driver.findElement(locator); return true; @@ -83,25 +82,36 @@ public boolean isDemographicInformationInPreviewPageDisplayed() { public boolean isDocumentsInformationInPreviewPageDisplayed() { try { - WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); - wait.until(ExpectedConditions.visibilityOf(documentsInformationInPreviewPage)); + + WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(15)); + + // wait until preview page loads + wait.until(ExpectedConditions.presenceOfElementLocated(By.className("android.webkit.WebView"))); scrollToText("Documents"); - return isElementDisplayed(documentsInformationInPreviewPage); + wait.until(ExpectedConditions.visibilityOf(documentsInformationInPreviewPage)); + + return true; } catch (Exception e) { return false; } } - public boolean isBiometricsInformationInPreviewPagePageDisplayed() { + public boolean isBiometricsInformationInPreviewPageDisplayed() { try { - WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); - wait.until(ExpectedConditions.visibilityOf(biometricsInformationInPreviewPage)); + + WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(15)); + + // wait for WebView + wait.until(ExpectedConditions.presenceOfElementLocated(By.className("android.webkit.WebView"))); + scrollToText("Biometrics"); - return isElementDisplayed(biometricsInformationInPreviewPage); + wait.until(ExpectedConditions.visibilityOf(biometricsInformationInPreviewPage)); + + return true; } catch (Exception e) { return false; @@ -136,15 +146,27 @@ public boolean isBiometricCorrectionTitleDisplayed() { } } - public boolean isApplicationIDPreviewPagePageDisplayed() { - try { - scrollToText("Application ID"); - WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); - wait.until(ExpectedConditions.visibilityOf(applicationIDPreviewPage)); - return true; - } catch (Exception e) { - return false; + public boolean isApplicationIDPreviewPageDisplayed() { + + By applicationIdLocator = By.xpath("//android.view.View[contains(@text,'Application ID')]"); + + for (int i = 0; i < 5; i++) { + + try { + waitTime(1); + tapScreenCenter(); + waitTime(1); + + if (driver.findElement(applicationIdLocator).isDisplayed()) { + return true; + } + + } catch (Exception e) { + // retry + } } + + return false; } @SuppressWarnings("deprecation") diff --git a/ui-test/src/main/java/regclient/pages/english/RegistrationTasksPageEnglish.java b/ui-test/src/main/java/regclient/pages/english/RegistrationTasksPageEnglish.java index c04d19c79..385fa8b1c 100644 --- a/ui-test/src/main/java/regclient/pages/english/RegistrationTasksPageEnglish.java +++ b/ui-test/src/main/java/regclient/pages/english/RegistrationTasksPageEnglish.java @@ -45,7 +45,7 @@ public class RegistrationTasksPageEnglish extends RegistrationTasksPage { @AndroidFindBy(xpath = "//android.widget.Toast[@text=\"Script Sync Completed\"]") private WebElement scriptSyncCompletedMessage; - @AndroidFindBy(xpath = "//android.widget.ImageView[contains(@content-desc,'Synchronize Data')]") + @AndroidFindBy(uiAutomator = "new UiSelector().descriptionStartsWith(\"Synchronize Data\")") private WebElement synchronizeDataButton; @AndroidFindBy(accessibility = "Settings\nTab 2 of 4") @@ -62,6 +62,12 @@ public class RegistrationTasksPageEnglish extends RegistrationTasksPage { @AndroidFindBy(id = "com.android.permissioncontroller:id/permission_deny_button") private WebElement dontAllowButton; + + @AndroidFindBy(accessibility = "Sync Completed Successfully") + private WebElement syncCompletedPopup; + + @AndroidFindBy(accessibility = "Restart") + private WebElement restartButton; public RegistrationTasksPageEnglish(AppiumDriver driver) { super(driver); @@ -170,9 +176,24 @@ public void handleLocationPermission() { public void clickOnRegistrationTasksTab() { clickOnElement(registrationTasksTitle); } - + public boolean isSettingsButtonDisplayed() { return isElementDisplayed(settingsButton); } + + public void handleIfSyncPopUpDisplayed() { + + for (int i = 0; i < 120; i++) { // 120 * 5 sec = 10 min + + if (isElementDisplayed(syncCompletedPopup)) { + clickOnElement(restartButton); + return; + } + + waitTime(5); // wait 5 seconds + } + + throw new RuntimeException("Sync popup not displayed"); + } } 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 c4498efc3..37fa2eba4 100644 --- a/ui-test/src/main/java/regclient/pages/english/SettingsPageEnglish.java +++ b/ui-test/src/main/java/regclient/pages/english/SettingsPageEnglish.java @@ -85,13 +85,13 @@ public class SettingsPageEnglish extends SettingsPage { @AndroidFindBy(accessibility = "Scan") private WebElement scanNowButton; - @AndroidFindBy(accessibility = "ID: e88198714e67562c\nName: io.mosip.mock.sbi.face\nStatus: Ready") + @AndroidFindBy(uiAutomator = "new UiSelector().descriptionContains(\"mock.sbi.face\")") private WebElement faceDeviceCard; - @AndroidFindBy(accessibility = "ID: e88198714e67562c\nName: io.mosip.mock.sbi.iris\nStatus: Ready") + @AndroidFindBy(uiAutomator = "new UiSelector().descriptionContains(\"mock.sbi.iris\")") private WebElement irisDeviceCard; - @AndroidFindBy(accessibility = "ID: e88198714e67562c\nName: io.mosip.mock.sbi.finger\nStatus: Ready") + @AndroidFindBy(uiAutomator = "new UiSelector().descriptionContains(\"mock.sbi.finger\")") private WebElement fingerDeviceCard; @AndroidFindBy(accessibility = "No devices found") @@ -106,7 +106,7 @@ public class SettingsPageEnglish extends SettingsPage { @AndroidFindBy(accessibility = "CANCEL") private WebElement changesCancelButton; - @AndroidFindBy(accessibility = "Scheduled Job Settings") + @AndroidFindBy(accessibility = "Scheduled Jobs Settings") private WebElement scheduledJobSettingsPageHeader; @AndroidFindBy(xpath = "//*[@content-desc[contains(.,'Master Data Sync')]]") @@ -210,20 +210,16 @@ public void clickOnScheduledJobsSettingsTab() { } public void validateDeviceCard(String deviceName) { - // Wait a bit for the card to appear (helps if page loads slowly) WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); - WebElement card = wait.until(ExpectedConditions - .presenceOfElementLocated(By.xpath("//*[contains(@content-desc,'" + deviceName + "')]"))); - + WebElement card = wait.until(ExpectedConditions.presenceOfElementLocated( + MobileBy.AndroidUIAutomator("new UiSelector().descriptionContains(\"" + deviceName + "\")"))); String desc = card.getAttribute("content-desc"); System.out.println("Card text: " + desc); - - Pattern p = Pattern.compile("ID:\\s*([a-zA-Z0-9]+)"); + assertTrue(desc.contains(deviceName), "Device name not found"); + assertTrue(desc.toLowerCase().contains("ready"), "Device status not Ready"); + Pattern p = Pattern.compile("\\b[a-f0-9]{10,}\\b"); Matcher m = p.matcher(desc); - assertTrue(m.find(), "ID not found or empty"); - - assertTrue(desc.contains("Name: " + deviceName), "Device name mismatch"); - assertTrue(desc.contains("Status: Ready"), "Device status not Ready"); + assertTrue(m.find(), "Device ID not found or empty"); } public boolean isSubmitChangesPopupDisplayed() { @@ -266,18 +262,24 @@ public boolean validateJobCardFields(String jobName) { public boolean isJobDisplayed(String jobName) { - // Scroll to jobs list (safe for long lists) - driver.findElement(MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector().scrollable(true))" - + ".scrollIntoView(new UiSelector().className(\"android.widget.EditText\"))")); + try { + By locator = MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector().scrollable(true))" + + ".scrollIntoView(new UiSelector().descriptionContains(\"" + jobName + "\"))"); - By job = By.xpath("//android.widget.EditText[contains(@hint,'" + jobName + "')]"); + WebElement element = driver.findElement(locator); + return element.isDisplayed(); - return isElementDisplayed(job); + } catch (Exception e) { + return false; + } } - + public void clickOnSyncButton(String jobName) { - By syncButton = By.xpath("//android.widget.EditText[contains(@hint,'" + jobName + "')]"); - click(syncButton); + By job = MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector().scrollable(true))" + + ".scrollIntoView(new UiSelector().descriptionContains(\"" + jobName + "\"))"); + WebElement jobElement = driver.findElement(job); + WebElement syncBtn = jobElement.findElement(By.xpath(".//android.widget.Button[1]")); + syncBtn.click(); } public boolean isGlobalConfigSettingsSearchBoxDisplayed() { diff --git a/ui-test/src/main/java/regclient/pages/english/SupervisorBiometricVerificationpageEnglish.java b/ui-test/src/main/java/regclient/pages/english/SupervisorBiometricVerificationpageEnglish.java index 03f22367c..b9da811d0 100644 --- a/ui-test/src/main/java/regclient/pages/english/SupervisorBiometricVerificationpageEnglish.java +++ b/ui-test/src/main/java/regclient/pages/english/SupervisorBiometricVerificationpageEnglish.java @@ -48,7 +48,7 @@ public class SupervisorBiometricVerificationpageEnglish extends SupervisorBiomet @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"Exception Scan\"))") private WebElement exceptionScanTitle; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().description(\"Scan\"))") + @AndroidFindBy(accessibility = "Scan") private WebElement scanButton; @AndroidFindBy(xpath = "//*[contains(@content-desc, 'Iris Capture')]") @@ -114,7 +114,7 @@ public class SupervisorBiometricVerificationpageEnglish extends SupervisorBiomet @AndroidFindBy(accessibility = "Marking exceptions on Face is not allowed") private WebElement markingExceptionsOnFaceIsNotAllowedText; - @AndroidFindBy(xpath = "//android.widget.ScrollView/android.view.View[3]") + @AndroidFindBy(accessibility = "zoom_in_button") private WebElement zoomButton; @AndroidFindBy(xpath = "//android.view.View[contains(@content-desc, \"Threshold\")]/following-sibling::android.view.View") @@ -165,6 +165,7 @@ public void clickOnExceptionScanIcon() { } public void clickOnScanButton() { + scrollUntilElementVisible(scanButton); clickOnElement(scanButton); } @@ -287,8 +288,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/english/UpdateOperatorBiometricspageEnglish.java b/ui-test/src/main/java/regclient/pages/english/UpdateOperatorBiometricspageEnglish.java index 36450972b..2cc13607e 100644 --- a/ui-test/src/main/java/regclient/pages/english/UpdateOperatorBiometricspageEnglish.java +++ b/ui-test/src/main/java/regclient/pages/english/UpdateOperatorBiometricspageEnglish.java @@ -56,7 +56,7 @@ public UpdateOperatorBiometricspageEnglish(AppiumDriver driver) { @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"Exception Scan\"))") private WebElement exceptionScanTitle; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().description(\"Scan\"))") + @AndroidFindBy(accessibility = "Scan") private WebElement scanButton; @AndroidFindBy(xpath = "//*[contains(@content-desc, 'Iris Capture')]") @@ -122,7 +122,7 @@ public UpdateOperatorBiometricspageEnglish(AppiumDriver driver) { @AndroidFindBy(accessibility = "Marking exceptions on Face is not allowed") private WebElement markingExceptionsOnFaceIsNotAllowedText; - @AndroidFindBy(uiAutomator = "new UiSelector().className(\"android.view.View\").clickable(true)") + @AndroidFindBy(accessibility = "zoom_in_button") private WebElement zoomButton; @AndroidFindBy(xpath = "//android.view.View[contains(@content-desc, \"Threshold\")]/following-sibling::android.view.View") @@ -172,6 +172,7 @@ public void clickOnExceptionScanIcon() { } public void clickOnScanButton() { + scrollUntilElementVisible(scanButton); clickOnElement(scanButton); } 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 7e8af08d0..b660d5d56 100644 --- a/ui-test/src/main/java/regclient/pages/french/ApplicantBiometricsPageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/ApplicantBiometricsPageFrench.java @@ -60,7 +60,7 @@ public class ApplicantBiometricsPageFrench extends ApplicantBiometricsPage { @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"Exception ANALYSE\"))") private WebElement exceptionScanTitle; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().description(\"ANALYSE\"))") + @AndroidFindBy(accessibility = "ANALYSE") private WebElement scanButton; @AndroidFindBy(xpath = "//*[contains(@content-desc, 'Iris Capturer')]") @@ -81,7 +81,7 @@ public class ApplicantBiometricsPageFrench extends ApplicantBiometricsPage { @AndroidFindBy(xpath = "//*[contains(@content-desc, 'Exception Capturer')]") private WebElement exceptionCapturerHeader; - @AndroidFindBy(xpath = "//android.widget.ScrollView/android.view.View[3]") + @AndroidFindBy(accessibility = "zoom_in_button") private WebElement zoomButton; @AndroidFindBy(xpath = "//android.view.View[contains(@content-desc, \"Commentaires\")]/following-sibling::android.widget.EditText") @@ -99,6 +99,9 @@ public class ApplicantBiometricsPageFrench extends ApplicantBiometricsPage { @AndroidFindBy(xpath = "//android.view.View[@content-desc=\"Des exceptions\"]/following-sibling::android.view.View[@content-desc=\"1\"]") private WebElement exceptionCount; + @AndroidFindBy(accessibility = "menu_back_button") + private WebElement biometricsMenuButton; + public ApplicantBiometricsPageFrench(AppiumDriver driver) { super(driver); } @@ -111,6 +114,7 @@ public void enterCommentsInTextBox(String comments) { } public void clickOnScanButton() { + scrollUntilElementVisible(scanButton); clickOnElement(scanButton); } @@ -162,8 +166,7 @@ public BiometricDetailsPage clickOnNextButton() { } public void clickOnZoomButton() { - waitTime(1); - clickAtCoordinates(1035, 1077); + clickOnElement(zoomButton); } public void clickOnIrisScanTitle() { @@ -264,4 +267,9 @@ public boolean isExceptionCountDisplayed() { } return isElementDisplayed(exceptionCount); } + + public BiometricDetailsPage clickOnBiometricsMenuButton() { + clickOnElement(biometricsMenuButton); + return new BiometricDetailsPageFrench(driver); + } } 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 2e1883443..6add98057 100644 --- a/ui-test/src/main/java/regclient/pages/french/BiometricDetailsPageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/BiometricDetailsPageFrench.java @@ -14,6 +14,7 @@ import io.appium.java_client.AppiumDriver; import io.appium.java_client.MobileBy; import io.appium.java_client.pagefactory.AndroidFindBy; +import io.appium.java_client.remote.SupportsContextSwitching; import io.mosip.testrig.apirig.testrunner.OTPListener; import regclient.api.FetchUiSpec; import regclient.page.ApplicantBiometricsPage; @@ -30,22 +31,22 @@ public class BiometricDetailsPageFrench extends BiometricDetailsPage { - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Iris\"))") + @AndroidFindBy(accessibility = "Iris") private WebElement irisScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Main droite\"))") - private WebElement rightHandScanIcon; - - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Main gauche\"))") - private WebElement leftHandScanIcon; + @AndroidFindBy(accessibility = "Face") + private WebElement faceScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Pouces ANALYSE\"))") + @AndroidFindBy(accessibility = "Thumbs") private WebElement thumbsScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Visage ANALYSE\"))") - private WebElement faceScanIcon; + @AndroidFindBy(accessibility = "Left Hand") + private WebElement leftHandScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Exception\"))") + @AndroidFindBy(accessibility = "Right Hand") + private WebElement rightHandScanIcon; + + @AndroidFindBy(accessibility = "Exception") private WebElement exceptionScanIcon; @AndroidFindBy(xpath = "//android.view.View[contains(@content-desc,\"Introducteur Biométrie\")]/following-sibling::android.view.View/descendant::android.view.View/descendant::android.widget.ImageView[@content-desc=\"Iris ANALYSE\"]") @@ -82,74 +83,74 @@ public boolean isAuthenticationBiometricTitleDisplayed() { } public ApplicantBiometricsPage clickOnIrisScan() { + scrollUntilElementVisible(irisScanIcon); clickOnElement(irisScanIcon); return new ApplicantBiometricsPageFrench(driver); } public ApplicantBiometricsPage clickOnRightHandScanIcon() { + scrollUntilElementVisible(rightHandScanIcon); clickOnElement(rightHandScanIcon); return new ApplicantBiometricsPageFrench(driver); } public ApplicantBiometricsPage clickOnLeftHandScanIcon() { + scrollUntilElementVisible(leftHandScanIcon); clickOnElement(leftHandScanIcon); return new ApplicantBiometricsPageFrench(driver); } public ApplicantBiometricsPage clickOnThumbsScanIcon() { + scrollUntilElementVisible(thumbsScanIcon); clickOnElement(thumbsScanIcon); return new ApplicantBiometricsPageFrench(driver); } public ApplicantBiometricsPage clickOnFaceScanIcon() { + scrollUntilElementVisible(faceScanIcon); clickOnElement(faceScanIcon); return new ApplicantBiometricsPageFrench(driver); } public ApplicantBiometricsPage clickOnExceptionScanIcon() { + scrollUntilElementVisible(exceptionScanIcon); clickOnElement(exceptionScanIcon); return new ApplicantBiometricsPageFrench(driver); - } 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 ANALYSE\"]"))); + clickOnElement(findElementWithRetry(By.xpath( + "//android.view.View[contains(@content-desc,\"" + FetchUiSpec.getValueUsingId("introducerBiometrics") + + "\")]/following-sibling::android.view.View//android.view.View[@content-desc='Iris']"))); return new IntroducerBiometricPageFrench(driver); - } 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=\"Main droite ANALYSE\"]"))); + clickOnElement(findElementWithRetry(By.xpath( + "//android.view.View[contains(@content-desc,\"" + FetchUiSpec.getValueUsingId("introducerBiometrics") + + "\")]/following-sibling::android.view.View//android.view.View[@content-desc='Right Hand']"))); return new IntroducerBiometricPageFrench(driver); - } 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=\"Main gauche ANALYSE\"]"))); + + "\")]/following-sibling::android.view.View/descendant::android.view.View/descendant::android.widget.ImageView[@content-desc=\"Left Hand\"]"))); return new IntroducerBiometricPageFrench(driver); - } 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=\"Pouces ANALYSE\"]"))); + + "\")]/following-sibling::android.view.View/descendant::android.view.View/descendant::android.widget.ImageView[@content-desc=\"Thumbs\"]"))); return new IntroducerBiometricPageFrench(driver); - } 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=\"Visage ANALYSE\"]"))); + + "\")]/following-sibling::android.view.View/descendant::android.view.View/descendant::android.widget.ImageView[@content-desc=\"Face\"]"))); return new IntroducerBiometricPageFrench(driver); - } public PreviewPage clickOnContinueButton() { @@ -163,13 +164,7 @@ public boolean isAdditionalInfoRequestIdTextboxDisplayed() { public RegistrationTasksPage clickOnStayLoggedInButton() { clickOnElement(stayLoggedInButton); - return new RegistrationTasksPageArabic(driver); - } - - private void typeAndVerify(WebElement el, String value) { - el.click(); - el.clear(); - el.sendKeys(value); + return new RegistrationTasksPageFrench(driver); } public boolean isAutoLogoutPopupDisplayed() { @@ -183,72 +178,71 @@ public boolean isAutoLogoutPopupDisplayed() { } public void enterAdditionalInfoUsingEmail(String 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(); + System.out.println(emailId); + String additionalInfoReqId = OTPListener.getAdditionalReqId(emailId); + if (additionalInfoReqId == null || additionalInfoReqId.trim().isEmpty()) { + throw new IllegalStateException("Additional Info Request ID is missing for email: " + emailId); + } + additionalInfoReqId = additionalInfoReqId + "-BIOMETRIC_CORRECTION-1"; + + + try { + if (typeAndVerify(additionalInfoRequestIdTextbox, additionalInfoReqId)) { + logger.info("typeAndVerify succeeded."); + return; // SUCCESS → exit method + } else { + throw new AssertionError("Textbox did not accept the id: " + additionalInfoReqId); + } + } catch (Exception e) { + throw new AssertionError("Failed while typing/verifying finalId: " + additionalInfoReqId, e); } - while (System.currentTimeMillis() - startMs < timeoutMs) { + } - String id = null; + private boolean typeAndVerify(WebElement el, String value) { + el.click(); + el.clear(); + el.sendKeys(value); - try { - id = OTPListener.getAdditionalReqId(emailId.trim().toLowerCase()); - logger.info("Polled raw id = [" + id + "]"); - } catch (Exception e) { - logger.info("Error fetching id: " + e.getMessage()); - } + // read the visible/real value in a safe way + String curr = readElementValue(el); - 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) { - throw new AssertionError("Failed while typing finalId: " + finalId + " : " + e.getMessage(), e); - } - } - } + // exact match (keeps your previous behavior) + return value.equals(curr); + } + private String readElementValue(WebElement el) { + try { + String ctx = ""; 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(); + ctx = ((SupportsContextSwitching) driver).getContext(); } catch (Exception ignored) { - } - long elapsed = System.currentTimeMillis() - startMs; - long remainingMs = Math.max(0, timeoutMs - elapsed); + if (ctx != null && ctx.toUpperCase().contains("WEBVIEW")) { + String v = el.getAttribute("value"); + return v == null ? "" : v; + } + } catch (Exception ignored) { + } - logger.info("ID not found. Elapsed " + (elapsed / 1000) + "s, remaining " + (remainingMs / 1000) - + "s. Sleeping " + pollIntervalSeconds + "s."); + 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 { - Thread.sleep(TimeUnit.SECONDS.toMillis(pollIntervalSeconds)); - } catch (InterruptedException ie) { - Thread.currentThread().interrupt(); - throw new AssertionError("Interrupted while waiting for AdditionalInfoReqId", ie); + String v = el.getAttribute(attr); + if (v != null && !v.isEmpty()) + return v; + } catch (Exception ignored) { } } - throw new AssertionError( - "AdditionalInfoReqId not found within " + totalTimeoutMinutes + " minutes for " + emailId); + return ""; } private static final Logger logger = LoggerFactory.getLogger(BiometricDetailsPageFrench.class); 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 fb6c798a3..2edad4a0e 100644 --- a/ui-test/src/main/java/regclient/pages/french/DemographicDetailsPageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/DemographicDetailsPageFrench.java @@ -101,15 +101,17 @@ public boolean isPreRegFetchDataTextBoxDisplay() { } public void fillDemographicDetailsPage(String age) { + scrollToTop(); List idList = FetchUiSpec.getAllIds("DemographicDetails"); for (String id : idList) { if (FetchUiSpec.getRequiredTypeUsingId(id)) { if (FetchUiSpec.getControlTypeUsingId(id).equals("textbox")) { - waitTime(3); + waitTime(1); 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]")), @@ -119,33 +121,35 @@ public void fillDemographicDetailsPage(String age) { "Verify if " + id + " is enter in second language text box"); } else if (FetchUiSpec.getControlTypeUsingId(id).equals("dropdown") && FetchUiSpec.getFormatUsingId(id).equals("none")) { - waitTime(3); + waitTime(1); while (!isElementDisplayed(MobileBy.AndroidUIAutomator( "new UiSelector().descriptionContains(\"" + FetchUiSpec.getValueUsingId(id) + "\")"))) { swipeOrScroll(); } + boolean isdisplayed = isElementDisplayed(MobileBy.AndroidUIAutomator( "new UiSelector().descriptionContains(\"" + FetchUiSpec.getValueUsingId(id) + "\")")); assertTrue(isdisplayed, "Verify if " + id + " header is displayed"); WebElement dropdownElement = findElement( - By.xpath("//android.view.View[contains(@content-desc, \"" + FetchUiSpec.getValueUsingId(id) - + "\")]/parent::android.view.View/parent::android.widget.Button")); + By.xpath("//android.widget.Button[.//android.view.View[contains(@content-desc,'" + + FetchUiSpec.getValueUsingId(id) + "')]]")); + clickOnElement(dropdownElement); - waitTime(3); + waitTime(1); if (!isElementDisplayed(dropdownElement)) { clickOnElement(findElement(By.className("android.view.View"))); } else if (isElementDisplayed(dropdownElement)) { swipeOrScroll(); clickOnElement(dropdownElement); - waitTime(2); + waitTime(1); clickOnElement(findElement(By.className("android.view.View"))); } - waitTime(2); + waitTime(1); if (isElementDisplayed(By.xpath("//android.view.View[contains(@content-desc, \"" + FetchUiSpec.getValueUsingId(id) - + "\")]/parent::android.view.View/parent::android.widget.Button[contains(@content-desc, \"Select Option\")]"))) { + + "\")]/parent::android.view.View/parent::android.widget.Button[contains(@content-desc,\"Sélectionner une option\")]"))) { clickOnElement(dropdownElement); - waitTime(2); + waitTime(1); clickOnElement(findElement(By.className("android.view.View"))); } } else if (FetchUiSpec.getControlTypeUsingId(id).equals("dropdown") @@ -157,7 +161,7 @@ public void fillDemographicDetailsPage(String age) { clickOnElement(maleButton); } else if (FetchUiSpec.getControlTypeUsingId(id).equals("ageDate")) { - waitTime(3); + waitTime(1); boolean isdisplayed = isElementDisplayed(findElementWithRetry(MobileBy.AndroidUIAutomator( "new UiSelector().descriptionContains(\"" + FetchUiSpec.getValueUsingId(id) + "\")"))); assertTrue(isdisplayed, "Verify if " + id + " header is displayed"); @@ -194,7 +198,7 @@ else if (age.equals("currentCalenderDate")) { } else if (id.equals("residenceStatus")) { if (FetchUiSpec.getControlTypeUsingId(id).equals("dropdown") && FetchUiSpec.getFormatUsingId(id).equals("none")) { - waitTime(2); + waitTime(1); boolean isdisplayed = isElementDisplayed(findElementWithRetry(MobileBy.AndroidUIAutomator( "new UiSelector().descriptionContains(\"" + FetchUiSpec.getValueUsingId(id) + "\")"))); assertTrue(isdisplayed, "Verify if " + id + " header is displayed"); @@ -202,22 +206,22 @@ else if (age.equals("currentCalenderDate")) { By.xpath("//android.view.View[contains(@content-desc, \"" + FetchUiSpec.getValueUsingId(id) + "\")]/parent::android.view.View/parent::android.widget.Button")); clickOnElement(dropdownElement); - waitTime(2); + waitTime(1); if (!isElementDisplayed(dropdownElement)) { // clickOnElement(findElement(By.className("android.view.View"))); clickOnElement(nonForeignerOption); } else if (isElementDisplayed(dropdownElement)) { swipeOrScroll(); clickOnElement(dropdownElement); - waitTime(2); + waitTime(1); clickOnElement(findElement(By.className("android.view.View"))); } - waitTime(2); + waitTime(1); if (isElementDisplayed(By.xpath("//android.view.View[contains(@content-desc, \"" + FetchUiSpec.getValueUsingId(id) - + "\")]/parent::android.view.View/parent::android.widget.Button[contains(@content-desc, \"Select Option\")]"))) { + + "\")]/parent::android.view.View/parent::android.widget.Button[contains(@content-desc, \"Sélectionner une option\")]"))) { clickOnElement(dropdownElement); - waitTime(2); + waitTime(1); clickOnElement(findElement(By.className("android.view.View"))); } } @@ -225,7 +229,7 @@ else if (age.equals("currentCalenderDate")) { if (id.equals("introducerName") && FetchUiSpec.getFlowType().equals("newProcess")) { if (age.equals("minor") || age.equals("infant") || age.equals("currentCalenderDate")) { if (FetchUiSpec.getControlTypeUsingId(id).equals("textbox")) { - waitTime(3); + waitTime(1); boolean isdisplayed = isElementDisplayed(findElementWithRetry(MobileBy.AndroidUIAutomator( "new UiSelector().descriptionContains(\"" + FetchUiSpec.getValueUsingId(id) + "\")"))); assertTrue(isdisplayed, "Verify if " + id + " header is displayed"); @@ -243,7 +247,7 @@ else if (age.equals("currentCalenderDate")) { if (id.equals("introducerRID") && FetchUiSpec.getFlowType().equals("newProcess")) { if (age.equals("minor") || age.equals("infant") || age.equals("currentCalenderDate")) { if (FetchUiSpec.getControlTypeUsingId(id).equals("textbox")) { - waitTime(3); + waitTime(1); boolean isdisplayed = isElementDisplayed(findElementWithRetry(MobileBy.AndroidUIAutomator( "new UiSelector().descriptionContains(\"" + FetchUiSpec.getValueUsingId(id) + "\")"))); assertTrue(isdisplayed, "Verify if " + id + " header is displayed"); @@ -679,7 +683,7 @@ public void fillRemainDemographicDetailsPage(String age) { waitTime(2); if (isElementDisplayed(By.xpath("//android.view.View[contains(@content-desc, \"" + FetchUiSpec.getValueUsingId(id) - + "\")]/parent::android.view.View/parent::android.widget.Button[contains(@content-desc, \"Select Option\")]"))) { + + "\")]/parent::android.view.View/parent::android.widget.Button[contains(@content-desc, \"Sélectionner une option\")]"))) { clickOnElement(dropdownElement); waitTime(2); clickOnElement(findElement(By.className("android.view.View"))); @@ -687,7 +691,7 @@ public void fillRemainDemographicDetailsPage(String age) { } } else if (FetchUiSpec.getRequiredTypeUsingId(id) && id.equals("Postal")) { By postalDropdown = By.xpath("//android.view.View[contains(@content-desc, 'Postal')]" - + "/parent::android.view.View/parent::android.widget.Button[contains(@content-desc, 'Select Option')]"); + + "/parent::android.view.View/parent::android.widget.Button[contains(@content-desc, \"Sélectionner une option\")]"); int attempts = 0; while (attempts < 3) { 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 30316b2bd..81db26a5a 100644 --- a/ui-test/src/main/java/regclient/pages/french/DocumentUploadPageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/DocumentUploadPageFrench.java @@ -48,7 +48,9 @@ public DocumentUploadPageFrench(AppiumDriver driver) { } public BiometricDetailsPage clickOnContinueButton() { + waitTime(1); clickOnElement(continueButton); + waitTime(1); return new BiometricDetailsPageFrench(driver); } @@ -108,6 +110,7 @@ public void uploadDoccuments(String age, String type) { cameraPage.clickOkButton(); waitTime(1); applyOrientation(); + waitTime(1); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); @@ -142,6 +145,7 @@ public void uploadDoccuments(String age, String type) { cameraPage.clickOkButton(); waitTime(1); applyOrientation(); + waitTime(1); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); @@ -180,6 +184,7 @@ public void uploadDoccuments(String age, String type) { cameraPage.clickOkButton(); waitTime(1); applyOrientation(); + waitTime(1); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); @@ -221,6 +226,7 @@ public void uploadDoccumentsUpdate(String age, String type) { cameraPage.clickOkButton(); waitTime(1); applyOrientation(); + waitTime(1); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); @@ -251,6 +257,7 @@ public void uploadDoccumentsUpdate(String age, String type) { cameraPage.clickOkButton(); waitTime(1); applyOrientation(); + waitTime(1); assertTrue(isRetakeButtonDisplayed(), "Verify if retake button displayed"); cropCaptureImage(); clickOnSaveButton(); diff --git a/ui-test/src/main/java/regclient/pages/french/IntroducerBiometricPageFrench.java b/ui-test/src/main/java/regclient/pages/french/IntroducerBiometricPageFrench.java index 1f95e27b6..7b75580d4 100644 --- a/ui-test/src/main/java/regclient/pages/french/IntroducerBiometricPageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/IntroducerBiometricPageFrench.java @@ -51,7 +51,7 @@ public class IntroducerBiometricPageFrench extends IntroducerBiometricPage { @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"Exception ANALYSE\"))") private WebElement exceptionScanTitle; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().description(\"ANALYSE\"))") + @AndroidFindBy(accessibility = "ANALYSE") private WebElement scanButton; @AndroidFindBy(xpath = "//*[contains(@content-desc, 'Iris Capturer')]") @@ -72,7 +72,7 @@ public class IntroducerBiometricPageFrench extends IntroducerBiometricPage { @AndroidFindBy(xpath = "//*[contains(@content-desc, 'Exception Capturer')]") private WebElement exceptionCapturerHeader; - @AndroidFindBy(xpath = "//android.widget.ScrollView/android.view.View[3]") + @AndroidFindBy(accessibility = "zoom_in_button") private WebElement zoomButton; @AndroidFindBy(className = "android.widget.Button") @@ -86,6 +86,7 @@ public IntroducerBiometricPageFrench(AppiumDriver driver) { } public void clickOnScanButton() { + scrollUntilElementVisible(scanButton); clickOnElement(scanButton); } diff --git a/ui-test/src/main/java/regclient/pages/french/ManageApplicationsPageFrench.java b/ui-test/src/main/java/regclient/pages/french/ManageApplicationsPageFrench.java index 896055201..cfa1368e0 100644 --- a/ui-test/src/main/java/regclient/pages/french/ManageApplicationsPageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/ManageApplicationsPageFrench.java @@ -84,7 +84,7 @@ public class ManageApplicationsPageFrench extends ManageApplicationsPage { @AndroidFindBy(uiAutomator = "UiSelector().className(\"android.widget.CheckBox\").instance(1)") private WebElement latestAidCheckBox; - @AndroidFindBy(uiAutomator = "new UiSelector().className(\"android.widget.Button\").instance(0)") + @AndroidFindBy(accessibility = "manage_application_back_button") private WebElement backButton; public ManageApplicationsPageFrench(AppiumDriver driver) { @@ -265,5 +265,11 @@ public boolean isNoNetworkFoundDisplayed() { public void selectLatestAidCheckBox() { clickOnElement(latestAidCheckBox); } + + public void clickCheckboxByAID(String aid) { + By checkbox = By + .xpath("//android.view.View[contains(@content-desc,'" + aid + "')]" + "//android.widget.CheckBox"); + click(checkbox); + } } 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 42bf16bb3..958cd4cce 100644 --- a/ui-test/src/main/java/regclient/pages/french/OperationalTaskPageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/OperationalTaskPageFrench.java @@ -24,6 +24,12 @@ public class OperationalTaskPageFrench extends OperationalTaskPage { @AndroidFindBy(uiAutomator = "new UiSelector().descriptionContains(\"En attente de validation\")") private WebElement pendingApprovalTitle; + @AndroidFindBy(accessibility = "Synchro. Complété avec succès") + private WebElement syncCompletedPopup; + + @AndroidFindBy(accessibility = "Redémarrer") + private WebElement restartButton; + public OperationalTaskPageFrench(AppiumDriver driver) { super(driver); } @@ -73,4 +79,15 @@ public boolean isPendingApprovalTitleDisplayed() { return isElementDisplayed(pendingApprovalTitle); } + public void handleIfSyncPopUpDisplayed() { + for (int i = 0; i < 120; i++) { + if (isElementDisplayed(syncCompletedPopup)) { + clickOnElement(restartButton); + return; + } + waitTime(5); + } + throw new RuntimeException("Sync popup not displayed"); + } + } diff --git a/ui-test/src/main/java/regclient/pages/french/PendingApprovalFrench.java b/ui-test/src/main/java/regclient/pages/french/PendingApprovalFrench.java index ab0ce1331..6717977da 100644 --- a/ui-test/src/main/java/regclient/pages/french/PendingApprovalFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/PendingApprovalFrench.java @@ -42,7 +42,7 @@ public class PendingApprovalFrench extends PendingApproval { @AndroidFindBy(uiAutomator = "UiSelector().className(\"android.widget.EditText\").instance(1)") private WebElement passwordTextBox; - @AndroidFindBy(xpath = "//*[contains(@content-desc,\"En attente de validation\")]//preceding-sibling::android.widget.Button") + @AndroidFindBy(accessibility = "pending_approval_back_button") private WebElement backButton; @AndroidFindBy(accessibility = "REJETER") @@ -103,7 +103,8 @@ public boolean isPendingApprovalTitleDisplayed() { @SuppressWarnings("deprecation") public void clickOnAID(String AID) { - clickOnElement(findElementWithRetry(MobileBy.AccessibilityId(AID))); + By RID = MobileBy.AndroidUIAutomator("new UiSelector().descriptionContains(\"" + AID + "\")"); + click(RID); } public void clickOnApproveButton() { 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 b51b5b649..a62f0313e 100644 --- a/ui-test/src/main/java/regclient/pages/french/PreviewPageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/PreviewPageFrench.java @@ -1,5 +1,6 @@ package regclient.pages.french; +import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.testng.Assert; @@ -61,8 +62,10 @@ public AuthenticationPage clickOnContinueButton() { public boolean isDemographicInformationInPreviewPageDisplayed() { try { - scrollToText("Informations démographiques"); - return isElementDisplayed(demographicInformationInPreviewPage); + By locator = MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector().scrollable(true))" + + ".scrollIntoView(new UiSelector().textContains(\"Informations démographiques\"))"); + driver.findElement(locator); + return true; } catch (Exception e) { return false; } @@ -77,7 +80,7 @@ public boolean isDocumentsInformationInPreviewPageDisplayed() { } } - public boolean isBiometricsInformationInPreviewPagePageDisplayed() { + public boolean isBiometricsInformationInPreviewPageDisplayed() { try { scrollToText("Biométrie"); return isElementDisplayed(biometricsInformationInPreviewPage); @@ -99,13 +102,20 @@ public boolean updateUINTitleDisplayed() { + FetchUiSpec.getTitleUsingId("UPDATE") + "\"))"))); } - public boolean isApplicationIDPreviewPagePageDisplayed() { - try { - scrollToText("Application ID"); - return isElementDisplayed(applicationIDPreviewPage); - } catch (Exception e) { - return false; + public boolean isApplicationIDPreviewPageDisplayed() { + By applicationIdLocator = By.xpath("//android.view.View[contains(@text,'Application ID')]"); + for (int i = 0; i < 5; i++) { + try { + waitTime(1); + tapScreenCenter(); + waitTime(1); + if (driver.findElement(applicationIdLocator).isDisplayed()) { + return true; + } + } catch (Exception e) { + } } + return false; } @SuppressWarnings("deprecation") 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 a782687e1..02acf0060 100644 --- a/ui-test/src/main/java/regclient/pages/french/RegistrationTasksPageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/RegistrationTasksPageFrench.java @@ -67,6 +67,12 @@ public RegistrationTasksPageFrench(AppiumDriver driver) { @AndroidFindBy(id = "com.android.permissioncontroller:id/permission_deny_button") private WebElement dontAllowButton; + + @AndroidFindBy(accessibility = "Synchro. Complété avec succès") + private WebElement syncCompletedPopup; + + @AndroidFindBy(accessibility = "Redémarrer") + private WebElement restartButton; public SelectLanguagePage clickOnNewRegistrationButton() { clickOnElement(newRegistrationButton); @@ -175,4 +181,15 @@ public void clickOnRegistrationTasksTab() { public boolean isSettingsButtonDisplayed() { return isElementDisplayed(settingsButton); } + + public void handleIfSyncPopUpDisplayed() { + for (int i = 0; i < 120; i++) { + if (isElementDisplayed(syncCompletedPopup)) { + clickOnElement(restartButton); + return; + } + waitTime(5); + } + throw new RuntimeException("Sync popup not displayed"); + } } 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 377dbda69..1f47c399b 100644 --- a/ui-test/src/main/java/regclient/pages/french/SettingsPageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/SettingsPageFrench.java @@ -47,13 +47,13 @@ public class SettingsPageFrench extends SettingsPage { @AndroidFindBy(accessibility = "ANALYSE") private WebElement scanNowButton; - @AndroidFindBy(accessibility = "ID: e88198714e67562c\nName: io.mosip.mock.sbi.face\nStatus: Ready") + @AndroidFindBy(uiAutomator = "new UiSelector().descriptionContains(\"mock.sbi.face\")") private WebElement faceDeviceCard; - @AndroidFindBy(accessibility = "ID: e88198714e67562c\nName: io.mosip.mock.sbi.iris\nStatus: Ready") + @AndroidFindBy(uiAutomator = "new UiSelector().descriptionContains(\"mock.sbi.iris\")") private WebElement irisDeviceCard; - @AndroidFindBy(accessibility = "ID: e88198714e67562c\nName: io.mosip.mock.sbi.finger\nStatus: Ready") + @AndroidFindBy(uiAutomator = "new UiSelector().descriptionContains(\"mock.sbi.finger\")") private WebElement fingerDeviceCard; @AndroidFindBy(accessibility = "No devices found") @@ -67,8 +67,8 @@ public class SettingsPageFrench extends SettingsPage { @AndroidFindBy(accessibility = "CANCEL") private WebElement changesCancelButton; - - @AndroidFindBy(accessibility = "Paramètres des tâches planifiées") + + @AndroidFindBy(accessibility = "Paramètres des travaux planifiés") private WebElement scheduledJobSettingsPageHeader; @AndroidFindBy(xpath = "//*[@content-desc[contains(.,'Master Data Sync')]]") @@ -172,20 +172,16 @@ public void clickOnScheduledJobsSettingsTab() { } public void validateDeviceCard(String deviceName) { - // Wait a bit for the card to appear (helps if page loads slowly) WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); - WebElement card = wait.until(ExpectedConditions - .presenceOfElementLocated(By.xpath("//*[contains(@content-desc,'" + deviceName + "')]"))); - + WebElement card = wait.until(ExpectedConditions.presenceOfElementLocated( + MobileBy.AndroidUIAutomator("new UiSelector().descriptionContains(\"" + deviceName + "\")"))); String desc = card.getAttribute("content-desc"); System.out.println("Card text: " + desc); - - Pattern p = Pattern.compile("ID:\\s*([a-zA-Z0-9]+)"); + assertTrue(desc.contains(deviceName), "Device name not found"); + assertTrue(desc.toLowerCase().contains("ready"), "Device status not Ready"); + Pattern p = Pattern.compile("\\b[a-f0-9]{10,}\\b"); Matcher m = p.matcher(desc); - assertTrue(m.find(), "ID not found or empty"); - - assertTrue(desc.contains("Name: " + deviceName), "Device name mismatch"); - assertTrue(desc.contains("Status: Ready"), "Device status not Ready"); + assertTrue(m.find(), "Device ID not found or empty"); } public boolean isSubmitChangesPopupDisplayed() { @@ -236,17 +232,23 @@ public boolean validateJobCardFields(String jobName) { public boolean isJobDisplayed(String jobName) { - // Scroll to jobs list (safe for long lists) - driver.findElement(MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector().scrollable(true))" - + ".scrollIntoView(new UiSelector().className(\"android.widget.EditText\"))")); + try { + By locator = MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector().scrollable(true))" + + ".scrollIntoView(new UiSelector().descriptionContains(\"" + jobName + "\"))"); - By job = By.xpath("//android.widget.EditText[contains(@hint,'" + jobName + "')]"); + WebElement element = driver.findElement(locator); + return element.isDisplayed(); - return isElementDisplayed(job); + } catch (Exception e) { + return false; + } } - + public void clickOnSyncButton(String jobName) { - By syncButton = By.xpath("//android.widget.EditText[contains(@hint,'" + jobName + "')]"); - click(syncButton); + By job = MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector().scrollable(true))" + + ".scrollIntoView(new UiSelector().descriptionContains(\"" + jobName + "\"))"); + WebElement jobElement = driver.findElement(job); + WebElement syncBtn = jobElement.findElement(By.xpath(".//android.widget.Button[1]")); + syncBtn.click(); } } 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 b800975d6..dd6c6e27a 100644 --- a/ui-test/src/main/java/regclient/pages/french/SupervisorBiometricVerificationpageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/SupervisorBiometricVerificationpageFrench.java @@ -11,22 +11,22 @@ public class SupervisorBiometricVerificationpageFrench extends SupervisorBiometr @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 ANALYSE\"))") + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Iris\"))") private WebElement irisScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Main droite\"))") + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"Right\"))") private WebElement rightHandScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Main gauche\"))") + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().className(\"android.widget.ScrollView\")).scrollIntoView(new UiSelector().className(\"android.widget.ImageView\").description(\"Left Hand Scan\"))") private WebElement leftHandScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Pouces ANALYSE\"))") + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"Thumbs\"))") private WebElement thumbsScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Visage ANALYSE\"))") + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().className(\"android.widget.ScrollView\")).scrollIntoView(new UiSelector().className(\"android.widget.ImageView\").description(\"Face Scan\"))") private WebElement faceScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Exception\"))") + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"Exception Scan\"))") private WebElement exceptionScanIcon; @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"Iris ANALYSE\"))") @@ -47,7 +47,7 @@ public class SupervisorBiometricVerificationpageFrench extends SupervisorBiometr @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"Exception ANALYSE\"))") private WebElement exceptionScanTitle; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().description(\"ANALYSE\"))") + @AndroidFindBy(accessibility = "ANALYSE") private WebElement scanButton; @AndroidFindBy(xpath = "//*[contains(@content-desc, 'Iris Capturer')]") @@ -89,7 +89,7 @@ public class SupervisorBiometricVerificationpageFrench extends SupervisorBiometr @AndroidFindBy(accessibility = "Marquage des exceptions sur Visage n'est pas autorisé") private WebElement markingExceptionsOnFaceIsNotAllowedText; - @AndroidFindBy(uiAutomator = "new UiSelector().className(\"android.view.View\").clickable(true)") + @AndroidFindBy(accessibility = "zoom_in_button") private WebElement zoomButton; @AndroidFindBy(accessibility = "Permanent") @@ -164,6 +164,7 @@ public void clickOnExceptionScanIcon() { } public void clickOnScanButton() { + scrollUntilElementVisible(scanButton); clickOnElement(scanButton); } 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 c5c0ab81b..d4b65a7ee 100644 --- a/ui-test/src/main/java/regclient/pages/french/UpdateOperatorBiometricspageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/UpdateOperatorBiometricspageFrench.java @@ -23,19 +23,19 @@ public UpdateOperatorBiometricspageFrench(AppiumDriver driver) { @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Iris\"))") private WebElement irisScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Main droite\"))") + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"Right\"))") private WebElement rightHandScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Main gauche\"))") + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().className(\"android.widget.ScrollView\")).scrollIntoView(new UiSelector().className(\"android.widget.ImageView\").description(\"Left Hand Scan\"))") private WebElement leftHandScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Pouces ANALYSE\"))") + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"Thumbs\"))") private WebElement thumbsScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Visage ANALYSE\"))") + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().className(\"android.widget.ScrollView\")).scrollIntoView(new UiSelector().className(\"android.widget.ImageView\").description(\"Face Scan\"))") private WebElement faceScanIcon; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)) .scrollIntoView(new UiSelector().descriptionContains(\"Exception\"))") + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"Exception Scan\"))") private WebElement exceptionScanIcon; @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"Iris ANALYSE\"))") @@ -56,7 +56,7 @@ public UpdateOperatorBiometricspageFrench(AppiumDriver driver) { @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"Exception ANALYSE\"))") private WebElement exceptionScanTitle; - @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().description(\"ANALYSE\"))") + @AndroidFindBy(accessibility = "ANALYSE") private WebElement scanButton; @AndroidFindBy(xpath = "//*[contains(@content-desc, 'Iris Capturer')]") @@ -172,6 +172,7 @@ public void clickOnExceptionScanIcon() { } public void clickOnScanButton() { + scrollUntilElementVisible(scanButton); clickOnElement(scanButton); } diff --git a/ui-test/src/main/java/regclient/pages/hindi/ApplicantBiometricsPageHindi.java b/ui-test/src/main/java/regclient/pages/hindi/ApplicantBiometricsPageHindi.java index fcfac9125..51ee1ba88 100644 --- a/ui-test/src/main/java/regclient/pages/hindi/ApplicantBiometricsPageHindi.java +++ b/ui-test/src/main/java/regclient/pages/hindi/ApplicantBiometricsPageHindi.java @@ -99,6 +99,9 @@ public class ApplicantBiometricsPageHindi extends ApplicantBiometricsPage { @AndroidFindBy(xpath = "//android.view.View[@content-desc=\"अस्तित्वाएं\"]/following-sibling::android.view.View[@content-desc=\"1\"]") private WebElement exceptionCount; + @AndroidFindBy(accessibility = "menu_back_button") + private WebElement biometricsMenuButton; + public ApplicantBiometricsPageHindi(AppiumDriver driver) { super(driver); } @@ -263,4 +266,9 @@ public boolean isExceptionCountDisplayed() { } return isElementDisplayed(exceptionCount); } + + public BiometricDetailsPage clickOnBiometricsMenuButton() { + clickOnElement(biometricsMenuButton); + return new BiometricDetailsPageEnglish(driver); + } } diff --git a/ui-test/src/main/java/regclient/pages/hindi/ManageApplicationsPageHindi.java b/ui-test/src/main/java/regclient/pages/hindi/ManageApplicationsPageHindi.java index 02c0b6485..80c42a7dd 100644 --- a/ui-test/src/main/java/regclient/pages/hindi/ManageApplicationsPageHindi.java +++ b/ui-test/src/main/java/regclient/pages/hindi/ManageApplicationsPageHindi.java @@ -262,5 +262,11 @@ public boolean isNoNetworkFoundDisplayed() { public void selectLatestAidCheckBox() { clickOnElement(latestAidCheckBox); } + + public void clickCheckboxByAID(String aid) { + By checkbox = By + .xpath("//android.view.View[contains(@content-desc,'" + aid + "')]" + "//android.widget.CheckBox"); + click(checkbox); + } } diff --git a/ui-test/src/main/java/regclient/pages/hindi/OperationalTaskPageHindi.java b/ui-test/src/main/java/regclient/pages/hindi/OperationalTaskPageHindi.java index 605fcad30..30681f866 100644 --- a/ui-test/src/main/java/regclient/pages/hindi/OperationalTaskPageHindi.java +++ b/ui-test/src/main/java/regclient/pages/hindi/OperationalTaskPageHindi.java @@ -23,6 +23,12 @@ public class OperationalTaskPageHindi extends OperationalTaskPage{ @AndroidFindBy(accessibility = "लंबित अनुमोदन") private WebElement pendingApprovalTitle; + + @AndroidFindBy(accessibility = "Sync Completed Successfully") + private WebElement syncCompletedPopup; + + @AndroidFindBy(accessibility = "Restart") + private WebElement restartButton; public OperationalTaskPageHindi(AppiumDriver driver) { super(driver); @@ -71,4 +77,15 @@ public boolean isPendingApprovalTitleDisplayed() { } return isElementDisplayed(pendingApprovalTitle); } + + public void handleIfSyncPopUpDisplayed() { + for (int i = 0; i < 120; i++) { + if (isElementDisplayed(syncCompletedPopup)) { + clickOnElement(restartButton); + return; + } + waitTime(5); + } + throw new RuntimeException("Sync popup not displayed"); + } } diff --git a/ui-test/src/main/java/regclient/pages/hindi/PreviewPageHindi.java b/ui-test/src/main/java/regclient/pages/hindi/PreviewPageHindi.java index 3e9cb8262..71ca9f7b1 100644 --- a/ui-test/src/main/java/regclient/pages/hindi/PreviewPageHindi.java +++ b/ui-test/src/main/java/regclient/pages/hindi/PreviewPageHindi.java @@ -66,7 +66,7 @@ public boolean isDocumentsInformationInPreviewPageDisplayed() { return isElementDisplayed(documentsInformationInPreviewPage); } - public boolean isBiometricsInformationInPreviewPagePageDisplayed() { + public boolean isBiometricsInformationInPreviewPageDisplayed() { return isElementDisplayed(biometricsInformationInPreviewPage); } @@ -83,7 +83,7 @@ public boolean updateUINTitleDisplayed() { + FetchUiSpec.getTitleUsingId("UPDATE") + "\"))"))); } - public boolean isApplicationIDPreviewPagePageDisplayed() { + public boolean isApplicationIDPreviewPageDisplayed() { return isElementDisplayed(applicationIDPreviewPage); } diff --git a/ui-test/src/main/java/regclient/pages/hindi/RegistrationTasksPageHindi.java b/ui-test/src/main/java/regclient/pages/hindi/RegistrationTasksPageHindi.java index 16dabc684..bc3058f5c 100644 --- a/ui-test/src/main/java/regclient/pages/hindi/RegistrationTasksPageHindi.java +++ b/ui-test/src/main/java/regclient/pages/hindi/RegistrationTasksPageHindi.java @@ -63,6 +63,12 @@ public class RegistrationTasksPageHindi extends RegistrationTasksPage { @AndroidFindBy(id = "com.android.permissioncontroller:id/permission_deny_button") private WebElement dontAllowButton; + + @AndroidFindBy(accessibility = "Sync Completed Successfully") + private WebElement syncCompletedPopup; + + @AndroidFindBy(accessibility = "Restart") + private WebElement restartButton; public RegistrationTasksPageHindi(AppiumDriver driver) { super(driver); @@ -175,5 +181,16 @@ public void clickOnRegistrationTasksTab() { public boolean isSettingsButtonDisplayed() { return isElementDisplayed(settingsButton); } + + public void handleIfSyncPopUpDisplayed() { + for (int i = 0; i < 120; i++) { + if (isElementDisplayed(syncCompletedPopup)) { + clickOnElement(restartButton); + return; + } + waitTime(5); + } + throw new RuntimeException("Sync popup not displayed"); + } } diff --git a/ui-test/src/main/java/regclient/pages/kannada/ApplicantBiometricsPageKannada.java b/ui-test/src/main/java/regclient/pages/kannada/ApplicantBiometricsPageKannada.java index be7bed4cb..ff5a561ae 100644 --- a/ui-test/src/main/java/regclient/pages/kannada/ApplicantBiometricsPageKannada.java +++ b/ui-test/src/main/java/regclient/pages/kannada/ApplicantBiometricsPageKannada.java @@ -99,6 +99,9 @@ public class ApplicantBiometricsPageKannada extends ApplicantBiometricsPage { @AndroidFindBy(xpath = "//android.view.View[@content-desc=\"ಅಂಶಗಳು\"]/following-sibling::android.view.View[@content-desc=\"1\"]") private WebElement exceptionCount; + @AndroidFindBy(accessibility = "menu_back_button") + private WebElement biometricsMenuButton; + public ApplicantBiometricsPageKannada(AppiumDriver driver) { super(driver); } @@ -259,4 +262,9 @@ public boolean isExceptionCountDisplayed() { } return isElementDisplayed(exceptionCount); } + + public BiometricDetailsPage clickOnBiometricsMenuButton() { + clickOnElement(biometricsMenuButton); + return new BiometricDetailsPageEnglish(driver); + } } diff --git a/ui-test/src/main/java/regclient/pages/kannada/ManageApplicationsPageKannada.java b/ui-test/src/main/java/regclient/pages/kannada/ManageApplicationsPageKannada.java index d3bcf968a..d7aa67414 100644 --- a/ui-test/src/main/java/regclient/pages/kannada/ManageApplicationsPageKannada.java +++ b/ui-test/src/main/java/regclient/pages/kannada/ManageApplicationsPageKannada.java @@ -262,5 +262,11 @@ public boolean isNoNetworkFoundDisplayed() { public void selectLatestAidCheckBox() { clickOnElement(latestAidCheckBox); } + + public void clickCheckboxByAID(String aid) { + By checkbox = By + .xpath("//android.view.View[contains(@content-desc,'" + aid + "')]" + "//android.widget.CheckBox"); + click(checkbox); + } } diff --git a/ui-test/src/main/java/regclient/pages/kannada/OperationalTaskPageKannada.java b/ui-test/src/main/java/regclient/pages/kannada/OperationalTaskPageKannada.java index ce889376b..e3f237530 100644 --- a/ui-test/src/main/java/regclient/pages/kannada/OperationalTaskPageKannada.java +++ b/ui-test/src/main/java/regclient/pages/kannada/OperationalTaskPageKannada.java @@ -23,6 +23,12 @@ public class OperationalTaskPageKannada extends OperationalTaskPage{ @AndroidFindBy(accessibility = "ಒಪ್ಪಿಗೆಗಾಗಿ ಕಾದಿರುವ") private WebElement pendingApprovalTitle; + + @AndroidFindBy(accessibility = "Sync Completed Successfully") + private WebElement syncCompletedPopup; + + @AndroidFindBy(accessibility = "Restart") + private WebElement restartButton; public OperationalTaskPageKannada(AppiumDriver driver) { super(driver); @@ -73,5 +79,16 @@ public boolean isPendingApprovalTitleDisplayed() { } return isElementDisplayed(pendingApprovalTitle); } + + public void handleIfSyncPopUpDisplayed() { + for (int i = 0; i < 120; i++) { + if (isElementDisplayed(syncCompletedPopup)) { + clickOnElement(restartButton); + return; + } + waitTime(5); + } + throw new RuntimeException("Sync popup not displayed"); + } } diff --git a/ui-test/src/main/java/regclient/pages/kannada/PreviewPageKannada.java b/ui-test/src/main/java/regclient/pages/kannada/PreviewPageKannada.java index 15e3c8443..8a9e22e94 100644 --- a/ui-test/src/main/java/regclient/pages/kannada/PreviewPageKannada.java +++ b/ui-test/src/main/java/regclient/pages/kannada/PreviewPageKannada.java @@ -66,7 +66,7 @@ public boolean isDocumentsInformationInPreviewPageDisplayed() { return isElementDisplayed(documentsInformationInPreviewPage); } - public boolean isBiometricsInformationInPreviewPagePageDisplayed() { + public boolean isBiometricsInformationInPreviewPageDisplayed() { return isElementDisplayed(biometricsInformationInPreviewPage); } @@ -83,7 +83,7 @@ public boolean updateUINTitleDisplayed() { + FetchUiSpec.getTitleUsingId("UPDATE") + "\"))"))); } - public boolean isApplicationIDPreviewPagePageDisplayed() { + public boolean isApplicationIDPreviewPageDisplayed() { return isElementDisplayed(applicationIDPreviewPage); } diff --git a/ui-test/src/main/java/regclient/pages/kannada/RegistrationTasksPageKannada.java b/ui-test/src/main/java/regclient/pages/kannada/RegistrationTasksPageKannada.java index d205e05e1..e961ad854 100644 --- a/ui-test/src/main/java/regclient/pages/kannada/RegistrationTasksPageKannada.java +++ b/ui-test/src/main/java/regclient/pages/kannada/RegistrationTasksPageKannada.java @@ -63,6 +63,12 @@ public class RegistrationTasksPageKannada extends RegistrationTasksPage { @AndroidFindBy(id = "com.android.permissioncontroller:id/permission_deny_button") private WebElement dontAllowButton; + + @AndroidFindBy(accessibility = "Sync Completed Successfully") + private WebElement syncCompletedPopup; + + @AndroidFindBy(accessibility = "Restart") + private WebElement restartButton; public RegistrationTasksPageKannada(AppiumDriver driver) { super(driver); @@ -175,4 +181,15 @@ public void clickOnRegistrationTasksTab() { public boolean isSettingsButtonDisplayed() { return isElementDisplayed(settingsButton); } + + public void handleIfSyncPopUpDisplayed() { + for (int i = 0; i < 120; i++) { + if (isElementDisplayed(syncCompletedPopup)) { + clickOnElement(restartButton); + return; + } + waitTime(5); + } + throw new RuntimeException("Sync popup not displayed"); + } } diff --git a/ui-test/src/main/java/regclient/pages/tamil/ApplicantBiometricsPageTamil.java b/ui-test/src/main/java/regclient/pages/tamil/ApplicantBiometricsPageTamil.java index 94bd90645..ea8a9eaa5 100644 --- a/ui-test/src/main/java/regclient/pages/tamil/ApplicantBiometricsPageTamil.java +++ b/ui-test/src/main/java/regclient/pages/tamil/ApplicantBiometricsPageTamil.java @@ -11,122 +11,124 @@ import regclient.pages.english.BiometricDetailsPageEnglish; public class ApplicantBiometricsPageTamil extends ApplicantBiometricsPage { - + @AndroidFindBy(accessibility = "ஐரிஸ் ஊடுகதிர்") private WebElement irisScanButton; - + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"ஐரிஸ் ஊடுகதிர்\"))") private WebElement irisScanButtonTitle; - + @AndroidFindBy(accessibility = "நிரந்தர") private WebElement permanentButton; - + @AndroidFindBy(accessibility = "குறிப்பிடுக") private WebElement temporaryButton; - + @AndroidFindBy(accessibility = "விசாரிக்கப்பட்ட விதிவிலக்கு") private WebElement markExceptionButton; - + @AndroidFindBy(accessibility = "விசாரிக்கப்பட்ட விதிவிலக்கு") private WebElement exceptionTypeTitle; - + @AndroidFindBy(uiAutomator = "UiSelector().className(\"android.widget.ImageView\").instance(1)") private WebElement oneEyeException; - + @AndroidFindBy(uiAutomator = "UiSelector().className(\"android.widget.ImageView\").instance(2)") private WebElement firstFingureExceptionImage; - + @AndroidFindBy(uiAutomator = "UiSelector().className(\"android.widget.ImageView\").instance(1)") private WebElement secondFingureExceptionImage; - + @AndroidFindBy(uiAutomator = "UiSelector().className(\"android.widget.ImageView\").instance(3)") private WebElement thirdFingureExceptionImage; - + @AndroidFindBy(uiAutomator = "UiSelector().className(\"android.widget.ImageView\").instance(4)") private WebElement forthFingureExceptionImage; - + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"வலது கை ஊடுகதிர்\"))") private WebElement rightHandScanTitle; - + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"இடது கை ஊடுகதிர்\"))") private WebElement leftHandScanTitle; - + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"முழுகுமதி ஊடுகதிர்\"))") private WebElement thumbsScanTitle; - + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"முகம் ஊடுகதிர்\"))") private WebElement faceScanTitle; - + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"விதிவிலக்கு ஊடுகதிர்\"))") private WebElement exceptionScanTitle; - + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().description(\"ஊடுகதிர்\"))") private WebElement scanButton; - + @AndroidFindBy(xpath = "//*[contains(@content-desc, 'Iris பிடிப்பு')]") private WebElement irisCapturerHeader; - + @AndroidFindBy(xpath = "//*[contains(@content-desc, 'RightHand பிடிப்பு')]") private WebElement rightHandCapturerHeader; - + @AndroidFindBy(xpath = "//*[contains(@content-desc, 'LeftHand பிடிப்பு')]") private WebElement leftHandCapturerHeader; - + @AndroidFindBy(xpath = "//*[contains(@content-desc, 'Thumbs பிடிப்பு')]") private WebElement thumbsCapturerHeader; - + @AndroidFindBy(xpath = "//*[contains(@content-desc, 'Face பிடிப்பு')]") private WebElement faceCapturerHeader; - + @AndroidFindBy(xpath = "//*[contains(@content-desc, 'Exception பிடிப்பு')]") private WebElement exceptionCapturerHeader; - + @AndroidFindBy(xpath = "//android.widget.ScrollView/android.view.View[3]") private WebElement zoomButton; - + @AndroidFindBy(xpath = "//android.view.View[contains(@content-desc, \"கருத்துகள்\")]/following-sibling::android.widget.EditText") private WebElement commentsTextBox; - + @AndroidFindBy(className = "android.widget.Button") private WebElement popUpCloseButton; - + @AndroidFindBy(accessibility = "அடுத்தவர்") private WebElement nextButton; - + @AndroidFindBy(uiAutomator = "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"கருத்துகள்\"))") private WebElement commentsHeader; - + @AndroidFindBy(xpath = "//android.view.View[@content-desc=\"விதிவிலக்குகள்\"]/following-sibling::android.view.View[@content-desc=\"1\"]") private WebElement exceptionCount; - + @AndroidFindBy(accessibility = "menu_back_button") + private WebElement biometricsMenuButton; + public ApplicantBiometricsPageTamil(AppiumDriver driver) { super(driver); } - - public void enterCommentsInTextBox(String comments) { - if(!isElementDisplayedOnScreen(commentsTextBox)) { + + public void enterCommentsInTextBox(String comments) { + if (!isElementDisplayedOnScreen(commentsTextBox)) { swipeOrScroll(); } - clickAndsendKeysToTextBox(commentsTextBox,comments); + clickAndsendKeysToTextBox(commentsTextBox, comments); } public void clickOnScanButton() { clickOnElement(scanButton); - } + } public void clickOnExceptionTypePermanentButton() { - if(!isElementDisplayedOnScreen(permanentButton)) { + if (!isElementDisplayedOnScreen(permanentButton)) { swipeOrScroll(); } clickOnElement(permanentButton); } public void clickOnExceptionTypeTemporaryButton() { - if(!isElementDisplayedOnScreen(temporaryButton)) { + if (!isElementDisplayedOnScreen(temporaryButton)) { swipeOrScroll(); } - clickOnElement(temporaryButton); + clickOnElement(temporaryButton); } public void markOneEyeException() { @@ -192,72 +194,81 @@ public BiometricDetailsPage clickOnBackButton() { } @SuppressWarnings("deprecation") - public boolean isApplicantBiometricsPageDisplayed() { - return isElementDisplayed(findElementWithRetry(MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"" + FetchUiSpec.getValueUsingId("individualBiometrics") + "\"))"))); + public boolean isApplicantBiometricsPageDisplayed() { + return isElementDisplayed(findElementWithRetry(MobileBy.AndroidUIAutomator( + "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"" + + FetchUiSpec.getValueUsingId("individualBiometrics") + "\"))"))); } @SuppressWarnings("deprecation") - public boolean isAuthenticationBiometricsPageDisplayed() { - return isElementDisplayed(findElementWithRetry(MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"" + FetchUiSpec.getValueUsingId("individualAuthBiometrics") + "\"))"))); + public boolean isAuthenticationBiometricsPageDisplayed() { + return isElementDisplayed(findElementWithRetry(MobileBy.AndroidUIAutomator( + "new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().descriptionContains(\"" + + FetchUiSpec.getValueUsingId("individualAuthBiometrics") + "\"))"))); } - public boolean isExceptionTypeTitleDisplayed() { + public boolean isExceptionTypeTitleDisplayed() { return isElementDisplayed(exceptionTypeTitle); } - public boolean isRightHandScanTitleDisplayed() { + public boolean isRightHandScanTitleDisplayed() { return isElementDisplayed(rightHandScanTitle); } - public boolean isLeftHandScanTitleDisplayed() { + public boolean isLeftHandScanTitleDisplayed() { return isElementDisplayed(leftHandScanTitle); } - public boolean isThumbsScanTitleDisplayed() { + public boolean isThumbsScanTitleDisplayed() { return isElementDisplayed(thumbsScanTitle); } - public boolean isFaceScanTitleDisplayed() { + public boolean isFaceScanTitleDisplayed() { return isElementDisplayed(faceScanTitle); } - public boolean isExceptionScanTitleDisplayed() { + public boolean isExceptionScanTitleDisplayed() { return isElementDisplayed(exceptionScanTitle); } - public boolean isIrisScan() { - return isElementDisplayed(irisCapturerHeader,2000); + public boolean isIrisScan() { + return isElementDisplayed(irisCapturerHeader, 2000); } - public boolean isRightHandScan() { - return isElementDisplayed(rightHandCapturerHeader,2000); + public boolean isRightHandScan() { + return isElementDisplayed(rightHandCapturerHeader, 2000); } - public boolean isLeftHandScan() { - return isElementDisplayed(leftHandCapturerHeader,2000); + public boolean isLeftHandScan() { + return isElementDisplayed(leftHandCapturerHeader, 2000); } - public boolean isThumbsScan() { - return isElementDisplayed(thumbsCapturerHeader,2000); + public boolean isThumbsScan() { + return isElementDisplayed(thumbsCapturerHeader, 2000); } - public boolean isFaceScan() { - return isElementDisplayed(faceCapturerHeader,2000); + public boolean isFaceScan() { + return isElementDisplayed(faceCapturerHeader, 2000); } - public boolean isExceptionScan() { - return isElementDisplayed(exceptionCapturerHeader,2000); + public boolean isExceptionScan() { + return isElementDisplayed(exceptionCapturerHeader, 2000); } - public boolean isCommentHeaderDisplayed() { + public boolean isCommentHeaderDisplayed() { return isElementDisplayed(commentsHeader); } - public boolean isExceptionCountDisplayed() { - if(!isElementDisplayedOnScreen(exceptionCount)) { + public boolean isExceptionCountDisplayed() { + if (!isElementDisplayedOnScreen(exceptionCount)) { swipeOrScroll(); isElementDisplayed(exceptionCount); } return isElementDisplayed(exceptionCount); } + + public BiometricDetailsPage clickOnBiometricsMenuButton() { + clickOnElement(biometricsMenuButton); + return new BiometricDetailsPageEnglish(driver); + } } diff --git a/ui-test/src/main/java/regclient/pages/tamil/ManageApplicationsPageTamil.java b/ui-test/src/main/java/regclient/pages/tamil/ManageApplicationsPageTamil.java index bb43b5af2..9ea90b2f5 100644 --- a/ui-test/src/main/java/regclient/pages/tamil/ManageApplicationsPageTamil.java +++ b/ui-test/src/main/java/regclient/pages/tamil/ManageApplicationsPageTamil.java @@ -262,4 +262,10 @@ public boolean isNoNetworkFoundDisplayed() { public void selectLatestAidCheckBox() { clickOnElement(latestAidCheckBox); } + + public void clickCheckboxByAID(String aid) { + By checkbox = By + .xpath("//android.view.View[contains(@content-desc,'" + aid + "')]" + "//android.widget.CheckBox"); + click(checkbox); + } } diff --git a/ui-test/src/main/java/regclient/pages/tamil/OperationalTaskPageTamil.java b/ui-test/src/main/java/regclient/pages/tamil/OperationalTaskPageTamil.java index ea74b6ba0..9f56eeff3 100644 --- a/ui-test/src/main/java/regclient/pages/tamil/OperationalTaskPageTamil.java +++ b/ui-test/src/main/java/regclient/pages/tamil/OperationalTaskPageTamil.java @@ -7,29 +7,34 @@ import regclient.page.OperationalTaskPage; import regclient.page.SupervisorBiometricVerificationpage; - -public class OperationalTaskPageTamil extends OperationalTaskPage{ +public class OperationalTaskPageTamil extends OperationalTaskPage { @AndroidFindBy(accessibility = "ஆபரேட்டர் பயோமெட்ரிக்ஸைப் புதுப்பிக்கவும்") private WebElement updateOperatorBiometricsButton; - + @AndroidFindBy(accessibility = "System Storage Usage") private WebElement systemStorageUsageTitle; - + @AndroidFindBy(uiAutomator = "new UiSelector().descriptionContains(\"தரவை ஒத்திசைக்கவும்\")") - private WebElement synchronizeDataButton ; + private WebElement synchronizeDataButton; @AndroidFindBy(accessibility = "விண்ணப்பப் பதிவேற்றம்") private WebElement applicationUploadTitle; - + @AndroidFindBy(accessibility = "நிலுவையிலுள்ள ஒப்புதல்") private WebElement pendingApprovalTitle; - + + @AndroidFindBy(accessibility = "Sync Completed Successfully") + private WebElement syncCompletedPopup; + + @AndroidFindBy(accessibility = "Restart") + private WebElement restartButton; + public OperationalTaskPageTamil(AppiumDriver driver) { super(driver); } - public SupervisorBiometricVerificationpage clickOnUpdateOperatorBiometricsButton() { + public SupervisorBiometricVerificationpage clickOnUpdateOperatorBiometricsButton() { clickOnElement(updateOperatorBiometricsButton); return new SupervisorBiometricVerificationpageTamil(driver); @@ -39,40 +44,50 @@ public boolean isOperationalTaskPageLoaded() { return isElementDisplayed(systemStorageUsageTitle); } - - public void clickSynchronizeDataButton() { + public void clickSynchronizeDataButton() { clickOnElement(synchronizeDataButton); waitTime(50); } - + public boolean checkLastSyncDate() { String contentDesc = synchronizeDataButton.getAttribute("content-desc"); - if(contentDesc.contains("தரவை ஒத்திசைக்கவும்\n"+getCurrentDateWord()+",")) + if (contentDesc.contains("தரவை ஒத்திசைக்கவும்\n" + getCurrentDateWord() + ",")) return true; else return false; } - - public void clickApplicationUploadTitle() { + + public void clickApplicationUploadTitle() { clickOnElement(applicationUploadTitle); } - + public boolean isApplicationUploadTitleDisplayed() { - if(!isElementDisplayedOnScreen(applicationUploadTitle)) { + if (!isElementDisplayedOnScreen(applicationUploadTitle)) { swipeOrScroll(); } return isElementDisplayed(applicationUploadTitle); } - - public void clickPendingApprovalTitle() { + + public void clickPendingApprovalTitle() { clickOnElement(pendingApprovalTitle); } - + public boolean isPendingApprovalTitleDisplayed() { - if(!isElementDisplayedOnScreen(pendingApprovalTitle)) { + if (!isElementDisplayedOnScreen(pendingApprovalTitle)) { swipeOrScroll(); } return isElementDisplayed(pendingApprovalTitle); } + public void handleIfSyncPopUpDisplayed() { + for (int i = 0; i < 120; i++) { + if (isElementDisplayed(syncCompletedPopup)) { + clickOnElement(restartButton); + return; + } + waitTime(5); + } + throw new RuntimeException("Sync popup not displayed"); + } + } diff --git a/ui-test/src/main/java/regclient/pages/tamil/PreviewPageTamil.java b/ui-test/src/main/java/regclient/pages/tamil/PreviewPageTamil.java index 7ab4f6fc1..c5ea6cb63 100644 --- a/ui-test/src/main/java/regclient/pages/tamil/PreviewPageTamil.java +++ b/ui-test/src/main/java/regclient/pages/tamil/PreviewPageTamil.java @@ -66,7 +66,7 @@ public boolean isDocumentsInformationInPreviewPageDisplayed() { return isElementDisplayed(documentsInformationInPreviewPage); } - public boolean isBiometricsInformationInPreviewPagePageDisplayed() { + public boolean isBiometricsInformationInPreviewPageDisplayed() { return isElementDisplayed(biometricsInformationInPreviewPage); } @@ -83,7 +83,7 @@ public boolean updateUINTitleDisplayed() { + FetchUiSpec.getTitleUsingId("UPDATE") + "\"))"))); } - public boolean isApplicationIDPreviewPagePageDisplayed() { + public boolean isApplicationIDPreviewPageDisplayed() { return isElementDisplayed(applicationIDPreviewPage); } diff --git a/ui-test/src/main/java/regclient/pages/tamil/RegistrationTasksPageTamil.java b/ui-test/src/main/java/regclient/pages/tamil/RegistrationTasksPageTamil.java index 0af10692c..c0e0dd506 100644 --- a/ui-test/src/main/java/regclient/pages/tamil/RegistrationTasksPageTamil.java +++ b/ui-test/src/main/java/regclient/pages/tamil/RegistrationTasksPageTamil.java @@ -63,6 +63,12 @@ public class RegistrationTasksPageTamil extends RegistrationTasksPage { @AndroidFindBy(id = "com.android.permissioncontroller:id/permission_deny_button") private WebElement dontAllowButton; + + @AndroidFindBy(accessibility = "Sync Completed Successfully") + private WebElement syncCompletedPopup; + + @AndroidFindBy(accessibility = "Restart") + private WebElement restartButton; public RegistrationTasksPageTamil(AppiumDriver driver) { super(driver); @@ -175,4 +181,15 @@ public void clickOnRegistrationTasksTab() { public boolean isSettingsButtonDisplayed() { return isElementDisplayed(settingsButton); } + + public void handleIfSyncPopUpDisplayed() { + for (int i = 0; i < 120; i++) { + if (isElementDisplayed(syncCompletedPopup)) { + clickOnElement(restartButton); + return; + } + waitTime(5); + } + throw new RuntimeException("Sync popup not displayed"); + } } diff --git a/ui-test/src/main/resources/DesiredCapabilities.json b/ui-test/src/main/resources/DesiredCapabilities.json index 2b34fb15b..2afd209b1 100644 --- a/ui-test/src/main/resources/DesiredCapabilities.json +++ b/ui-test/src/main/resources/DesiredCapabilities.json @@ -2,7 +2,7 @@ { "name": "androidDevice", "caps": { - "appium:udid": "ADNKCP3523400513", + "appium:udid": "M01JPG1004392102744", "appium:automationName": "UiAutomator2", "appium:app": "D:/ARC/qa-base/apk-output/app-release.apk", "platformName": "android", diff --git a/ui-test/src/main/resources/config/Kernel.properties b/ui-test/src/main/resources/config/Kernel.properties index 1e5cbeab8..6d4126d23 100644 --- a/ui-test/src/main/resources/config/Kernel.properties +++ b/ui-test/src/main/resources/config/Kernel.properties @@ -135,4 +135,4 @@ zone=MOR apiEnvUser=api-internal.qa-base apiInternalEndPoint= regclientScenariosToExecute= -#PreRegFetchingPacket,NewRegistrationAdult,NewRegistrationAdultException,NewRegistrationInfant,NewRegistrationMinor,NewRegistrationMinorException,ResetPassword,Settings,UpdateMyUinInfant,UpdateMyUinMinor,UpdateMyUinUpdateBiometrics,UpdateMyUINUpdateDemographicDetails,UpdateMyUinUpdateDocuments,LostUin,AddMachineDetails,IntialLunch,logintest,BiometricCorrection,ResetPassword \ No newline at end of file +#PreRegFetchingPacket,NewRegistrationAdult,NewRegistrationAdultException,NewRegistrationInfant,NewRegistrationMinor,NewRegistrationMinorException,ResetPassword,Settings,UpdateMyUinInfant,UpdateMyUinMinor,UpdateMyUinUpdateBiometrics,UpdateMyUINUpdateDemographicDetails,UpdateMyUinUpdateDocuments,LostUin,IntialLunch,Logintest,BiometricCorrection,AutoLogout,ExportPacket,NewRegistrationAdultUploadMultipleDoccuments \ No newline at end of file From 8e79397cda06165e3beae5273a5e4b509d2e8dd3 Mon Sep 17 00:00:00 2001 From: damodarguru Date: Thu, 26 Mar 2026 12:14:49 +0530 Subject: [PATCH 2/5] MOSIP-44310:Fix and optimize ARC UI automation failures. Signed-off-by: damodarguru --- .../androidTestCases/BiometricCorrection.java | 35 +++++++------------ .../androidTestCases/ExportPacket.java | 13 ------- .../regclient/androidTestCases/LoginTest.java | 4 --- .../regclient/androidTestCases/LostUin.java | 2 -- .../NewRegistrationAdult.java | 22 +++--------- .../regclient/androidTestCases/Settings.java | 1 + .../arabic/AuthenticationPageArabic.java | 12 ++++--- .../ManageApplicationsPageEnglish.java | 3 -- .../hindi/ApplicantBiometricsPageHindi.java | 2 +- .../ApplicantBiometricsPageKannada.java | 2 +- .../tamil/ApplicantBiometricsPageTamil.java | 2 +- .../main/resources/DesiredCapabilities.json | 2 +- 12 files changed, 31 insertions(+), 69 deletions(-) diff --git a/ui-test/src/main/java/regclient/androidTestCases/BiometricCorrection.java b/ui-test/src/main/java/regclient/androidTestCases/BiometricCorrection.java index 7b5fdcb78..ee50ca3b6 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/BiometricCorrection.java +++ b/ui-test/src/main/java/regclient/androidTestCases/BiometricCorrection.java @@ -3,14 +3,9 @@ import static org.testng.Assert.assertTrue; import java.util.List; -import java.util.Map; - -import org.openqa.selenium.By; -import org.openqa.selenium.WebElement; import org.testng.annotations.Test; import io.appium.java_client.HidesKeyboard; -import io.appium.java_client.android.AndroidDriver; import regclient.BaseTest.AndroidBaseTest; import regclient.api.ArcConfigManager; import regclient.api.FetchUiSpec; @@ -33,7 +28,6 @@ import regclient.page.ProfilePage; import regclient.page.RegistrationTasksPage; import regclient.page.SelectLanguagePage; -import regclient.page.SettingsPage; import regclient.pages.arabic.AcknowledgementPageArabic; import regclient.pages.arabic.ApplicantBiometricsPageArabic; import regclient.pages.arabic.AuthenticationPageArabic; @@ -446,7 +440,7 @@ public void adultBiometricCorrection() throws InterruptedException { assertTrue(previewPage.isBiometricsInformationInPreviewPageDisplayed(), "Verify if Biometrics Information In PreviewPage is displayed"); String Aid = previewPage.getAID(); - + if ("eng".equalsIgnoreCase(language)) { authenticationPage = new AuthenticationPageEnglish(driver); } else if ("hin".equalsIgnoreCase(language)) { @@ -598,19 +592,16 @@ public void adultBiometricCorrection() throws InterruptedException { manageApplicationsPage.clickOnSearchCheckBox(); boolean uploadSuccess = false; - for (int i = 0; i < 3; i++) { - manageApplicationsPage.clickOnUploadButton(); - uploadSuccess = manageApplicationsPage.isZeroApplicationDisplayed(); - - if (!uploadSuccess) { - + if (uploadSuccess) { + break; } } assertTrue(uploadSuccess, "Zero Application not displayed after retries"); + manageApplicationsPage.clickOnBackButton(); // Return to mocksbi page @@ -917,7 +908,7 @@ public void adultBiometricCorrection() throws InterruptedException { boolean isBioCorrectionAuthenticationPageDisplayed = false; for (int i = 0; i < 3; i++) { pendingApproval.clickOnAuthenticateButton(); - + if (pendingApproval.isSupervisorAuthenticationTitleDisplayed()) { isBioCorrectionAuthenticationPageDisplayed = true; break; @@ -961,13 +952,10 @@ public void adultBiometricCorrection() throws InterruptedException { manageApplicationsPage.clickOnSearchCheckBox(); for (int i = 0; i < 3; i++) { - manageApplicationsPage.clickOnUploadButton(); - uploadSuccess = manageApplicationsPage.isZeroApplicationDisplayed(); - - if (!uploadSuccess) { - + if (uploadSuccess) { + break; } } @@ -1496,7 +1484,7 @@ public void minorBiometricCorrection() throws InterruptedException { boolean isPageDisplayed = false; for (int i = 0; i < 3; i++) { pendingApproval.clickOnAuthenticateButton(); - + if (pendingApproval.isSupervisorAuthenticationTitleDisplayed()) { isPageDisplayed = true; break; @@ -1542,7 +1530,8 @@ public void minorBiometricCorrection() throws InterruptedException { for (int i = 0; i < 3; i++) { manageApplicationsPage.clickOnUploadButton(); uploadSuccess = manageApplicationsPage.isZeroApplicationDisplayed(); - if (!uploadSuccess) { + if (uploadSuccess) { + break; } } @@ -1868,11 +1857,13 @@ public void minorBiometricCorrection() throws InterruptedException { for (int i = 0; i < 3; i++) { manageApplicationsPage.clickOnUploadButton(); uploadSuccess = manageApplicationsPage.isZeroApplicationDisplayed(); - if (!uploadSuccess) { + if (uploadSuccess) { + break; } } assertTrue(uploadSuccess, "Zero Application not displayed after retries"); + manageApplicationsPage.clickOnBackButton(); registrationTasksPage.clickProfileButton(); diff --git a/ui-test/src/main/java/regclient/androidTestCases/ExportPacket.java b/ui-test/src/main/java/regclient/androidTestCases/ExportPacket.java index b4700fa22..9b3ab48c0 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/ExportPacket.java +++ b/ui-test/src/main/java/regclient/androidTestCases/ExportPacket.java @@ -1,7 +1,5 @@ package regclient.androidTestCases; -import static org.junit.Assert.assertFalse; -import static org.junit.jupiter.api.Assertions.assertFalse; import static org.testng.Assert.assertTrue; import java.util.List; @@ -18,7 +16,6 @@ import regclient.page.BiometricDetailsPage; import regclient.page.ConsentPage; import regclient.page.DemographicDetailsPage; -import regclient.page.DocumentUploadPage; import regclient.page.ExportPage; import regclient.page.LoginPage; import regclient.page.ManageApplicationsPage; @@ -28,14 +25,12 @@ import regclient.page.ProfilePage; import regclient.page.RegistrationTasksPage; import regclient.page.SelectLanguagePage; -import regclient.page.UpdateUINPage; import regclient.pages.arabic.AcknowledgementPageArabic; import regclient.pages.arabic.ApplicantBiometricsPageArabic; import regclient.pages.arabic.AuthenticationPageArabic; import regclient.pages.arabic.BiometricDetailsPageArabic; import regclient.pages.arabic.ConsentPageArabic; import regclient.pages.arabic.DemographicDetailsPageArabic; -import regclient.pages.arabic.DocumentUploadPageArabic; import regclient.pages.arabic.LoginPageArabic; import regclient.pages.arabic.ManageApplicationsPageArabic; import regclient.pages.arabic.OperationalTaskPageArabic; @@ -44,14 +39,12 @@ import regclient.pages.arabic.ProfilePageArabic; import regclient.pages.arabic.RegistrationTasksPageArabic; import regclient.pages.arabic.SelectLanguagePageArabic; -import regclient.pages.arabic.UpdateUINPageArabic; import regclient.pages.english.AcknowledgementPageEnglish; import regclient.pages.english.ApplicantBiometricsPageEnglish; import regclient.pages.english.AuthenticationPageEnglish; import regclient.pages.english.BiometricDetailsPageEnglish; import regclient.pages.english.ConsentPageEnglish; import regclient.pages.english.DemographicDetailsPageEnglish; -import regclient.pages.english.DocumentUploadPageEnglish; import regclient.pages.english.LoginPageEnglish; import regclient.pages.english.ManageApplicationsPageEnglish; import regclient.pages.english.OperationalTaskPageEnglish; @@ -60,14 +53,12 @@ import regclient.pages.english.ProfilePageEnglish; import regclient.pages.english.RegistrationTasksPageEnglish; import regclient.pages.english.SelectLanguagePageEnglish; -import regclient.pages.english.UpdateUINPageEnglish; import regclient.pages.french.AcknowledgementPageFrench; import regclient.pages.french.ApplicantBiometricsPageFrench; import regclient.pages.french.AuthenticationPageFrench; import regclient.pages.french.BiometricDetailsPageFrench; import regclient.pages.french.ConsentPageFrench; import regclient.pages.french.DemographicDetailsPageFrench; -import regclient.pages.french.DocumentUploadPageFrench; import regclient.pages.french.LoginPageFrench; import regclient.pages.french.ManageApplicationsPageFrench; import regclient.pages.french.OperationalTaskPageFrench; @@ -76,14 +67,12 @@ import regclient.pages.french.ProfilePageFrench; import regclient.pages.french.RegistrationTasksPageFrench; import regclient.pages.french.SelectLanguagePageFrench; -import regclient.pages.french.UpdateUINPageFrench; import regclient.pages.hindi.AcknowledgementPageHindi; import regclient.pages.hindi.ApplicantBiometricsPageHindi; import regclient.pages.hindi.AuthenticationPageHindi; import regclient.pages.hindi.BiometricDetailsPageHindi; import regclient.pages.hindi.ConsentPageHindi; import regclient.pages.hindi.DemographicDetailsPageHindi; -import regclient.pages.hindi.DocumentUploadPageHindi; import regclient.pages.hindi.LoginPageHindi; import regclient.pages.hindi.ManageApplicationsPageHindi; import regclient.pages.hindi.OperationalTaskPageHindi; @@ -92,7 +81,6 @@ import regclient.pages.hindi.ProfilePageHindi; import regclient.pages.hindi.RegistrationTasksPageHindi; import regclient.pages.hindi.SelectLanguagePageHindi; -import regclient.pages.hindi.UpdateUINPageHindi; import regclient.pages.kannada.AcknowledgementPageKannada; import regclient.pages.kannada.ApplicantBiometricsPageKannada; import regclient.pages.kannada.AuthenticationPageKannada; @@ -134,7 +122,6 @@ public void exportPacket() throws InterruptedException { SelectLanguagePage selectLanguagePage = null; ConsentPage consentPage = null; DemographicDetailsPage demographicPage = null; - DocumentUploadPage documentuploadPage = null; BiometricDetailsPage biometricDetailsPage = null; ApplicantBiometricsPage applicantBiometricsPage = null; PreviewPage previewPage = null; diff --git a/ui-test/src/main/java/regclient/androidTestCases/LoginTest.java b/ui-test/src/main/java/regclient/androidTestCases/LoginTest.java index a52726b3e..e99b15afc 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/LoginTest.java +++ b/ui-test/src/main/java/regclient/androidTestCases/LoginTest.java @@ -3,10 +3,6 @@ import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; -import java.time.Duration; - -import org.openqa.selenium.support.ui.ExpectedConditions; -import org.openqa.selenium.support.ui.WebDriverWait; import org.testng.annotations.Test; import regclient.BaseTest.AndroidBaseTest; diff --git a/ui-test/src/main/java/regclient/androidTestCases/LostUin.java b/ui-test/src/main/java/regclient/androidTestCases/LostUin.java index 875f7f9ef..b4d9f8361 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/LostUin.java +++ b/ui-test/src/main/java/regclient/androidTestCases/LostUin.java @@ -13,11 +13,9 @@ import regclient.page.AcknowledgementPage; import regclient.page.ApplicantBiometricsPage; import regclient.page.AuthenticationPage; -import regclient.page.BasePage; import regclient.page.BiometricDetailsPage; import regclient.page.ConsentPage; import regclient.page.DemographicDetailsPage; -import regclient.page.DocumentUploadPage; import regclient.page.LoginPage; import regclient.page.ManageApplicationsPage; import regclient.page.OperationalTaskPage; diff --git a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdult.java b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdult.java index c92d2a24e..d663dc91e 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdult.java +++ b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdult.java @@ -17,7 +17,6 @@ import regclient.page.ConsentPage; import regclient.page.DemographicDetailsPage; import regclient.page.DocumentUploadPage; -import regclient.page.IntroducerBiometricPage; import regclient.page.LoginPage; import regclient.page.ManageApplicationsPage; import regclient.page.OperationalTaskPage; @@ -33,7 +32,6 @@ import regclient.pages.arabic.ConsentPageArabic; import regclient.pages.arabic.DemographicDetailsPageArabic; import regclient.pages.arabic.DocumentUploadPageArabic; -import regclient.pages.arabic.IntroducerBiometricPageArabic; import regclient.pages.arabic.LoginPageArabic; import regclient.pages.arabic.ManageApplicationsPageArabic; import regclient.pages.arabic.OperationalTaskPageArabic; @@ -49,7 +47,6 @@ import regclient.pages.english.ConsentPageEnglish; import regclient.pages.english.DemographicDetailsPageEnglish; import regclient.pages.english.DocumentUploadPageEnglish; -import regclient.pages.english.IntroducerBiometricPageEnglish; import regclient.pages.english.LoginPageEnglish; import regclient.pages.english.ManageApplicationsPageEnglish; import regclient.pages.english.OperationalTaskPageEnglish; @@ -65,7 +62,6 @@ import regclient.pages.french.ConsentPageFrench; import regclient.pages.french.DemographicDetailsPageFrench; import regclient.pages.french.DocumentUploadPageFrench; -import regclient.pages.french.IntroducerBiometricPageFrench; import regclient.pages.french.LoginPageFrench; import regclient.pages.french.ManageApplicationsPageFrench; import regclient.pages.french.OperationalTaskPageFrench; @@ -81,7 +77,6 @@ import regclient.pages.hindi.ConsentPageHindi; import regclient.pages.hindi.DemographicDetailsPageHindi; import regclient.pages.hindi.DocumentUploadPageHindi; -import regclient.pages.hindi.IntroducerBiometricPageHindi; import regclient.pages.hindi.LoginPageHindi; import regclient.pages.hindi.ManageApplicationsPageHindi; import regclient.pages.hindi.OperationalTaskPageHindi; @@ -97,7 +92,6 @@ import regclient.pages.kannada.ConsentPageKannada; import regclient.pages.kannada.DemographicDetailsPageKannada; import regclient.pages.kannada.DocumentUploadPageKannada; -import regclient.pages.kannada.IntroducerBiometricPageKannada; import regclient.pages.kannada.LoginPageKannada; import regclient.pages.kannada.ManageApplicationsPageKannada; import regclient.pages.kannada.OperationalTaskPageKannada; @@ -113,7 +107,6 @@ import regclient.pages.tamil.ConsentPageTamil; import regclient.pages.tamil.DemographicDetailsPageTamil; import regclient.pages.tamil.DocumentUploadPageTamil; -import regclient.pages.tamil.IntroducerBiometricPageTamil; import regclient.pages.tamil.LoginPageTamil; import regclient.pages.tamil.ManageApplicationsPageTamil; import regclient.pages.tamil.OperationalTaskPageTamil; @@ -147,7 +140,6 @@ public void newRegistrationAdult() throws InterruptedException { PendingApproval pendingApproval = null; ManageApplicationsPage manageApplicationsPage = null; ProfilePage profilePage = null; - BasePage basePage = null; final String language = TestDataReader.readData("language"); @@ -598,16 +590,12 @@ public void newRegistrationAdult() throws InterruptedException { manageApplicationsPage.clickOnSearchCheckBox(); boolean uploadSuccess = false; - for (int i = 0; i < 3; i++) { - - manageApplicationsPage.clickOnUploadButton(); - - uploadSuccess = manageApplicationsPage.isZeroApplicationDisplayed(); - - if (!uploadSuccess) { - - } + manageApplicationsPage.clickOnUploadButton(); + uploadSuccess = manageApplicationsPage.isZeroApplicationDisplayed(); + if (uploadSuccess) { + break; + } } assertTrue(uploadSuccess, "Zero Application not displayed after retries"); diff --git a/ui-test/src/main/java/regclient/androidTestCases/Settings.java b/ui-test/src/main/java/regclient/androidTestCases/Settings.java index aba8d49c8..6319be7ff 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/Settings.java +++ b/ui-test/src/main/java/regclient/androidTestCases/Settings.java @@ -165,6 +165,7 @@ public void settings() throws InterruptedException { assertTrue(settingsPage.isScanNowButtonDisplayed(), "Verify if scan now button displayed"); +// Now we not getting NoDevicesFound message so comment out // assertTrue(settingsPage.isNoDevicesFoundDisplayed(), "Verify if no devices found displayed"); settingsPage.clickOnGlobalConfigSettingsTab(); diff --git a/ui-test/src/main/java/regclient/pages/arabic/AuthenticationPageArabic.java b/ui-test/src/main/java/regclient/pages/arabic/AuthenticationPageArabic.java index 6ecbb5e81..4de6c1cc7 100644 --- a/ui-test/src/main/java/regclient/pages/arabic/AuthenticationPageArabic.java +++ b/ui-test/src/main/java/regclient/pages/arabic/AuthenticationPageArabic.java @@ -1,6 +1,7 @@ package regclient.pages.arabic; import java.util.List; +import java.util.NoSuchElementException; import org.openqa.selenium.WebElement; @@ -43,11 +44,14 @@ public boolean isAuthenticationPageDisplayed() { } public AcknowledgementPage clickOnAuthenticatenButton() { - int size=authenticateButtons.size()-1; - clickOnElement2(authenticateButtons.get(size)); - return new AcknowledgementPageArabic(driver); + if (authenticateButtons == null || authenticateButtons.isEmpty()) { + throw new NoSuchElementException("Authenticate buttons not found"); + } + int lastIndex = authenticateButtons.size() - 1; + clickOnElement2(authenticateButtons.get(lastIndex)); + return new AcknowledgementPageArabic(driver); } - + public boolean isAuthenticationImageDisplayed() { return isElementDisplayed(authenticationImage); } diff --git a/ui-test/src/main/java/regclient/pages/english/ManageApplicationsPageEnglish.java b/ui-test/src/main/java/regclient/pages/english/ManageApplicationsPageEnglish.java index 1926efe68..43e53a63d 100644 --- a/ui-test/src/main/java/regclient/pages/english/ManageApplicationsPageEnglish.java +++ b/ui-test/src/main/java/regclient/pages/english/ManageApplicationsPageEnglish.java @@ -1,11 +1,8 @@ package regclient.pages.english; -import java.time.Duration; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; -import org.openqa.selenium.support.ui.ExpectedConditions; -import org.openqa.selenium.support.ui.WebDriverWait; import io.appium.java_client.AppiumDriver; import io.appium.java_client.pagefactory.AndroidFindBy; diff --git a/ui-test/src/main/java/regclient/pages/hindi/ApplicantBiometricsPageHindi.java b/ui-test/src/main/java/regclient/pages/hindi/ApplicantBiometricsPageHindi.java index 51ee1ba88..46e0a00d1 100644 --- a/ui-test/src/main/java/regclient/pages/hindi/ApplicantBiometricsPageHindi.java +++ b/ui-test/src/main/java/regclient/pages/hindi/ApplicantBiometricsPageHindi.java @@ -269,6 +269,6 @@ public boolean isExceptionCountDisplayed() { public BiometricDetailsPage clickOnBiometricsMenuButton() { clickOnElement(biometricsMenuButton); - return new BiometricDetailsPageEnglish(driver); + return new BiometricDetailsPageHindi(driver); } } diff --git a/ui-test/src/main/java/regclient/pages/kannada/ApplicantBiometricsPageKannada.java b/ui-test/src/main/java/regclient/pages/kannada/ApplicantBiometricsPageKannada.java index ff5a561ae..91836a6a7 100644 --- a/ui-test/src/main/java/regclient/pages/kannada/ApplicantBiometricsPageKannada.java +++ b/ui-test/src/main/java/regclient/pages/kannada/ApplicantBiometricsPageKannada.java @@ -265,6 +265,6 @@ public boolean isExceptionCountDisplayed() { public BiometricDetailsPage clickOnBiometricsMenuButton() { clickOnElement(biometricsMenuButton); - return new BiometricDetailsPageEnglish(driver); + return new BiometricDetailsPageKannada(driver); } } diff --git a/ui-test/src/main/java/regclient/pages/tamil/ApplicantBiometricsPageTamil.java b/ui-test/src/main/java/regclient/pages/tamil/ApplicantBiometricsPageTamil.java index ea8a9eaa5..3be14aa26 100644 --- a/ui-test/src/main/java/regclient/pages/tamil/ApplicantBiometricsPageTamil.java +++ b/ui-test/src/main/java/regclient/pages/tamil/ApplicantBiometricsPageTamil.java @@ -269,6 +269,6 @@ public boolean isExceptionCountDisplayed() { public BiometricDetailsPage clickOnBiometricsMenuButton() { clickOnElement(biometricsMenuButton); - return new BiometricDetailsPageEnglish(driver); + return new BiometricDetailsPageTamil(driver); } } diff --git a/ui-test/src/main/resources/DesiredCapabilities.json b/ui-test/src/main/resources/DesiredCapabilities.json index 2afd209b1..2b34fb15b 100644 --- a/ui-test/src/main/resources/DesiredCapabilities.json +++ b/ui-test/src/main/resources/DesiredCapabilities.json @@ -2,7 +2,7 @@ { "name": "androidDevice", "caps": { - "appium:udid": "M01JPG1004392102744", + "appium:udid": "ADNKCP3523400513", "appium:automationName": "UiAutomator2", "appium:app": "D:/ARC/qa-base/apk-output/app-release.apk", "platformName": "android", From a13b85d115948dd19788a74d2c1a0b37626dbe14 Mon Sep 17 00:00:00 2001 From: damodarguru Date: Thu, 26 Mar 2026 12:47:07 +0530 Subject: [PATCH 3/5] MOSIP-44310:Fix and optimize ARC UI automation failures. Signed-off-by: damodarguru --- .../java/regclient/androidTestCases/NewRegistrationAdult.java | 1 - .../androidTestCases/NewRegistrationAdultException.java | 1 - .../regclient/androidTestCases/NewRegistrationInfant.java | 1 - .../java/regclient/androidTestCases/NewRegistrationMinor.java | 1 - .../pages/english/ManageApplicationsPageEnglish.java | 4 +++- 5 files changed, 3 insertions(+), 5 deletions(-) diff --git a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdult.java b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdult.java index d663dc91e..a546c3981 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdult.java +++ b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdult.java @@ -12,7 +12,6 @@ import regclient.page.AcknowledgementPage; import regclient.page.ApplicantBiometricsPage; import regclient.page.AuthenticationPage; -import regclient.page.BasePage; import regclient.page.BiometricDetailsPage; import regclient.page.ConsentPage; import regclient.page.DemographicDetailsPage; diff --git a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdultException.java b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdultException.java index a34e04808..e5a7fd04f 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdultException.java +++ b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationAdultException.java @@ -13,7 +13,6 @@ import regclient.page.AcknowledgementPage; import regclient.page.ApplicantBiometricsPage; import regclient.page.AuthenticationPage; -import regclient.page.BasePage; import regclient.page.BiometricDetailsPage; import regclient.page.ConsentPage; import regclient.page.DemographicDetailsPage; diff --git a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationInfant.java b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationInfant.java index 10ced4fe1..74a5b928b 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationInfant.java +++ b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationInfant.java @@ -13,7 +13,6 @@ import regclient.page.AcknowledgementPage; import regclient.page.ApplicantBiometricsPage; import regclient.page.AuthenticationPage; -import regclient.page.BasePage; import regclient.page.BiometricDetailsPage; import regclient.page.ConsentPage; import regclient.page.DemographicDetailsPage; diff --git a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationMinor.java b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationMinor.java index 3421b89fe..f50b2ccba 100644 --- a/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationMinor.java +++ b/ui-test/src/main/java/regclient/androidTestCases/NewRegistrationMinor.java @@ -13,7 +13,6 @@ import regclient.page.AcknowledgementPage; import regclient.page.ApplicantBiometricsPage; import regclient.page.AuthenticationPage; -import regclient.page.BasePage; import regclient.page.BiometricDetailsPage; import regclient.page.ConsentPage; import regclient.page.DemographicDetailsPage; diff --git a/ui-test/src/main/java/regclient/pages/english/ManageApplicationsPageEnglish.java b/ui-test/src/main/java/regclient/pages/english/ManageApplicationsPageEnglish.java index 43e53a63d..e49fb7ad7 100644 --- a/ui-test/src/main/java/regclient/pages/english/ManageApplicationsPageEnglish.java +++ b/ui-test/src/main/java/regclient/pages/english/ManageApplicationsPageEnglish.java @@ -1,6 +1,5 @@ package regclient.pages.english; - import org.openqa.selenium.By; import org.openqa.selenium.WebElement; @@ -259,6 +258,9 @@ public boolean isNoNetworkFoundDisplayed() { } public void clickCheckboxByAID(String aid) { + if (aid == null || aid.trim().isEmpty()) { + throw new IllegalArgumentException("AID cannot be null or empty"); + } By checkbox = By .xpath("//android.view.View[contains(@content-desc,'" + aid + "')]" + "//android.widget.CheckBox"); click(checkbox); From cfc3933e293c0937f7d5535a3ddf25cbdba429c7 Mon Sep 17 00:00:00 2001 From: damodarguru Date: Thu, 26 Mar 2026 14:34:18 +0530 Subject: [PATCH 4/5] MOSIP-44310:Fix and optimize ARC UI automation failures. Signed-off-by: damodarguru --- .../regclient/pages/arabic/BiometricDetailsPageArabic.java | 7 +------ .../pages/english/BiometricDetailsPageEnglish.java | 2 +- .../regclient/pages/french/BiometricDetailsPageFrench.java | 2 +- 3 files changed, 3 insertions(+), 8 deletions(-) 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 07b430ed2..23e9f776e 100644 --- a/ui-test/src/main/java/regclient/pages/arabic/BiometricDetailsPageArabic.java +++ b/ui-test/src/main/java/regclient/pages/arabic/BiometricDetailsPageArabic.java @@ -1,12 +1,9 @@ package regclient.pages.arabic; -import static org.junit.Assert.assertTrue; 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; @@ -24,8 +21,6 @@ import regclient.page.IntroducerBiometricPage; import regclient.page.PreviewPage; import regclient.page.RegistrationTasksPage; -import regclient.pages.english.BiometricDetailsPageEnglish; -import regclient.pages.english.RegistrationTasksPageEnglish; public class BiometricDetailsPageArabic extends BiometricDetailsPage { @@ -165,7 +160,7 @@ public boolean isAdditionalInfoRequestIdTextboxDisplayed() { } public void enterAdditionalInfoUsingEmail(String emailId) { - System.out.println(emailId); + logger.info(emailId); String additionalInfoReqId = OTPListener.getAdditionalReqId(emailId); if (additionalInfoReqId == null || additionalInfoReqId.trim().isEmpty()) { throw new IllegalStateException("Additional Info Request ID is missing for email: " + emailId); 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 9364eaed7..12a333f8a 100644 --- a/ui-test/src/main/java/regclient/pages/english/BiometricDetailsPageEnglish.java +++ b/ui-test/src/main/java/regclient/pages/english/BiometricDetailsPageEnglish.java @@ -185,7 +185,7 @@ public RegistrationTasksPage clickOnStayLoggedInButton() { } public void enterAdditionalInfoUsingEmail(String emailId) { - System.out.println(emailId); + logger.info(emailId); String additionalInfoReqId = OTPListener.getAdditionalReqId(emailId); if (additionalInfoReqId == null || additionalInfoReqId.trim().isEmpty()) { throw new IllegalStateException("Additional Info Request ID is missing for email: " + emailId); 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 6add98057..2f9545c0a 100644 --- a/ui-test/src/main/java/regclient/pages/french/BiometricDetailsPageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/BiometricDetailsPageFrench.java @@ -178,7 +178,7 @@ public boolean isAutoLogoutPopupDisplayed() { } public void enterAdditionalInfoUsingEmail(String emailId) { - System.out.println(emailId); + logger.info(emailId); String additionalInfoReqId = OTPListener.getAdditionalReqId(emailId); if (additionalInfoReqId == null || additionalInfoReqId.trim().isEmpty()) { throw new IllegalStateException("Additional Info Request ID is missing for email: " + emailId); From 4165aeb3553efd7966cb364ebf52a2ce84706989 Mon Sep 17 00:00:00 2001 From: damodarguru Date: Thu, 26 Mar 2026 15:47:40 +0530 Subject: [PATCH 5/5] MOSIP-44310:Fix and optimize ARC UI automation failures. Signed-off-by: damodarguru --- .../pages/french/BiometricDetailsPageFrench.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) 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 2f9545c0a..4dfa12ef3 100644 --- a/ui-test/src/main/java/regclient/pages/french/BiometricDetailsPageFrench.java +++ b/ui-test/src/main/java/regclient/pages/french/BiometricDetailsPageFrench.java @@ -200,15 +200,12 @@ public void enterAdditionalInfoUsingEmail(String emailId) { } private boolean typeAndVerify(WebElement el, String value) { - el.click(); - el.clear(); - el.sendKeys(value); - - // read the visible/real value in a safe way - String curr = readElementValue(el); - - // exact match (keeps your previous behavior) - return value.equals(curr); + el.click(); + el.clear(); + el.sendKeys(value); + waitTime(1); + String curr = readElementValue(el); + return value.equals(curr); } private String readElementValue(WebElement el) {