1、需求说明
根据查询条件日历选择需要填写的具体日期,展开每个人员,填报人员的每日上午、下午办公情况以及客户结算方式,并保存。
脚本简单,关键在于分析页面元素,寻找其中的规律。
2、代码实现
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
def search():
browser = webdriver.Chrome()
url = r'https:地址'
browser.get(url)
browser.maximize_window()
browser.implicitly_wait(10)
browser.find_element(By.XPATH, '//*[@id="username"]').send_keys('用户名')
browser.find_element(By.XPATH, '//*[@id="password"]').send_keys('密码')
browser.find_element(By.XPATH, '//*[@id="btn_login"]').click() # 登录
time.sleep(1)
browser.find_element(By.ID, 'menu_MAINDIR1524929854187').click()
time.sleep(1)
browser.find_element(By.XPATH, '//*[@id="hrdAttendanceReportManagement"]/div').click()
time.sleep(5)
browser.switch_to.frame('module_hrdAttendanceReportManagement') # frame切换
time.sleep(1)
browser.find_element(By.CSS_SELECTOR, 'input#statisticDateCostSharing').click() # 点击日历
time.sleep(1)
# 日历的起止日期选择,根据实际情况重新定位
browser.find_element(By.XPATH, '/html/body/div[5]/div[1]/div[2]/table/tbody/tr[1]/td[7]').click()
browser.find_element(By.XPATH, '/html/body/div[5]/div[1]/div[2]/table/tbody/tr[2]/td[7]').click()
time.sleep(1)
browser.find_element(By.XPATH, '/html/body/div[5]/div[3]/div/button[1]').click() # 日期选择确认按钮
time.sleep(1)
browser.find_element(By.XPATH, '//*[@id="select2-departmentTypeOrCustomer-container"]/span').click() # 部门
time.sleep(1)
browser.find_element(By.XPATH, '//*[@id="select2-departmentTypeOrCustomer-results"]/li[21]').click()
time.sleep(2)
browser.find_element(By.XPATH, '//*[@id="select2-resourcePoolAndProjectTeamQuery-container"]/span').click() # 项目组
time.sleep(1)
browser.find_element(By.XPATH, '//*[@id="select2-resourcePoolAndProjectTeamQuery-results"]/li[1]').click()
browser.find_element(By.XPATH,
'/html/body/section/div/div/div/div[2]/div[1]/div/div[6]/span/button').click() # 查询按钮
time.sleep(15)
n = 1
for i in range(1, 21, 2): # 遍历人员,序号为1、3、5、7、9、11、13、15、17、19,每页10条数据(可以添加分页操作)
f_id = '//*[@id="hrdStaffTable"]/tbody/tr[' + str(i) + ']/td[3]'
f_name = '//*[@id="hrdStaffTable"]/tbody/tr[' + str(i) + ']/td[4]' # 人员姓名,打印检查
s_button = '//*[@id="hrdStaffTable"]/tbody/tr[' + str(i) + ']/td[14]/button' # 保存按钮
browser.find_element(By.XPATH, f_id).click() # 点击符号+展开
time.sleep(1)
for j in range(5, 8): # 遍历日期,参数为具体需要选择的日期,5月5日-5月8日
selamid = 'signInStatus_2022/05/0' + str(j) + '_11218_1559_是_否_否_否'
selam_balance_id = 'signInCustomerSettlement_2022/05/0' + str(j) + '_11218_1559_是_否_否_否'
selpmid = 'signOutStatus_2022/05/0' + str(j) + '_11218_1559_是_否_否_否'
selpm_balance_id = 'signOutCustomerSettlement_2022/05/0' + str(j) + '_11218_1559_是_否_否_否'
selam = Select(browser.find_element(By.ID, selamid)) # 上午
selam.select_by_value('在家办公')
selam_balance = Select(browser.find_element(By.ID, selam_balance_id))
selam_balance.select_by_value('全额结算')
selpm = Select(browser.find_element(By.ID, selpmid)) # 下午
selpm.select_by_value('在家办公')
selpm_balance = Select(browser.find_element(By.ID, selpm_balance_id))
selpm_balance.select_by_value('全额结算')
browser.find_element(By.XPATH, s_button).click() # 保存按钮
time.sleep(1)
browser.find_element(By.XPATH, '/html/body/div[6]/div[2]/div/div/div/div/div[4]/button[1]').click()
time.sleep(1)
browser.find_element(By.XPATH, '/html/body/div[6]/div[2]/div/div/div/div/div[4]/button').click()
time.sleep(2)
f_name = browser.find_element(By.XPATH, f_name).text
print(f'{n} {f_name} 维护完成')
n += 1
time.sleep(3)
if __name__ == '__main__':
search()



