一、程序样式展示
将程序与cmd.xls文件放在同一文件夹,每一步的截图也放在当前文件夹
通过图片在屏幕上面进行比对,找到点击处进行自动化操作
自动化rpa测试
二、核心点
1.Pyautoui
模块:主要针对图片进行定位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('输入有误或者已经退出!')