码迷,mamicode.com
首页 > 其他好文 > 详细

导出ERP本月的考勤记录

时间:2019-10-24 15:09:36      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:arc   show   hpa   row   time   分辨率   路径   erro   css   

  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)还需要后续学习优化。

 

导出ERP本月的考勤记录

标签:arc   show   hpa   row   time   分辨率   路径   erro   css   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!