Skip to content

Function scroll is working but click is not working #2682

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
Kongwarriors opened this issue Apr 9, 2025 · 1 comment
Open

Function scroll is working but click is not working #2682

Kongwarriors opened this issue Apr 9, 2025 · 1 comment

Comments

@Kongwarriors
Copy link

Kongwarriors commented Apr 9, 2025

I am currently testing the orangehrmdemo site. I am executing the following scenario:
Step 1: Clogin
Step 2: Click the My Info button
Step 3: Enter information. However, at the step of selecting nationality.
I can scroll but cannot click. Howerver, the testcase still passes

Here is my code.

function myInfoPage(){
    let page = {}
    let locators = {
        "txt_FirstName":"//input[@name = 'firstName']",
        "txt_MiddleName":"//input[@name = 'middleName']",
        "txt_LastName": "//input[@name = 'lastName']",
        "txt_NickName": "//label[text()='Nickname']/parent::div/parent::div//child::input",
        "txt_EmployeeId" : "//label[text()='Employee Id']/parent::div/parent::div//child::input",
        "txt_OtherId": "//label[text()='Other Id']/parent::div/parent::div//child::input",
        "txt_DriverLicenseNumber":"//label[contains(text(), 'Driver')]/parent::div/parent::div//child::input",
        "txt_LicenseExpiryDate":"//label[text()='License Expiry Date']/parent::div/parent::div//child::input",
        "txt_SSNNumber": "//label[text()='SSN Number']/parent::div/parent::div//child::input",
        "txt_SINNumber": "//label[text()='SIN Number']/parent::div/parent::div//child::input",
        "cmb_Nationality": "//label[text()='Nationality']//parent::div//following-sibling::div",
        "cmb_MaritalStatus": "//label[text()='Marital Status']//parent::div//following-sibling::div",
        "txt_DateOfBirth": "//label[text() = 'Date of Birth']//parent::div//parent::div//child::input",
        "rdo_Male": "//label[text()='Gender']//parent::div//parent::div//child::input[@value='1']",
        "rdo_Female": "//label[text()='Gender']//parent::div//parent::div//child::input[@value='2']",
        "txt_MilitaryService": "//label[text()='Military Service']/parent::div/parent::div//child::input",
        "chk_Smoker": "//label[text()='Smoker']/parent::div/parent::div//child::input",
        "btn_Save": "//p[text()=' * Required']//parent::div//child::button",
        "icon_Loading": "//div[@class = 'oxd-loading-spinner']",
        "msg_Success": "//div[@class = 'oxd-toast oxd-toast--success oxd-toast-container--toast']//child::p[text() = 'Successfully Updated']",

    }

    //Init MyInfo Page locator
    page.locators = locators

    //Clear and input for TextBox
    const doClearAndInputText = function(locator, textInput){
        try{
            retry(5,1000).waitForEnabled(locator)
            input(locator, Key.CONTROL + "A" + Key.BACK_SPACE)
            input(locator, textInput, 100)
            enterText = value(locator)
            karate.log("Text " + enterText + "was input in " + locator)
        }
        catch(e){
            karate.fail(e.message)
            karate.log("Text " + enterText + "couldn't input in " + locator)
        }
    }

    const enterFirstName = function (firstName){
        doClearAndInputText(locators.txt_FirstName, firstName)
    }

    const enterMiddleName = function (middleName){
        doClearAndInputText(locators.txt_MiddleName, middleName)
    }

    const enterLastName = function (lastName){
        doClearAndInputText(locators.txt_LastName, lastName)
    }

    const enterEmployeeId = function (employeeId){
        doClearAndInputText(locators.txt_EmployeeId, employeeId)
    }

    const enterOtherId = function (otherId){
        doClearAndInputText(locators.txt_OtherId, otherId)
    }

    const enterDriverLicenseNumber = function(driverLicenseNumber){
        doClearAndInputText(locators.txt_DriverLicenseNumber, driverLicenseNumber)
    }

    const enterLicenseExpireDate = function(licenseExpireDate){
        doClearAndInputText(locators.txt_LicenseExpiryDate, licenseExpireDate)
    }

    const enterDateOfBirth = function(dateOfBirth){
        doClearAndInputText(locators.txt_DateOfBirth,dateOfBirth)
    }

    const selectGender = function(gender){
        if(gender.toLowerCase() == "male"){
            retry(5,1000).waitForEnabled(locators.rdo_Male).click()
        }
        else if(gender.toLowerCase() == "female"){
             retry(5,1000).waitForEnabled(locators.rdo_Female).click()
        }
        else{
            karate.fail("Data gender is invalid")
        }
    }

    const clickCmbNationality = function(nationality){
        try{
            let option_Nationality = "//label[text()='Nationality']//parent::div//following-sibling::div//span[contains(text(), '" + nationality + "')]"
            karate.log(option_Nationality)
            retry(5,1000).waitForEnabled(locators.cmb_Nationality)
            mouse().move(locators.cmb_Nationality).click()
//            retry(5,1000).waitForEnabled(option_Nationality)
//            mouse(option_Nationality).click()
            retry(5,1000).waitForEnabled("//label[text()='Nationality']//parent::div//following-sibling::div//div[@role = 'listbox']")
            mouse("//label[text()='Nationality']//parent::div//following-sibling::div//div[@role = 'listbox']")
            scroll(option_Nationality)
            delay(5000)
            screenshot()
            try{
                retry(5,1000).waitForEnabled(option_Nationality)
                mouse().move(option_Nationality).click()
                karate.log(text("//label[text()='Nationality']//parent::div//following-sibling::div//div[@class = 'oxd-select-text-input'][1]"))
                return option_Nationality
            }
            catch(e){
                karate.log("Element in listbox can't click")
                return null
            }
        }
        catch(e){
            karate.log('Something error')
            return null
        }
    }

    const selectNationality = function(nationality){
        karate.log(nationality)
        retry(5,1000).waitUntil(function(){return clickCmbNationality(nationality)})
        screenshot()
    }

    page.enterUserInformation = function(data){
        data.first_name != null ? enterFirstName(data.first_name) : karate.fail("FirstName not found")
        data.middle_name != null ? enterMiddleName(data.middle_name) : karate.fail("MiddleName not found")
        data.last_name != null ? enterLastName(data.last_name) : karate.fail("LastName not found")
        data.employee_id != null ? enterEmployeeId(data.employee_id) : karate.fail("EmployeeId not found")
        data.other_id != null ? enterOtherId(data.other_id) : karate.fail("OtherId not found")
        data.driver_license_number != null ? enterDriverLicenseNumber(data.driver_license_number) : karate.fail("Driver license number not found")
        data.license_expire_date != null ? enterLicenseExpireDate(data.license_expire_date) : karate.fail("License expire date not found")
        data.date_of_birth != null ? enterDateOfBirth(data.date_of_birth) : karate.fail("Date of birth not found")
        data.gender != null ? selectGender(data.gender) : karate.fail("Gender not found")
        data.nationality != null ? selectNationality(data.nationality) : karate.fail("Nationality not found")
    }
    return page;
}
`
I am currently testing the orangehrmdemo site. I am executing the following scenario: Step 1: login Step 2: click the My Info button Step 3: enter information. However, at the step of selecting nationality, I can scroll but cannot click, but the testcase still passes

Here is my code.

function myInfoPage(){
    let page = {}
    let locators = {
        "txt_FirstName":"//input[@name = 'firstName']",
        "txt_MiddleName":"//input[@name = 'middleName']",
        "txt_LastName": "//input[@name = 'lastName']",
        "txt_NickName": "//label[text()='Nickname']/parent::div/parent::div//child::input",
        "txt_EmployeeId" : "//label[text()='Employee Id']/parent::div/parent::div//child::input",
        "txt_OtherId": "//label[text()='Other Id']/parent::div/parent::div//child::input",
        "txt_DriverLicenseNumber":"//label[contains(text(), 'Driver')]/parent::div/parent::div//child::input",
        "txt_LicenseExpiryDate":"//label[text()='License Expiry Date']/parent::div/parent::div//child::input",
        "txt_SSNNumber": "//label[text()='SSN Number']/parent::div/parent::div//child::input",
        "txt_SINNumber": "//label[text()='SIN Number']/parent::div/parent::div//child::input",
        "cmb_Nationality": "//label[text()='Nationality']//parent::div//following-sibling::div",
        "cmb_MaritalStatus": "//label[text()='Marital Status']//parent::div//following-sibling::div",
        "txt_DateOfBirth": "//label[text() = 'Date of Birth']//parent::div//parent::div//child::input",
        "rdo_Male": "//label[text()='Gender']//parent::div//parent::div//child::input[@value='1']",
        "rdo_Female": "//label[text()='Gender']//parent::div//parent::div//child::input[@value='2']",
        "txt_MilitaryService": "//label[text()='Military Service']/parent::div/parent::div//child::input",
        "chk_Smoker": "//label[text()='Smoker']/parent::div/parent::div//child::input",
        "btn_Save": "//p[text()=' * Required']//parent::div//child::button",
        "icon_Loading": "//div[@class = 'oxd-loading-spinner']",
        "msg_Success": "//div[@class = 'oxd-toast oxd-toast--success oxd-toast-container--toast']//child::p[text() = 'Successfully Updated']",

    }

    //Init MyInfo Page locator
    page.locators = locators

    //Clear and input for TextBox
    const doClearAndInputText = function(locator, textInput){
        try{
            retry(5,1000).waitForEnabled(locator)
            input(locator, Key.CONTROL + "A" + Key.BACK_SPACE)
            input(locator, textInput, 100)
            enterText = value(locator)
            karate.log("Text " + enterText + "was input in " + locator)
        }
        catch(e){
            karate.fail(e.message)
            karate.log("Text " + enterText + "couldn't input in " + locator)
        }
    }

    const enterFirstName = function (firstName){
        doClearAndInputText(locators.txt_FirstName, firstName)
    }

    const enterMiddleName = function (middleName){
        doClearAndInputText(locators.txt_MiddleName, middleName)
    }

    const enterLastName = function (lastName){
        doClearAndInputText(locators.txt_LastName, lastName)
    }

    const enterEmployeeId = function (employeeId){
        doClearAndInputText(locators.txt_EmployeeId, employeeId)
    }

    const enterOtherId = function (otherId){
        doClearAndInputText(locators.txt_OtherId, otherId)
    }

    const enterDriverLicenseNumber = function(driverLicenseNumber){
        doClearAndInputText(locators.txt_DriverLicenseNumber, driverLicenseNumber)
    }

    const enterLicenseExpireDate = function(licenseExpireDate){
        doClearAndInputText(locators.txt_LicenseExpiryDate, licenseExpireDate)
    }

    const enterDateOfBirth = function(dateOfBirth){
        doClearAndInputText(locators.txt_DateOfBirth,dateOfBirth)
    }

    const selectGender = function(gender){
        if(gender.toLowerCase() == "male"){
            retry(5,1000).waitForEnabled(locators.rdo_Male).click()
        }
        else if(gender.toLowerCase() == "female"){
             retry(5,1000).waitForEnabled(locators.rdo_Female).click()
        }
        else{
            karate.fail("Data gender is invalid")
        }
    }

    const clickCmbNationality = function(nationality){
        try{
            let option_Nationality = "//label[text()='Nationality']//parent::div//following-sibling::div//span[contains(text(), '" + nationality + "')]"
            karate.log(option_Nationality)
            retry(5,1000).waitForEnabled(locators.cmb_Nationality)
            mouse().move(locators.cmb_Nationality).click()
//            retry(5,1000).waitForEnabled(option_Nationality)
//            mouse(option_Nationality).click()
            retry(5,1000).waitForEnabled("//label[text()='Nationality']//parent::div//following-sibling::div//div[@role = 'listbox']")
            mouse("//label[text()='Nationality']//parent::div//following-sibling::div//div[@role = 'listbox']")
            scroll(option_Nationality)
            delay(5000)
            screenshot()
            try{
                retry(5,1000).waitForEnabled(option_Nationality)
                mouse().move(option_Nationality).click()
                karate.log(text("//label[text()='Nationality']//parent::div//following-sibling::div//div[@class = 'oxd-select-text-input'][1]"))
                return option_Nationality
            }
            catch(e){
                karate.log("Element in listbox can't click")
                return null
            }
        }
        catch(e){
            karate.log('Something error')
            return null
        }
    }

    const selectNationality = function(nationality){
        karate.log(nationality)
        retry(5,1000).waitUntil(function(){return clickCmbNationality(nationality)})
        screenshot()
    }

    page.enterUserInformation = function(data){
        data.first_name != null ? enterFirstName(data.first_name) : karate.fail("FirstName not found")
        data.middle_name != null ? enterMiddleName(data.middle_name) : karate.fail("MiddleName not found")
        data.last_name != null ? enterLastName(data.last_name) : karate.fail("LastName not found")
        data.employee_id != null ? enterEmployeeId(data.employee_id) : karate.fail("EmployeeId not found")
        data.other_id != null ? enterOtherId(data.other_id) : karate.fail("OtherId not found")
        data.driver_license_number != null ? enterDriverLicenseNumber(data.driver_license_number) : karate.fail("Driver license number not found")
        data.license_expire_date != null ? enterLicenseExpireDate(data.license_expire_date) : karate.fail("License expire date not found")
        data.date_of_birth != null ? enterDateOfBirth(data.date_of_birth) : karate.fail("Date of birth not found")
        data.gender != null ? selectGender(data.gender) : karate.fail("Gender not found")
        data.nationality != null ? selectNationality(data.nationality) : karate.fail("Nationality not found")
    }
    return page;
}

Here is my evidence : i want to click Vietnamese but i can't

Image

@ptrthomas
Copy link
Member

@Kongwarriors sorry this is too complicated an example for any of us to work on. can you please follow these instructions: https://github.com/karatelabs/karate/wiki/How-to-Submit-an-Issue

ideally please contribute code (or co-ordinate with someone who can) to fix this

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants