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)
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)
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)
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
def setUp(self): self.employee_list = EmployeeList(self.driver) self.employee_list.delete_employee(self.name) self.addemployee.go_back_to_add_employee()
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)
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")
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")
def delete_employee(self, employee): self.employeelist = EmployeeList(self.driver) self.employeelist.delete_employee(employee)
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)
def add_employee(self, first_name, last_name): self.employeelist = EmployeeList(self.driver) self.employeelist.add_employee(first_name, last_name)
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')