背景
近期有了解DrissionPage相关内容,并基于公司计算奋斗值的要求下,编辑一版自用的奋斗值计算流程。
代码
初版代码,有一些冗余的变量和逻辑没有删除
from DrissionPage import ChromiumPage
import datetime
import calendar
import chinese_calendar as cc
import time
startTime = time.time()
today = datetime.date.today()
year = today.year
month = today.month
_, daysInMonth = calendar.monthrange(year, month)
timeSortList = []
firstDay = datetime.datetime(year, month, 1)
lastDay = firstDay + datetime.timedelta(days=daysInMonth - 1)
userName = input("请输入用户名:")
userPassword = input("请输入密码:")
page = ChromiumPage()
page.get('website')
page.ele('xpath:/html/body/div[2]/div/div[2]/div[2]/ul/li[3]/div/input[1]').input(userName)
page.ele('xpath:/html/body/div[2]/div/div[2]/div[2]/ul/li[4]/input').input(userPassword)
page.ele('xpath:/html/body/div[2]/div/div[2]/div[2]/div[1]/input').click()
page.wait.eles_loaded('xpath:/html/body/div[4]/div/div[1]/div[2]/div[2]/div/div[2]/div/div[5]/a/div')
page.ele('xpath:/html/body/div[4]/div/div[1]/div[2]/div[2]/div/div[2]/div/div[4]/a/div').click()
page.wait(1)
# 获取打卡数据
tbodyAll = page.ele('xpath:/html/body/div[4]/div/div[2]/div[2]/div/div/div/div/div[2]/div/div[1]/div/div[3]/table/tbody')
goToWorkTime, goOffWorkTime = '', ''
timeFormat = "%H:%M"
workTime = []
timeList = tbodyAll.texts()
# 获取公出数据
page.ele('xpath:/html/body/div[4]/div/div[2]/div[2]/div/div/div/div/div[2]/ul/li[4]/a').click()
page.wait(0.8)
page.ele('xpath:/html/body/div[4]/div/div[2]/div[2]/div/div/div/div/div[1]/div/div[1]/div/span[10]/span/span[2]').click()
page.wait(0.8)
page.ele('xpath:/html/body/div[13]/div/div[2]/ul/li[3]/span').click()
tbody = page.ele('xpath:/html/body/div[4]/div/div[2]/div[2]/div/div/div/div/div[2]/div/div[4]/div/div[3]/table/tbody')
businessTrip = []
for i in range(len(tbody.texts())):
temp = tbody.texts()[i].split('\t')
if temp[2] == '本地公出':
timeSortList.append(temp[3])
timeSortList.append(temp[4])
elif temp[2] == '国内出差(给差补)':
if datetime.datetime.strptime(temp[3][:10], '%Y-%m-%d') <= firstDay:
businessTrip.append(datetime.datetime(year, month, 1, 8, 30).strftime('%Y-%m-%d %H:%M'))
else:
businessTrip.append(temp[3])
if datetime.datetime.strptime(temp[4][:10], '%Y-%m-%d') >= lastDay:
businessTrip.append(datetime.datetime(year, month, daysInMonth, 17, 30).strftime('%Y-%m-%d %H:%M'))
else:
businessTrip.append(temp[4])
# print(businessTrip)
page.wait(1)
# 获取加班数据
page.ele('xpath:/html/body/div[4]/div/div[2]/div[2]/div/div/div/div/div[2]/ul/li[7]/a').click()
page.wait(0.8)
tbody = page.ele('xpath:/html/body/div[4]/div/div[2]/div[2]/div/div/div/div/div[2]/div/div[7]/div/div[3]/table/tbody')
for i in range(len(tbody.texts())):
temp = tbody.texts()[i].split('\t')
timeSortList.append(temp[5])
timeSortList.append(temp[6])
# 获取请假数据
page.ele('xpath:/html/body/div[4]/div/div[2]/div[2]/div/div/div/div/div[2]/ul/li[2]/a').click()
page.wait(0.8)
tbody = page.ele('xpath:/html/body/div[4]/div/div[2]/div[2]/div/div/div/div/div[2]/div/div[2]/div/div[3]/table/tbody')
holidayInt = 0
holidayList = []
for i in range(len(tbody.texts())):
temp = tbody.texts()[i].split('\t')
if temp[3] == '年假':
holidayInt += 1
elif temp[3] == '事假' or temp[3] == '调休':
holidayList.append(temp[6])
if '8:30' in temp[4]:
timeSortList.append(temp[4])
if '17:30' in temp[5]:
timeSortList.append(temp[5])
for i in range(len(timeList)):
timeSortList.append(timeList[i].split('\t')[12])
page.ele('xpath:/html/body/div[3]/div/div/div[4]/div/ul/li[9]/a').hover()
page.wait(0.5)
page.ele('xpath:/html/body/div[3]/div/div/div[4]/div/ul/li[9]/ul/li[2]/a[5]').click()
page.wait(0.8)
page.ele('xpath:/html/body/div[19]/div[2]/div/input[1]').click()
page.quit()
def CompareTime(list):
return sorted(list, key=lambda x: datetime.datetime.strptime(x, '%Y-%m-%d %H:%M'))
timeSortList = list(set(timeSortList))
timeSortList = CompareTime(timeSortList)
tempFormat = '%Y-%m-%d'
for i in range(0, len(businessTrip), 2):
tempList = []
for j in range(len(timeSortList)):
if datetime.datetime.strptime(businessTrip[i][:10], tempFormat) <= datetime.datetime.strptime(timeSortList[j][:10], tempFormat) <= datetime.datetime.strptime(businessTrip[i + 1][:10], tempFormat):
tempList.append(timeSortList[j])
for j in range(len(tempList)):
timeSortList.remove(tempList[j])
for j in range(daysInMonth):
dayOfMonth = datetime.date(year, month, j + 1)
if dayOfMonth == datetime.date.today():
break
for i in range(len(timeSortList)):
temp = timeSortList[i]
# print(temp)
_, week, weekday = dayOfMonth.isocalendar()
if str(dayOfMonth) in temp:
if goToWorkTime == '':
goToWorkTime = temp[11:]
elif goToWorkTime != '' and goOffWorkTime == '':
goOffWorkTime = temp[11:]
elif goToWorkTime != '' and goOffWorkTime != '':
if datetime.datetime.strptime(goOffWorkTime, timeFormat) < datetime.datetime.strptime(temp[11:], timeFormat):
goOffWorkTime = temp[11:]
if i == len(timeSortList) - 1:
if goToWorkTime == '' or goOffWorkTime == '':
goToWorkTime, goOffWorkTime = '', ''
break
seconds = (datetime.datetime.strptime(goOffWorkTime, timeFormat) - datetime.datetime.strptime(goToWorkTime, timeFormat)).total_seconds()
if cc.is_workday(dayOfMonth):
if seconds < 32400:
goToWorkTime, goOffWorkTime = '', ''
timeSortList = timeSortList[i:]
break
seconds -= 32400
workTime.append(round(seconds / 3600, 2))
timeSortList = timeSortList[i:]
goToWorkTime, goOffWorkTime = '', ''
break
else:
if datetime.datetime.strptime(temp[0:10], '%Y-%m-%d').date() < dayOfMonth:
continue
else:
if goToWorkTime == '' or goOffWorkTime == '':
goToWorkTime, goOffWorkTime = '', ''
break
seconds = (datetime.datetime.strptime(goOffWorkTime, timeFormat) - datetime.datetime.strptime(goToWorkTime, timeFormat)).total_seconds()
if cc.is_workday(dayOfMonth):
if seconds < 32400:
goToWorkTime, goOffWorkTime = '', ''
timeSortList = timeSortList[i:]
break
seconds -= 32400
workTime.append(round(seconds / 3600, 2))
timeSortList = timeSortList[i:]
goToWorkTime, goOffWorkTime = '', ''
break
timeFormat = "%Y-%m-%d %H:%M"
for i in range(0, len(businessTrip), 2):
seconds = (datetime.datetime.strptime(businessTrip[i + 1], timeFormat) - datetime.datetime.strptime(businessTrip[i], timeFormat)).total_seconds()
seconds -= 9 * 3600
count = int((round(seconds / 3600, 2)) / 24)
if count == 0 and not (cc.is_workday(datetime.datetime.strptime(businessTrip[i][:10], tempFormat))):
workTime.append(8)
elif count != 0:
for m in range((datetime.datetime.strptime(businessTrip[i + 1][:10], tempFormat) - datetime.datetime.strptime(businessTrip[i][:10], tempFormat)).days + 1):
if not cc.is_workday(datetime.datetime.strptime(businessTrip[i][:10], tempFormat) + datetime.timedelta(days=m)):
workTime.append(8)
workTime.append(1.6 * (count + 1))
print(workTime)
print(round(sum(workTime) - sum(float(item) for item in holidayList), 2))
endTime = time.time()
print(f"流程耗费的时间:{round((endTime - startTime), 2)} 秒")