python实现模拟键盘鼠标重复性操作Pyautogui
作者:柒月VII
这篇文章主要为大家详细介绍了python如何利用Pyautogui模拟键盘鼠标重复性操作,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
一、程序样式展示
将程序与cmd.xls文件放在同一文件夹,每一步的截图也放在当前文件夹通过图片在屏幕上面进行比对,找到点击处进行自动化操作
自动化rpa测试
二、核心点
1.Pyautogui模块:主要针对图片进行定位pyautogui.locateCenterOnScreen(),在屏幕上面找到该图片位置后进行pyautogui.click单击,双击,右键,输入操作,还有滑轮操作pyautogui.scroll,组合按键按键操作pyautogui.press(‘enter’),pyautogui.hotkey(),这里使用滑轮需要先点击到滑轮处,然后进行滑动才行,不然可能会失效。
def mouseClick(clickTimes,lOrR,img,reTry): if reTry == 1: while True: location=pyautogui.locateCenterOnScreen(img,confidence=0.9) if location is not None: pyautogui.click(location.x,location.y,clicks=clickTimes,interval=0.2,duration=0.2,button=lOrR) break print("未找到匹配图片,0.1秒后重试") time.sleep(0.1) elif reTry == -1: while True: location=pyautogui.locateCenterOnScreen(img,confidence=0.9) if location is not None: pyautogui.click(location.x,location.y,clicks=clickTimes,interval=0.2,duration=0.2,button=lOrR) time.sleep(0.1) elif reTry > 1: i = 1 while i < reTry + 1: location=pyautogui.locateCenterOnScreen(img,confidence=0.9) if location is not None: pyautogui.click(location.x,location.y,clicks=clickTimes,interval=0.2,duration=0.2,button=lOrR) print("重复") i += 1 time.sleep(0.1)
def mainWork(img): i = 1 while i < sheet1.nrows: #取本行指令的操作类型 cmdType = sheet1.row(i)[0] if cmdType.value == 1.0: #取图片名称 img = sheet1.row(i)[1].value reTry = 1 if sheet1.row(i)[2].ctype == 2 and sheet1.row(i)[2].value != 0: reTry = sheet1.row(i)[2].value mouseClick(1,"left",img,reTry) print("单击左键",img) #2代表双击左键 elif cmdType.value == 2.0: #取图片名称 img = sheet1.row(i)[1].value #取重试次数 reTry = 1 if sheet1.row(i)[2].ctype == 2 and sheet1.row(i)[2].value != 0: reTry = sheet1.row(i)[2].value mouseClick(2,"left",img,reTry) print("双击左键",img) #3代表右键 elif cmdType.value == 3.0: #取图片名称 img = sheet1.row(i)[1].value #取重试次数 reTry = 1 if sheet1.row(i)[2].ctype == 2 and sheet1.row(i)[2].value != 0: reTry = sheet1.row(i)[2].value mouseClick(1,"right",img,reTry) print("右键",img) #4代表输入 elif cmdType.value == 4.0: inputValue = sheet1.row(i)[1].value pyperclip.copy(inputValue) pyautogui.hotkey('ctrl','v') time.sleep(0.5) print("输入:",inputValue) #5代表等待 elif cmdType.value == 5.0: #取图片名称 waitTime = sheet1.row(i)[1].value time.sleep(waitTime) print("等待",waitTime,"秒") #6代表滚轮 elif cmdType.value == 6.0: #取图片名称 scroll = sheet1.row(i)[1].value pyautogui.scroll(int(scroll)) # pywinauto.mouse.scroll((700,800),-1000) print("滚轮滑动",int(scroll),"距离") elif cmdType.value == 7.0: key = sheet1.row(i)[1].value pyautogui.press(key) time.sleep(0.5) print('按下',key) elif cmdType.value == 8.0: comkey = sheet1.row(i)[1].value comkey = comkey.split('+') pyautogui.hotkey(comkey[0],comkey[1]) print('按下',comkey[0] ,'+',comkey[1] ) i += 1
2.读取excel文件进行数据验证,针对字符类型以及数字范围进行限制
def dataCheck(sheet1): checkCmd = True #行数检查 if sheet1.nrows<2: print("没有数据") checkCmd = False #每行数据检查 i = 1 while i < sheet1.nrows: # 第1列 操作类型检查 cmdType = sheet1.row(i)[0] if cmdType.ctype != 2 or (cmdType.value != 1.0 and cmdType.value != 2.0 and cmdType.value != 3.0 and cmdType.value != 4.0 and cmdType.value != 5.0 and cmdType.value != 6.0 and cmdType.value != 7.0 and cmdType.value != 8.0): print('第',i+1,"行,第1列数据有毛病") checkCmd = False # 第2列 内容检查 cmdValue = sheet1.row(i)[1] # 读图点击类型指令,内容必须为字符串类型 if cmdType.value ==1.0 or cmdType.value == 2.0 or cmdType.value == 3.0: if cmdValue.ctype != 1: print('第',i+1,"行,第2列数据有毛病") checkCmd = False # 输入类型,内容不能为空 if cmdType.value == 4.0: if cmdValue.ctype == 0: print('第',i+1,"行,第2列数据有毛病") checkCmd = False # 等待类型,内容必须为数字 if cmdType.value == 5.0: if cmdValue.ctype != 2: print('第',i+1,"行,第2列数据有毛病") checkCmd = False # 滚轮事件,内容必须为数字 if cmdType.value == 6.0: if cmdValue.ctype != 2: print('第',i+1,"行,第2列数据有毛病") checkCmd = False #单独按键enter if cmdType.value == 7.0: if cmdValue.ctype != 1: print('第',i+1,"行,第2列数据有毛病") checkCmd = False #组合键 ctrl+a ctrl+c ctrl+v.... if cmdType.value == 8.0: if cmdValue.ctype == 0: print('第',i+1,"行,第2列数据有毛病") checkCmd = False i += 1 return checkCmd
三、完整代码
import pyautogui import time import xlrd import pyperclip import pywinauto.mouse #定义鼠标事件 #pyautogui库其他用法 https://blog.csdn.net/qingfengxd1/article/details/108270159 def mouseClick(clickTimes,lOrR,img,reTry): if reTry == 1: while True: location=pyautogui.locateCenterOnScreen(img,confidence=0.9) if location is not None: pyautogui.click(location.x,location.y,clicks=clickTimes,interval=0.2,duration=0.2,button=lOrR) break print("未找到匹配图片,0.1秒后重试") time.sleep(0.1) elif reTry == -1: while True: location=pyautogui.locateCenterOnScreen(img,confidence=0.9) if location is not None: pyautogui.click(location.x,location.y,clicks=clickTimes,interval=0.2,duration=0.2,button=lOrR) time.sleep(0.1) elif reTry > 1: i = 1 while i < reTry + 1: location=pyautogui.locateCenterOnScreen(img,confidence=0.9) if location is not None: pyautogui.click(location.x,location.y,clicks=clickTimes,interval=0.2,duration=0.2,button=lOrR) print("重复") i += 1 time.sleep(0.1) # 数据检查 # cmdType.value 1.0 左键单击 2.0 左键双击 3.0 右键单击 4.0 输入 5.0 等待 6.0 滚轮 # ctype 空:0 # 字符串:1 # 数字:2 # 日期:3 # 布尔:4 # error:5 def dataCheck(sheet1): checkCmd = True #行数检查 if sheet1.nrows<2: print("没有数据") checkCmd = False #每行数据检查 i = 1 while i < sheet1.nrows: # 第1列 操作类型检查 cmdType = sheet1.row(i)[0] if cmdType.ctype != 2 or (cmdType.value != 1.0 and cmdType.value != 2.0 and cmdType.value != 3.0 and cmdType.value != 4.0 and cmdType.value != 5.0 and cmdType.value != 6.0 and cmdType.value != 7.0 and cmdType.value != 8.0): print('第',i+1,"行,第1列数据有毛病") checkCmd = False # 第2列 内容检查 cmdValue = sheet1.row(i)[1] # 读图点击类型指令,内容必须为字符串类型 if cmdType.value ==1.0 or cmdType.value == 2.0 or cmdType.value == 3.0: if cmdValue.ctype != 1: print('第',i+1,"行,第2列数据有毛病") checkCmd = False # 输入类型,内容不能为空 if cmdType.value == 4.0: if cmdValue.ctype == 0: print('第',i+1,"行,第2列数据有毛病") checkCmd = False # 等待类型,内容必须为数字 if cmdType.value == 5.0: if cmdValue.ctype != 2: print('第',i+1,"行,第2列数据有毛病") checkCmd = False # 滚轮事件,内容必须为数字 if cmdType.value == 6.0: if cmdValue.ctype != 2: print('第',i+1,"行,第2列数据有毛病") checkCmd = False #单独按键enter if cmdType.value == 7.0: if cmdValue.ctype != 1: print('第',i+1,"行,第2列数据有毛病") checkCmd = False #组合键 ctrl+a ctrl+c ctrl+v.... if cmdType.value == 8.0: if cmdValue.ctype == 0: print('第',i+1,"行,第2列数据有毛病") checkCmd = False i += 1 return checkCmd #任务 def mainWork(img): i = 1 while i < sheet1.nrows: #取本行指令的操作类型 cmdType = sheet1.row(i)[0] if cmdType.value == 1.0: #取图片名称 img = sheet1.row(i)[1].value reTry = 1 if sheet1.row(i)[2].ctype == 2 and sheet1.row(i)[2].value != 0: reTry = sheet1.row(i)[2].value mouseClick(1,"left",img,reTry) print("单击左键",img) #2代表双击左键 elif cmdType.value == 2.0: #取图片名称 img = sheet1.row(i)[1].value #取重试次数 reTry = 1 if sheet1.row(i)[2].ctype == 2 and sheet1.row(i)[2].value != 0: reTry = sheet1.row(i)[2].value mouseClick(2,"left",img,reTry) print("双击左键",img) #3代表右键 elif cmdType.value == 3.0: #取图片名称 img = sheet1.row(i)[1].value #取重试次数 reTry = 1 if sheet1.row(i)[2].ctype == 2 and sheet1.row(i)[2].value != 0: reTry = sheet1.row(i)[2].value mouseClick(1,"right",img,reTry) print("右键",img) #4代表输入 elif cmdType.value == 4.0: inputValue = sheet1.row(i)[1].value pyperclip.copy(inputValue) pyautogui.hotkey('ctrl','v') time.sleep(0.5) print("输入:",inputValue) #5代表等待 elif cmdType.value == 5.0: #取图片名称 waitTime = sheet1.row(i)[1].value time.sleep(waitTime) print("等待",waitTime,"秒") #6代表滚轮 elif cmdType.value == 6.0: #取图片名称 scroll = sheet1.row(i)[1].value pyautogui.scroll(int(scroll)) # pywinauto.mouse.scroll((700,800),-1000) print("滚轮滑动",int(scroll),"距离") elif cmdType.value == 7.0: key = sheet1.row(i)[1].value pyautogui.press(key) time.sleep(0.5) print('按下',key) elif cmdType.value == 8.0: comkey = sheet1.row(i)[1].value comkey = comkey.split('+') pyautogui.hotkey(comkey[0],comkey[1]) print('按下',comkey[0] ,'+',comkey[1] ) i += 1 if __name__ == '__main__': file = 'cmd.xls' #打开文件 wb = xlrd.open_workbook(filename=file) #通过索引获取表格sheet页 # sheet1 = wb.sheet_by_index(0) print('欢迎使用Henry自动化工具') sheetname = input('请输入需要执行的工作表表名: ') sheet1 = wb.sheet_by_name(sheetname) #数据检查 checkCmd = dataCheck(sheet1) if checkCmd: key=input('选择功能: 1.执行一次 2.循环到死 \n') if key=='1': #循环拿出每一行指令 mainWork(sheet1) elif key=='2': while True: mainWork(sheet1) time.sleep(0.2) print("等待0.2秒") else: print('输入有误或者已经退出!')
以上就是python实现模拟键盘鼠标重复性操作Pyautogui的详细内容,更多关于python模拟键盘鼠标操作的资料请关注脚本之家其它相关文章!