导出ERP本月的考勤记录

  1 from selenium import webdriver
  2 from selenium.webdriver.common.by import By
  3 import time
  4
  5 time_start=time.time()
  6
  7
  8 #default setting of firefox
  9 import os
 10 fp = webdriver.FirefoxProfile()
 11 fp.set_preference("browser.download.folderList",0)#0代表下载到浏览器默认下载路径
 12 fp.set_preference("browser.download.manager.showhenStarting",False)
 13 fp.set_preference("browser.download.dir",os.getcwd())
 14 fp.set_preference("browser.helperApps.neverAsk.saveToDisk","application/vnd.ms-excel")#下载文件类型
 15
 16
 17 driver = webdriver.Firefox(firefox_profile = fp)
 18
 19
 20 #login
 21 driver.get(‘http://xxxxxxxx/login‘)
 22 driver.find_element(By.ID, "txtUserID").send_keys("xxxx")
 23 driver.find_element(By.ID, "txtPwd").send_keys("xxxx")
 24 driver.find_element(By.ID, "submit_btn").click()
 25
 26
 27 #open aim tab
 28 import time
 29 driver.find_element(By.CSS_SELECTOR, ".panel:nth-child(3) .panel-title").click()
 30
 31
 32 from selenium.webdriver.support.wait import WebDriverWait
 33 from selenium.webdriver.support import expected_conditions as EC
 34 def shortSleep(aimLocator):
 35     WebDriverWait(driver, 10, 0.1).until(EC.presence_of_element_located(aimLocator))
 36
 37
 38 def fakeSleep(func,*args,timeout = 3,tik = 0.1):
 39     import time
 40     time_start=time.time()
 41     while timeout>0:
 42         time.sleep(tik)
 43         try:
 44             func(*args)
 45             timeout = 0
 46         except:
 47             pass
 48     time_end = time.time()
 49     print(‘time cost‘,round(time_end-time_start,2),‘s‘)
 50
 51
 52 #btnC1Locator = (By.ID, "_easyui_tree_12")
 53 def locAimTreeNode():
 54     driver.find_element(By.ID, "_easyui_tree_12").click()
 55     driver.find_element(By.CSS_SELECTOR, "#\\_easyui_tree_18 > .tree-title").click()
 56
 57
 58 fakeSleep(locAimTreeNode)
 59 print("locAimTreeNode-end")
 60
 61
 62 def switchFrame():
 63     driver.switch_to.frame(1)
 64
 65
 66 fakeSleep(switchFrame)
 67 print("switchFrame-end")
 68
 69
 70 #switch to new tab
 71 def searchMounthSum():
 72     import editElement
 73     date_show_text = driver.find_element(By.CSS_SELECTOR, ".item > .text")
 74     editElement.setText(driver,date_show_text,"本月")
 75     #change search days
 76     date_inner_value = driver.find_element(By.XPATH, "//*[@id=‘MySearchPanel‘]/div/div[2]/div[1]/span[2]/a/input")
 77     import datetime
 78     startDate = datetime.datetime.now().strftime(‘%Y-%m-01‘)
 79     currentDate = datetime.datetime.now().strftime(‘%Y-%m-%d‘)
 80     searchStr = startDate+‘@‘+currentDate
 81     editElement.setAttribute(driver,date_inner_value,"value",searchStr)
 82     driver.find_element(By.CSS_SELECTOR, ".tbar > div:nth-child(1) > button:nth-child(1) > span:nth-child(2)").click()
 83
 84
 85 fakeSleep(searchMounthSum)
 86 print("searchMounthSum-end")
 87
 88
 89 def tableFinished():
 90     rowsCount = driver.find_elements(By.XPATH, "/html/body/div[1]/div/div/div[3]/div/div/div[4]/div[1]/div[2]/div[2]/table/tbody/tr")
 91     if len(rowsCount)<1:
 92         raise RuntimeError(‘not ready yet‘)
 93 fakeSleep(tableFinished)
 94 print("tableFinished-end")
 95
 96
 97 #export
 98 def export():
 99     import editElement
100     ffNeedMakeThisItemVis =driver.find_element(By.CSS_SELECTOR, "div.sciyon-combo:nth-child(4)")
101     editElement.setAttribute(driver,ffNeedMakeThisItemVis,"style","overflow: auto; width: 100px; left: 1210.6px; top: 622.2px; display: true;")
102     driver.find_element(By.CSS_SELECTOR, "div.sciyon-combo:nth-child(4) > div:nth-child(1)").click()
103 fakeSleep(export)
104 print("export-end")
105
106
107 #check meg box
108 import win32gui
109 import win32con
110 import win32api
111 def click(xPos,yPos):
112     # 将鼠标移动到坐标处
113     win32api.SetCursorPos((xPos, yPos))
114     # 左点击
115     win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 200, 200, 0, 0)
116     win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 200, 200, 0, 0)
117
118
119 def catchPrintWindow():
120     dialog = win32gui.FindWindow(‘MozillaDialogClass‘,None)  # 对话框
121     windowName = win32gui.GetWindowText(dialog)
122     if windowName == ‘‘:
123         raise RuntimeError(‘not catched till now‘)
124     print("窗口名称:"+windowName)
125     #print("btn名称:"+win32gui.GetWindowText(btnhld)) #发现无法取到下级控件,无句柄
126     #(643, 201)-(1201, 596), 558x395
127     win32gui.SetWindowPos(dialog, win32con.HWND_TOPMOST, 0,0,420,400, win32con.SWP_SHOWWINDOW)#偷懒,使用按键精灵录制的绝对坐标
128     time.sleep(1)
129     click(64,254)#问题点:没有考虑win10内容缩放、屏幕分辨率,缩放这个估计有难度,可能需要管理员权限
130     click(230,359)
131 fakeSleep(catchPrintWindow)
132 print("catchPrintWindow-end")
133
134
135 print("Script End")
136 time_end=time.time()
137 print(‘time cost‘,time_end-time_start,‘s‘)

每个月要打印本月考勤记录,加上想学习下selenium用于以后的测试,就先练练手。主要思路是:自动登录erp,自动点击到相关页面,修改部分元素属性方便查询,(顺便通过这种形式绕过我们erp在火狐上的一些无法点击的BUG),然后点击下载,修改firefox默认下载路径,捕获弹出的下载窗口(挣扎了一下并没有达到静默下载。。),根据坐标位置定位radio和btn控件(找不到句柄),完成。第二步的导出文件的解析在这几天之前基本已经完成,获取再把提交报销流程完成就可以实现 双击完了贴发票的 乐趣了。(估计不会完成了,暂时还有好多需要学习的,到此为止吧。手动2下算了)

本次编写过程中值得自己记下来的点:

  • 查找元素可以用插件rec Selenium IDE,比较省时间
  • 元素定位有时候因为渲染较慢,需要等待
  • python很容易可将function 当作另一个function的参数(本次应用在,如果抛异常,就隔0.1秒再来,最多给10秒机会)
  • 使用spy++先查找窗体的类名,窗体名称不太稳,如本次编写,发现名称竟是下载文件名
  • 窗体句柄容易得,控件则较难(发现之前winform程序很好找,用spy++也可,但是现在的程序越来越难了)

最后因为水平有限,目前以实现为主,对于注释、封装、测试(不断对整个脚本F5)还需要后续学习优化。

原文地址:https://www.cnblogs.com/ngwfp/p/11732093.html

时间: 2024-10-07 06:55:31

导出ERP本月的考勤记录的相关文章

SQL 查询当天,本月,本周的记录

本文转载自Crazy Coder SELECT * FROM 表 WHERE CONVERT(Nvarchar, dateandtime, 111) = CONVERT(Nvarchar, GETDATE(), 111)   ORDER BY dateandtime DESC 本月记录 SELECT * FROM 表 WHERE datediff(month,[dateadd],getdate())=0 本周记录 SELECT * FROM 表 WHERE datediff(week,[date

生产与学术之Pytorch模型导出为安卓Apk尝试记录

生产与学术 写于 2019-01-08 的旧文, 当时是针对一个比赛的探索. 觉得可能对其他人有用, 就放出来分享一下 生产与学术, 真实的对立... 这是我这两天对pytorch深度学习->android实际使用的这个流程的一个切身感受. 说句实在的, 对于模型转换的探索, 算是我这两天最大的收获了... 全部浓缩在了这里: https://github.com/lartpang/DHSNet-PyTorch/blob/master/converter.ipynb 鉴于github加载ipyn

MySql数据库,查询数据导出时会出现重复的记录(数据越多越明显)

在查询数据时,数据量多的时候,我们会使用分页功能. 每页显示多少数据. 这种情况下,一半看不出什么问题. 而导出数据时,有时就是通过分页的方法,逐步讲数据追加到导出文件中. 当全部数据都导出之后,就有可能会出现重复的记录数. 原因也算简单,MySql排序字段如果有相同的值,如果没有其他限定,不能保证每次都是同样的顺序. 有可能A在前,B在后,也可能反过来. 这样如果翻页时正好交换了,可能就会出现两个A,少各B. 解决办法就是增加一个不会重复的字段排序.比如ID(自增)字段,一定不会重复. 这样就

java导入导出Excel数据的要点记录

< 客户端的B/S架构输出方式 加下划线这部分代码是B/S模式中采用的输出方式, //获得输出流,该输出流的输出介质是客户端浏览器 OutputStream output=response.getOutputStream(); response.reset(); response.setHeader("Content-disposition","attachment; filename=temp.xls"); response.setContentType(&

OI本月刷水记录

bzoj 1044 硬币购物 如果没有每个硬币的个数限制,这就是一个完全背包计数问题,现在我们注意到硬币个数很少,于是我们分别考虑一下每个硬币不符合条件的情况,容斥一下即可 bzoj 1225假如不考虑高精度的情况,那么转移还是好考虑的 f[i][j]表示前i个质数有j的约数最小数字 f[i][j]=minprime[i]k|jf[i?1][j/(k+1)]?prime[i]k 但万恶的高精度啊= =,于是改成搜索,然后用对数来表示,就好了 bzoj 2440 一道很神的数论题,二分+容斥+莫比

[原创软件]考勤数据导出工具

软件主要功能: 1.显示考勤机数据 2.根据时间导出考勤数据 3.自动定时加载Python脚本,执行加工处理并上传服务器 2016.11.22 v1.4 功能更新: 1.增加考勤机设置配置 2.增加密码设置 BUG修复: 1.修复了若干BUG 2016.8.3 v1.3 功能更新: 1.增加自动运行脚本路径配置 2.增加运行时间设置 3.可勾选是否定时运行.后台运行等配置 4.时间选择窗最大可选日期为今日 BUG修复: 1.修复了若干BUG 2016.8.1 v1.2 功能更新: 1.增加时间选

ERP系统31.83版本发布,一键极速连接企业供应链!

近日,ERP系统31.83版本正式发布.无处不在的互联网,正在改变企业与用户的连接方式,一旦享受过什么叫实时,就再也无法忍受延迟,一旦感受过什么叫便捷,就再也无法忍受繁琐,企业如何全方位提高服务效率和用户体验?此次升级的智邦国际ERP系统31.83版本,通过增强采购.库存.生产.财务等业务一体化管理,PC端.手机端.平板端.PDA端协同智能化水平,帮助企业加速供应链协同战略,让连接随时随地,让企业×××! 智邦国际ERP系统31.83版本,在数据连接.整合.互动.共享等方面,颠覆传统管理模式和办

使用ECharts报表统计公司考勤加班,大家加班多吗?

最近个项目已经连续加班1个月多,因为公司经常有在外面客户现场或出差的情况,人事每个月初会把上个月的份考勤打卡记录全部发出来,让我们对自己的考勤,突然想到可根据大家打卡时间记录统计每天工作时间,看大家是否也普遍加班呢?然后使用我们现在项目用的ECharts报表来展示,做了个Web的柱状图和饼图分析,效果如下. Echarts柱状图报表 Echarts饼状图报表 可以看出,公司超过3成的人每天有加班1-6个小时不等. 每天小于8个小时的占比约10%,这是有请假出差或早退的情况: 每天8-9个小时上班

机械生产行业实施ERP系统对企业管理有好处吗?

随着工业4.0和互联网+时代的到来,生产制造型企业适时导入ERP系统已是一种必然的趋势和明智的选择,据制造行业IT技术调查数据显示,生产型企业实现信息化管理,ERP系统起绝对性作用,不仅解决了企业生产管理难题,还帮助企业实现了一体化管理.下面小编就以智邦国际ERP系统为例,为大家阐述一下ERP系统是如何实现一体化管理应用的吧! 智邦国际ERP系统以生产制造行业管理特点为基础,以IT信息技术为支撑,为生产制造型企业提供了一套完整的解决方案,整个系统涵盖了企业销售.采购.生产.库存.财务.人资等部门