Exemplo n.º 1
0
 def setUpClass(cls):
     # Login
     cls.driver = utils.get_browser_driver(cls.browser)
     cls.login = Login(cls.driver)
     cls.login.open_browser(config.LOGIN_URL)
     cls.login.login(config.USER_NAME, config.PASSWORD)
     cls.emplist = EmployeeList(cls.driver)
Exemplo n.º 2
0
 def tearDownClass(cls):
     """
     Delete employee and logout
     """
     cls.employeelist = EmployeeList(cls.driver)
     cls.employeelist.delete_employee(cls.name)
     cls.login.quit_browser()
 def setUpClass(cls):
     cls.driver = utils.get_browser_driver(cls.browser)
     cls.login = Login(cls.driver)
     cls.login.open_browser(config.LOGIN_URL)
     cls.login.login(config.USER_NAME, config.PASSWORD)
     cls.pim = EmployeeList(cls.driver)
     # cls.bps=BasePage(cls.driver)
     cls.pim.max_browser()
 def setUpClass(cls):
     cls.driver = utils.get_browser_driver(cls.browser)
     cls.login = Login(cls.driver)
     cls.login.open_browser(config.LOGIN_URL)
     cls.login.login(config.USER_NAME, config.PASSWORD)
     cls.employee_list = EmployeeList(cls.driver)
     cls.employee_list.add_employee(cls.first_name, cls.last_name)
     cls.tracker = Trackers(cls.driver)
Exemplo n.º 5
0
 def setUpClass(cls):
     """
      Login, create an employee, add entitlements and go to Assign leave entitlement page
      """
     cls.driver = utils.get_browser_driver(cls.browser)
     cls.login = Login(cls.driver)
     cls.login.open_browser(config.LOGIN_URL)
     cls.login.login(config.USER_NAME, config.PASSWORD)
     cls.employeelist = EmployeeList(cls.driver)
     cls.employeelist.delete_employee(cls.name)
     cls.employeelist.add_employee(cls.first_name, cls.last_name)
     cls.employeelist.find_employee(cls.name)
     cls.addleave = EmployeeEntitlements(cls.driver)
     cls.addleave.add_entitlement(cls.name, cls.leave_type_input,
                                  cls.period, cls.entitlement)
     cls.assignleave = AssignLeave(cls.driver)
Exemplo n.º 6
0
class TestAddEmployee(unittest.TestCase):
    """
    Test PIM Add Employee page functions
    """
    # Login
    login_url = config.LOGIN_URL
    username = config.USER_NAME
    passwd = config.PASSWORD
    browser = config.BROWSER

    # Create an employee
    first_name = "linda"
    middle_name = "test"
    last_name = "zang"
    upload_file = "1.png"
    login_name = "linda1"
    login_password = "******"
    confirm_password = "******"
    user_status = "Enabled"
    name = "linda zang"

    @classmethod
    def setUpClass(cls):
        cls.driver = utils.get_browser_driver(cls.browser)
        cls.login = Login(cls.driver)
        cls.login.open_browser(config.LOGIN_URL)
        cls.login.login(config.USER_NAME, config.PASSWORD)
        cls.addemployee = AddEmployee(cls.driver)

    def setUp(self):
        self.employee_list = EmployeeList(self.driver)
        self.employee_list.delete_employee(self.name)
        self.addemployee.go_back_to_add_employee()

    @classmethod
    def tearDownClass(cls):
        cls.addemployee.quit_browser()

    def test_case5_addemployee_without_login(
            self):  # Test Add Employee - Not create login details
        self.addemployee.input_employee_details(
            self.first_name, self.middle_name, self.last_name,
            self.upload_file)  # Input employee details
        self.employee_id = self.addemployee.get_employee_id_add_page(
        )  # Obtain employee id
        self.addemployee.save_employee()  # Save it and check save successfully
        self.addemployee.check_employee_details(
            self.first_name, self.middle_name, self.last_name,
            self.employee_id)  # Check employee details

    def test_case6_addemployee_with_login(
            self):  # Test Add Employee - create login details(enable status)
        self.addemployee.input_employee_details(
            self.first_name, self.middle_name, self.last_name,
            self.upload_file)  # Input employee details
        self.addemployee.input_login_details(
            self.login_name, self.login_password, self.confirm_password,
            self.user_status)  # Input login details
        self.employee_id = self.addemployee.get_employee_id_add_page(
        )  # Obtain employee id
        self.addemployee.save_employee()  # Save it and check save successfully
        self.addemployee.check_employee_details(
            self.first_name, self.middle_name, self.last_name,
            self.employee_id)  # Check employee details
        self.addemployee.log_out_btn()  # Logout
        self.login.login(
            self.login_name,
            self.login_password)  # Use new employee to login again
        self.login.check_login_status()  # Check Login successfully
Exemplo n.º 7
0
 def setUp(self):
     self.employee_list = EmployeeList(self.driver)
     self.employee_list.delete_employee(self.name)
     self.addemployee.go_back_to_add_employee()
Exemplo n.º 8
0
 def delete_employee(self, first_name, last_name):
     """
     Go to PIM, delete an employee
     """
     self.employeelist = EmployeeList(self.driver)
     self.employeelist.delete_employee(first_name + " " + last_name)
Exemplo n.º 9
0
class AddLeaveEntitlement(Leave):
    """
    Add leave entitlements and Employee Entitlements pages main components
    """
    employee_name = ("id", "entitlements_employee_empName")
    leave_type = ("id", "entitlements_leave_type")
    leave_period = ("id", "period")
    entitlement = ("id", "entitlements_entitlement")
    save_btn = ("id", "btnSave")
    cancel_btn = ("id", "btnCancel")
    search_btn = ("id", "searchBtn")
    multiple_employee_checkbox = ("id", "entitlements_filters_bulk_assign")
    location = ("id", "entitlements_filters_location")
    sub_unit = ("id", "entitlements_filters_subunit")
    confirm_btn = ("id", "dialogUpdateEntitlementConfirmBtn")
    match_btn = ("id", "dialogConfirmBtn")
    checkbox_all = ("id", "ohrmList_chkSelectAll")
    add_btn = ("id", "btnAdd")
    delete_btn = ("id", "btnDelete")
    dialog_ok_btn = ("id", "dialogDeleteBtn")

    cancel_confirm_btn = ("xpath", "//input[@value='Cancel']")
    search_title = ("xpath", "//h1[text()='Leave Entitlements']")
    no_result = ("xpath", "//td[text()='No Records Found']")
    add_title = ("xpath", "//h1[text()='Add Leave Entitlement']")
    match_title = ("xpath", "//h3[text()='OrangeHRM - Matching Employees']")
    confirm_title = ("xpath",
                     "//h3[text()='OrangeHRM - Confirmation Required']")

    search_table_element = "//div[@id='tableWrapper']/table/tbody/tr[1]"

    def __init__(self, browser):
        super(AddLeaveEntitlement, self).__init__(browser)

    def select_menu(self):
        """
        Go to Add Entitlements page
        """
        self.switch_main_menu("leave")
        self.click_menu("Entitlements")
        self.click_menu("Add Entitlements")
        self.sleep(2)
        Log.info("Arrive Add Entitlements page")

    def create_employee(self, first_name, last_name):
        """
        Go to PIM, create a new employee
        """
        self.addemployee = AddEmployee(self.driver)
        self.addemployee.add_user_employee(first_name, last_name)

    def delete_employee(self, first_name, last_name):
        """
        Go to PIM, delete an employee
        """
        self.employeelist = EmployeeList(self.driver)
        self.employeelist.delete_employee(first_name + " " + last_name)

    def modify_leave_period(self, start_month, start_date):
        """
        Go to Leave - Configure to modify leave period
        """
        self.leaveperiod = LeavePeriod(self.driver)
        self.leaveperiod.edit_LeavePeriod()
        self.leaveperiod.select_StartMonth(start_month)
        self.leaveperiod.select_StartDate(start_date)
        self.leaveperiod.save_LeavePeriod()

    def input_employee_name(self, name):
        """
        Input employee name
        """
        self.clear_text(self.employee_name)
        self.input_text(name, self.employee_name)
        self.press_enter_key(self.employee_name)
        self.sleep(1)

    def select_type_period(self, leave_type, period):
        """
        Select leave type,period and entitlement
        """
        self.set_combox_value(leave_type, self.leave_type)
        self.set_combox_value(period, self.leave_period)

    def input_entitlement(self, entitlement):
        """
        Input entitlement
        """
        self.clear_text(self.entitlement)
        self.input_text(entitlement, self.entitlement)

    def save(self):
        """
        Click save button and confirm if updating dialog pops up
        """
        self.click(self.save_btn)
        self.sleep(3)
        assert self.element_is_displayed(self.search_title)
        Log.info("Save the new leave successfully")

    def cancel(self):
        """
        Click cancel button
        """
        self.click(self.cancel_btn)
        self.sleep(3)
        assert self.element_is_displayed(self.search_title)
        Log.info("Cancel to add new leave")

    def save_and_match(self):
        """
        Click save button and confirm on matching dialog
        """
        self.click(self.save_btn)
        self.sleep(3)

        self.wait_unit_el_present(self.match_title)
        self.click(self.match_btn)
        assert self.element_is_displayed(self.search_title)
        Log.info("Save the new leave for multiple employees successfully")

    def click_search_btn(self):
        """
        Click search button
        """
        self.click(self.search_btn)
        self.sleep(3)

    def click_multiple_employee(self):
        """
        Click add to multiple employees button
        """
        self.click(self.multiple_employee_checkbox)
        assert self.element_is_displayed(self.location)
        assert self.element_is_displayed(self.sub_unit)

    def input_location_unit(self, location, unit):
        """
        Input location and sub unit information
        """
        self.set_combox_value(location, self.location)
        self.set_combox_value(unit, self.sub_unit)

    def verify_no_record(self):
        """
        Verify no record in search table
        """
        assert self.element_is_displayed(self.no_result)
        Log.info("No new leave is added")

    def verify_new_leave(self, leave_period, entitlement):
        """
        Verify search table result for leave type not All
        """
        assert "Added" == self.get_element_text(
            ("xpath", self.search_table_element + "/td[2]")).encode("utf-8")
        assert leave_period.split(" - ")[0] == \
               self.get_element_text(("xpath", self.search_table_element + "/td[3]")).encode("utf-8")
        assert leave_period.split(" - ")[1] == \
               self.get_element_text(("xpath", self.search_table_element + "/td[4]")).encode("utf-8")
        assert '{:.2f}'.format(float(entitlement)) == \
               self.get_element_text(("xpath", self.search_table_element + "/td[5]")).encode("utf-8")
        Log.info("Add new leave entitlement successfully")

    def click_add_btn(self):
        """
        Click Add button to switch to Add Entitlements page
        """
        self.click(self.add_btn)
        self.wait_unit_el_present(self.add_title)

    def delete_leave_cancel(self):
        """
        Find record in table, delete then cancel
        """
        self.click(self.checkbox_all)
        self.click(self.delete_btn)
        self.wait_unit_el_present(self.confirm_title)
        self.click(self.cancel_confirm_btn)
        self.wait_unit_el_present(self.search_title)
        Log.info("Cancel to delete leave entitlements")

    def delete_all_leave(self):
        """
        Find all records in table and delete
        """
        self.click(self.checkbox_all)
        self.click(self.delete_btn)
        self.wait_unit_el_present(self.confirm_title)
        self.click(self.dialog_ok_btn)
        Log.info("Delete leave entitlements successfully")
Exemplo n.º 10
0
class AssignLeave(Leave):
    """
    Assign leave page main components
    """
    employee_name = ("id", "assignleave_txtEmployee_empName")
    leave_type = ("id", "assignleave_txtLeaveType")
    leave_blance = ("id", "assignleave_leaveBalance")
    view_detail = ("id", "leaveBalance_details_link")
    from_date = ("id", "assignleave_txtFromDate")
    to_date = ("id", "assignleave_txtToDate")
    partial_days = ("id", "assignleave_partialDays")
    duration = ("id", "assignleave_duration_duration")
    first_duration = ("id", "assignleave_firstDuration_duration")
    time_from = ("id", "assignleave_firstDuration_time_from")
    time_to = ("id", "assignleave_firstDuration_time_to")
    comment = ("id", "assignleave_txtComment")
    assign_btn = ("id", "assignBtn")
    popup_employee_name = ("id", "popup_emp_name")
    popup_leave_type = ("id", "popup_leave_type")
    blance_day = ("id", "balance_as_of")
    scheduled_day = ("id", "balance_scheduled")
    balance_total = ("id", "balance_total")
    confirm_btn = ("id", "confirmOkButton")
    multiperiod_employee = ("id", "multiperiod_emp_name")
    multiperiod_type = ("id", "multiperiod_leave_type")

    view_detail_xpath = ("xpath","//a[@id='leaveBalance_details_link']")
    partial_days_xpath = ("xpath", "//select[@id='assignleave_partialDays']")
    confirm_title = ("xpath", "//h3[text()='OrangeHRM - Confirm Leave Assignment']")
    details_OK_btn = ("xpath", "//div[@id='balance_details']/div[3]/input[@id='closeButton']")
    multiperiod_OK_btn = ("xpath", "//div[@id='multiperiod_balance']/div[3]/input[@id='closeButton']")
    overlapping_title = ("xpath","//h1[text()='Overlapping Leave Request Found']")

    overlapping_table_xpath = "//div[@class='inner']/table/tbody/tr[1]"
    leave_date_xpath = "//div[@id='multiperiod_balance']/div[@class='modal-body']/table/tbody"

    def __init__(self, browser):
        super(AssignLeave, self).__init__(browser)

    def select_menu(self):
        """
        Go to Assign Leave page
        """
        self.switch_main_menu("leave")
        self.click_menu("Assign Leave")
        Log.info("Arrive Assign Leave page")

    def create_employee(self, first_name, last_name):
        """
        Go to PIM, create a new employee
        """
        self.addemployee = AddEmployee(self.driver)
        self.addemployee.add_user_employee(first_name, last_name)

    def delete_employee(self, first_name, last_name):
        """
        Go to PIM, delete an employee
        """
        self.employeelist = EmployeeList(self.driver)
        self.employeelist.delete_employee(first_name + " " + last_name)

    def select_name_type(self, name, leave_type):
        """
        Select Employee Name and Leave Type
        """
        self.clear_text(self.employee_name)
        self.input_text(name,self.employee_name)
        self.press_enter_key(self.employee_name)
        self.set_combox_value(leave_type, self.leave_type)
        self.wait_unit_el_present(self.view_detail_xpath)

    def input_samedate_duration_comment(self, date, duration, comment):
        """
        Input From Date, To Date, Duration and comment
        """
        self.clear_text(self.from_date)
        self.input_text(date, self.from_date)
        self.press_enter_key(self.from_date)
        self.clear_text(self.to_date)
        self.input_text(date, self.to_date)
        self.press_enter_key(self.to_date)
        self.set_combox_value(duration, self.duration)
        self.input_text(comment, self.comment)
        self.sleep(2)

    def input_multiperiod_partial(self, datefrom, dateto, partialdays):
        """
        Input From Date, To Date and partial days
        """
        self.clear_text(self.from_date)
        self.input_text(datefrom, self.from_date)
        self.press_enter_key(self.from_date)
        self.clear_text(self.to_date)
        self.input_text(dateto, self.to_date)
        self.press_enter_key(self.to_date)
        self.wait_unit_el_present(self.partial_days_xpath)
        self.set_combox_value(partialdays, self.partial_days)

    def input_duration_time_comment(self, duration, timefrom, timeto, comment):
        """
        Input duration, time and comment
        """
        self.set_combox_value(duration, self.first_duration)
        self.set_combox_value(timefrom, self.time_from)
        self.set_combox_value(timeto, self.time_to)
        self.input_text(comment, self.comment)
        self.sleep(2)

    def assign(self):
        """
        Assign and confirm if confirm dialog pops up
        """
        self.click(self.assign_btn)
        element = self.get_element(self.confirm_title)
        if element.is_displayed():
            self.click(self.confirm_btn)

        self.wait_unit_el_present(self.view_detail_xpath)
        Log.info("Assign new leave")

    def verify_balance_samedate(self, employee, leave_type, date):
        """
        Open view details and verify leave balance for same date set
        """
        self.click(self.view_detail)
        self.wait_unit_el_present(self.details_OK_btn)

        assert employee == self.get_element_text(self.popup_employee_name).encode("utf-8")
        assert leave_type == self.get_element_text(self.popup_leave_type).encode("utf-8")
        assert date == self.get_element_text(self.blance_day).encode("utf-8")
        assert "-1.00" == self.get_element_text(self.balance_total).encode("utf-8")
        assert self.get_element_text(self.leave_blance)[:5] == \
               self.get_element_text(self.balance_total).encode("utf-8")
        self.click(self.details_OK_btn)
        self.sleep(1)
        Log.info("Assign leave for same date successfully")

    def verify_balance_multiperiod(self, employee, leave_type, datefrom, dateto):
        """
        Open view details and verify leave balance for different date set
        """
        assert "Balance not sufficient" == self.get_element_text(self.view_detail)
        self.click(self.view_detail)
        self.wait_unit_el_present(self.multiperiod_OK_btn)

        assert employee == self.get_element_text(self.multiperiod_employee).encode("utf-8")
        assert leave_type == self.get_element_text(self.multiperiod_type).encode("utf-8")
        assert datefrom == self.get_element_text(("xpath", self.leave_date_xpath + "/tr[1]/td[3]")).encode("utf-8")
        assert dateto == self.get_element_text(("xpath", self.leave_date_xpath + "/tr[2]/td[3]")).encode("utf-8")
        assert "-3.00" == self.get_element_text(self.leave_blance)[:5]
        assert self.get_element_text(self.leave_blance)[:5] == \
               self.get_element_text(("xpath", self.leave_date_xpath + "/tr[1]/td[2]")).encode("utf-8")
        self.sleep(1)
        self.click(self.multiperiod_OK_btn)
        Log.info("Assign leave for different date successfully")

    def check_overlapping(self, date, leave_type):
        """
        Verify overlapping
        """
        assert self.get_element(self.overlapping_title).is_displayed()
        assert "-1.00" == self.get_element_text(self.leave_blance)[:5]
        assert date == self.get_element_text(("xpath", self.overlapping_table_xpath+ "/td[1]")).encode("utf-8")
        assert leave_type == self.get_element_text(("xpath",
                                                    self.overlapping_table_xpath + "/td[3]")).encode("utf-8")
        Log.info("Overlapping is correct")
Exemplo n.º 11
0
 def delete_employee(self, employee):
     self.employeelist = EmployeeList(self.driver)
     self.employeelist.delete_employee(employee)
Exemplo n.º 12
0
class Salary(EmployeeList):
    # search_emp = ("ID", "empsearch_employee_name_empName")
    # include = ("id","empsearch_termination")
    # search_btn = ('id', 'searchBtn')

    add_btn = ('id', 'addSalary')
    success_flag = ('xpath', '//h1[text()="Assigned Salary Components"]')
    no_record_flag = ('xpath', "//*[@id='tblSalary']//td[text() = 'No Records Found']")

    pay_grade = ('id', 'salary_sal_grd_code')
    salary_component = ('id', 'salary_salary_component')
    pay_frequency = ('id', 'salary_payperiod_code')
    currency = ('id', 'salary_currency_id')
    amount = ('id', 'salary_basic_salary')
    save_btn = ('id', 'btnSalarySave')
    cancel_btn = ('id', 'btnSalaryCancel')

    add_attachment_btn = ('id', 'btnAddAttachment')
    file_path = ('id', 'ufile')
    upload_btn = ('id', 'btnSaveAttachment')
    file_name = ('xpath', '//a[normalize-space(text())="salary.txt"]')

    delete_btn = ('id', 'delSalary')
    message = ('xpath', "//div[contains(@class,'success')]")

    salary_list = ('xpath', "//*[@id='tblSalary']")

    add_deposit_detail = ('id', 'salary_set_direct_debit')
    account_num = ('id', 'directdeposit_account')
    account_type = ('id', 'directdeposit_account_type')
    routing_num = ('id', 'directdeposit_routing_num')
    ramount = ('id', 'directdeposit_amount')
    other_name = ('id', "directdeposit_account_type_other")

    deposit_flag = ('xpath', "//*[@id='tblSalary']//h3[text()= 'Direct Deposit Details']")
    v_anum = ('xpath', "//table[@id='tblSalary']//table")

    list = []

    def __init__(self, browser):
        super(Salary, self).__init__(browser)
        self.click_menu("Employee List")
        Log.info("Arrive Employee list page")

    # def get_emp_record(self, name):
    #     self.clear_text(self.search_emp)
    #     self.input_text(name, self.search_emp)
    #     self.click(self.search_btn)
    #     self.wait(2)
    #     fname = name.split()[0]
    #     lname = name.split()[1]
    #     search_name = ('link_text', str(fname))
    #     self.click(search_name)

    def open_salary_page_via_creating_emp(self, fname, lname):
        self.add_employee(fname, lname)
        self.switch_employee_detail_page("Salary")
        page_ele = self.get_element(self.success_flag)
        if page_ele is not None:
            Log.info("Arrive salary page!")

    def search_emp_salary(self, fname, lname):
        self.query_employee_by_name(fname + ' ' + lname)
        self.click_employee_to_edit(fname, lname)
        self.switch_employee_detail_page("Salary")
        page_ele = self.get_element(self.success_flag)
        if page_ele is not None:
            Log.info("Arrive salary page!")

    def assign_salary(self, grade, component, frequency, currency, amount):
        # self.get_emp_record(name)
        # self.check_salary_page()
        self.click(self.add_btn)
        self.set_combox_value(grade, self.pay_grade)
        self.input_text(component, self.salary_component)
        self.set_combox_value(frequency, self.pay_frequency)
        self.wait_unit_el_present(self.currency)
        self.set_combox_value(currency, self.currency)
        self.input_text(amount, self.amount)
        self.click(self.save_btn)
        self.get_element_text(self.message)
        Log.info("Add record successfully!")

    def cancel_assgin_salary(self):
        self.click(self.add_btn)
        self.click(self.cancel_btn)

    def get_result_list(self):
        Log.info("Verify search result!")
        table = self.get_element(self.salary_list)
        table_rows = table.find_elements_by_tag_name("tr")
        Log.info("Total Rows: %d" % len(table_rows))
        return table_rows

    def verify_cancel(self):
        result1 = self.get_result_list()
        self.cancel_assgin_salary()
        result2 = self.get_result_list()
        if result1 == result2:
            Log.info("cancel successfully")
        else:
            Log.info("cancel fail!")

    def edit_salary(self, component, amount, num, dtype, rout, ramount,*args):
        search_name = ('link_text', str(component))
        self.click(search_name)
        self.clear_text(self.amount)
        self.input_text(amount, self.amount)
        self.click(self.add_deposit_detail)
        self.input_text(num, self.account_num)
        self.set_combox_value(dtype, self.account_type)
        if dtype == "Other":
            self.input_text(args, self.other_name)
        self.input_text(rout, self.routing_num)
        self.input_text(ramount, self.ramount)
        self.wait(2)
        self.click(self.save_btn)
        self.wait_unit_el_present(self.message)

    def show_direct_deposit(self, name):
        show_flag = (
            "xpath", "//*[@id='tblSalary']//tbody/tr[./td[2]//a[text() ='" + str(name) + "']]/td[7]/input[1]")
        self.click(show_flag)
        self.wait_unit_el_present(self.deposit_flag)
        detail_title = self.get_element(self.deposit_flag)
        if detail_title is not None:
            Log.info("Show detail direct deposit")

    def verify_deposit_detail(self):
        tabel = self.get_element(self.v_anum)
        rows = tabel.find_elements_by_tag_name("tr")
        r1 = rows[1].find_elements_by_tag_name("td")
        for i in r1:
            self.list.append(i.text.encode("utf-8"))
        self.list[-1] = float(self.list[-1])

    def delete_salary(self, name):
        delete_checkbox = (
            "xpath", "//*[@id='tblSalary']/tbody/tr[./td[2]//a[text() ='" + str(name) + "']]/td[1]")
        self.click(delete_checkbox)
        self.click(self.delete_btn)

    def add_attachment(self):
        self.click(self.add_attachment_btn)
        self.upload_file("salary.txt", self.file_path)
        self.click(self.upload_btn)

    def verify_attachment(self):
        name = self.get_element(self.file_name)
        if name is not None:
            Log.info("upload file success!")

    def delete_employee(self, employee):
        self.employeelist = EmployeeList(self.driver)
        self.employeelist.delete_employee(employee)
Exemplo n.º 13
0
 def add_employee(self, first_name, last_name):
     self.employeelist = EmployeeList(self.driver)
     self.employeelist.add_employee(first_name, last_name)
Exemplo n.º 14
0
class Reportto(EmployeeList):
    """
    PIM Add employee page main components
    """
    success_flag = ('xpath', '//h1[text()="Assigned Supervisors"]')
    no_record_flag = ('xpath', "//td[text() = 'No Records Found']")

    add_supervisor_btn = ('id', 'btnAddSupervisorDetail')
    delete_supervisor_btn = ('id', "delSupBtn")
    supervisor_name = ('id', "reportto_supervisorName_empName")
    report_method = ('id', 'reportto_reportingMethodType')
    save_btn = ('id', 'btnSaveReportTo')
    cancel_btn = ('id', "btnCancel")
    act_rep_method = "//a[text()='{}']/../../td[3]"
    delete_checkbox = "//a[text()='{}']/../../td[1]"

    check_box = "//a[text()='{}']/../../td[1]"

    message = ('xpath', "//div[contains(@class,'success')]")

    add_subordinate_btn = ('id', "btnAddSubordinateDetail")
    delete_subordinate_btn = ('id', "delSubBtn")
    subordinate_name = ('id', "reportto_subordinateName_empName")
    specify = ('id', "reportto_reportingMethod")

    add_attachment_btn = ('id', 'btnAddAttachment')
    delete_attachment_btn = ('id', 'btnDeleteAttachment')
    file_path = ('id', 'ufile')
    upload_btn = ('id', 'btnSaveAttachment')
    file_name = "//a[normalize-space(text())='{}']"
    delete_attachment_checkbox = "//a[normalize-space(text())='{}']/../preceding-sibling::td"

    def __init__(self, browser):
        super(Reportto, self).__init__(browser)
        self.click_menu("Employee List")
        Log.info("Arrive Employee list page")

    def open_report_page_via_creating_emp(self):
        # self.add_employee(fname, lname)
        self.switch_employee_detail_page("Report-to")
        page_ele = self.get_element(self.success_flag)
        if page_ele is not None:
            Log.info("Arrive report-to page!")

    def search_emp_report(self, fname, lname):
        self.query_employee_by_name(fname + ' ' + lname)
        self.click_employee_to_edit(fname, lname)
        self.switch_employee_detail_page("Report-to")
        page_ele = self.get_element(self.success_flag)
        if page_ele is not None:
            Log.info("Arrive report-to page!")

    def add_assigned_supervisors(self, name, method):
        self.click(self.add_supervisor_btn)
        self.input_text(name, self.supervisor_name)
        self.set_combox_value(method, self.report_method)
        self.click(self.save_btn)
        Log.info("Add assigned supervisors successfully!")

    def cancel_add_supervisors(self, name):
        self.click(self.add_supervisor_btn)
        self.input_text(name, self.supervisor_name)
        self.wait(2)
        self.click(self.cancel_btn)
        Log.info("Cancel add assigned supervisors!")

    def edit_added_supervisors(self, name, method, *args):
        self.click(('link_text', name))
        self.wait(2)
        self.set_combox_value(method, self.report_method)
        if method == "Other":
            self.input_text(args, self.specify)
        self.click(self.save_btn)
        Log.info("Edit added record!")

    def verify_edit_actual_result(self, name, method, *args):
        act_value = self.act_rep_method.format(name)
        ielement = ('XPATH', act_value)
        act_result = self.get_element_text(ielement)
        if method == "Other":
            assert str(act_result) == args[0]
        else:
            assert str(act_result) == method
        Log.info(
            "Edited report method, actual result is equal to expected result.")

    def delete_supervisor(self, name):
        act_value = self.delete_checkbox.format(name)
        ielement = ('XPATH', act_value)
        self.click(ielement)
        self.click(self.delete_supervisor_btn)
        Log.info("Delete added supervisor!")

    def add_subordinates(self, name, method):
        self.click(self.add_subordinate_btn)
        self.input_text(name, self.subordinate_name)
        self.set_combox_value(method, self.report_method)
        self.click(self.save_btn)
        Log.info("Add subordinates successfully!")

    def cancel_add_subordinates(self, name):
        self.click(self.add_subordinate_btn)
        self.input_text(name, self.subordinate_name)
        self.click(self.cancel_btn)
        Log.info("Cancel add subordinate!")

    def edit_added_subordinates(self, name, method, *args):
        self.click(('link_text', name))
        self.wait(2)
        self.set_combox_value(method, self.report_method)
        if method == "Other":
            self.input_text(args, self.specify)
        self.click(self.save_btn)
        Log.info("Edit added subordinate!")

    def delete_subordinates(self, name):
        act_value = self.delete_checkbox.format(name)
        ielement = ('XPATH', act_value)
        self.click(ielement)
        self.click(self.delete_subordinate_btn)
        Log.info("Delete added subordinate!")

    def add_attachment(self, document):
        self.click(self.add_attachment_btn)
        self.upload_file(document, self.file_path)
        self.click(self.upload_btn)
        Log.info("Add attachment for report-to successfully!")

    def verify_attachment(self, document):
        attachment = self.file_name.format(document)
        name = self.get_element(('xpath', attachment))
        if name is not None:
            Log.info("upload file success!")
        else:
            Log.info("uploaded file is not existed!")

    def delete_attachment(self, document):
        attachment = self.delete_attachment_checkbox.format(document)
        self.click(('xpath', attachment))
        self.click(self.delete_attachment_btn)
        Log.info("The attachment is deleted.")

    def add_employee(self, first_name, last_name):
        self.employeelist = EmployeeList(self.driver)
        self.employeelist.add_employee(first_name, last_name)

    def delete_employee(self, employee):
        self.employeelist = EmployeeList(self.driver)
        self.employeelist.delete_employee(employee)

    def delete_report_method(self, name):
        self.repmethod = Report_method(self.driver)
        self.repmethod.delete_report_method(name)

    def add_report_method(self):
        self.repmethod = Report_method(self.driver)
        self.repmethod.search_method('Direct', 'Indirect')