python中可以使用 selenium库实现对浏览器的自动化操作,但selenium库能操作的还是浏览器对象
今天我们来聊一聊如何在桌面实现自动化操作。与浏览器页面自动化操作类似,桌面自动化操作也是需要定位鼠标在桌面的位置,然后根据定位的位置执行对应的操作。
pyautogui是一个使用python的跨平台的操作鼠标和键盘的模块,非常方便使用。还支持一些简单的图像识别相关操作
文末附赠pyautogui图像识别无法跨分辨率解决方案

安装

pip install pyautogui

提示 ModuleNotFoundError: No module named 'win32api' 需要安装pip install pypiwin32

提示import win32api, win32con ImportError: DLL load failed: 找不到指定的程序。

需要 pip install pywin32==227 不行就 pip install pywin32==223

安装如果出现缺少模块 pyHook https://zhuanlan.zhihu.com/p/143676206

使用

前置参数

import pyautogui
# 停顿功能
pyautogui.PAUSE = 1 # 调用在执行动作后暂停的秒数,只能在执行一些pyautogui动作后才能使用,建议用time.sleep
# 自动 防故障功能
pyautogui.FAILSAFE = True # 启用自动防故障功能,左上角的坐标为(0,0),将鼠标移到屏幕的左上角,来抛出failSafeException异常

鼠标操作

获取屏幕的宽度和高度

width, height = pyautogui.size() # 获取屏幕的宽度和高度
print(width, height)

获取鼠标当前位置

currentMouseX, currentMouseY = pyautogui.position() # 鼠标当前位置
print(currentMouseX, currentMouseY)

鼠标移动类操作

# pyautogui.moveTo(x,y,持续时间) 在持续时间内 将光标移动到目标位置(x,y)
pyautogui.moveTo(100, 100, duration=0.25) # 移动到 (100,100)#pyautogui.moveRel(xOffset,yxOffset,持续时间) 在持续时间内 将光标偏移 距离原始位置 xOffset,yxOffset 的位置
pyautogui.moveRel(50, 0, duration=0.25) # 从当前位置右移50像素# 实现拖拽效果
pyautogui.mouseDown(740,73)  #鼠标按下指定位置
pyautogui.moveRel(100,0,2)  #移动/可以使用其他移动方法
pyautogui.mouseUp()     # 鼠标抬起
#或者
pyautogui.dragTo(100,300,duration=1)
#或者
pyautogui.dragRel(100,300,duration=4)

鼠标滚动类操作

# scroll函数控制鼠标滚轮的滚动,amount_to_scroll参数表示滚动的格数。正数则页面向上滚动,负数则向下滚动
# pyautogui.scroll(clicks=amount_to_scroll, x=moveToX, y=moveToY)
# 默认从当前光标位置进行滑动  amount_to_scroll是个数字 数字太小效果可能不明显, 正数表示往上划 负数表示往下化
pyautogui.scroll(500, 20, 2)
pyautogui.scroll(100) # 向上滚动100格
pyautogui.scroll(-100) # 向下滚动100格
pyautogui.scroll(100, x=100, y=100) # 移动到(100, 100)位置再向上滚动100格

鼠标点击类操作

# pyautogui.click(x,y,clicks=点击次数,interval=每次点击间隔频率,button=可以是left表示左击 可以是right表示右击 可以是middle表示中击)
pyautogui.click(10, 20, 2, 0.25, button='left')
pyautogui.click(x=100, y=200, duration=2) # 先移动到(100, 200)再单击
pyautogui.click() # 鼠标当前位置点击一下
pyautogui.doubleClick() # 鼠标当前位置左击两下
pyautogui.doubleClick(x=100, y=150, button="left") # 鼠标在(100,150)位置左击两下
pyautogui.tripleClick() # 鼠标当前位置左击三下
pyautogui.rightClick(10,10)   # 指定位置,双击右键
pyautogui.middleClick(10,10)  # 指定位置,双击中键

键盘操作

# 相关操作
# pyautogui.typewrite(要输入的字符只能是英文,interval=输入每个字符的间隔频率)
pyautogui.typewrite('python', 1)
# typewrite 还可以传入单字母的列表
# 运行下面代码,编辑器里面就会输出 python 之后换行。
pyautogui.typewrite(['p','y','t','h','o','n','enter'])   # pyautogui.keyDown():模拟按键按下
# pyautogui.keyUP():模拟按键松开
# pyautogui.press(键盘按键字母)  模拟一次按键过程,即 keyDown 和 keyUP 的组合 按下指定的键盘按键
# pyautogui.hotkey("ctrl","a")  实现组合键功能# 按住 shift 按键,然后再按住 1 按键,就可以了。用 pyautogui 控制就是
pyautogui.keyDown('shift')
pyautogui.press('1')
pyautogui.keyUp('shift')  # 输入中文字符的方法  借用 pyperclip模块
import pyperclip
pyperclip.copy("要书写的字符串")  #复制字符串
time.sleep(2)
pyautogui.hotkey("ctrl","v") #实现复制# pyautogui.KEYBOARD_KEYS数组中就是press(),keyDown(),keyUp()和hotkey()函数可以输入的按键名称
pyautogui.KEYBOARD_KEYS = ['\t', '\n', '\r', ' ', '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.','/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@','[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l','m', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~','accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace', 'browserback','browserfavorites', 'browserforward', 'browserhome', 'browserrefresh', 'browsersearch','browserstop', 'capslock', 'clear', 'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal','del', 'delete', 'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10','f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20', 'f21', 'f22','f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'final', 'fn', 'hanguel', 'hangul','hanja', 'help', 'home', 'insert', 'junja', 'kana', 'kanji', 'launchapp1', 'launchapp2','launchmail', 'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack','nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6', 'num7', 'num8', 'num9','numlock', 'pagedown', 'pageup', 'pause', 'pgdn', 'pgup', 'playpause', 'prevtrack', 'print','printscreen', 'prntscrn', 'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select','separator', 'shift', 'shiftleft', 'shiftright', 'sleep', 'space', 'stop', 'subtract', 'tab','up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen', 'command','option', 'optionleft', 'optionright']

弹窗操作

import pyautogui# 显示一个简单的带文字和OK按钮的消息弹窗。用户点击后返回button的文字。
pyautogui.alert(text='', title='', button='OK')
b = pyautogui.alert(text='要开始程序么?', title='请求框', button='OK')
print(b) # 输出结果为OK# 显示一个简单的带文字、OK和Cancel按钮的消息弹窗,用户点击后返回被点击button的文字,支持自定义数字、文字的列表。
pyautogui.confirm(text='', title='', buttons=['OK', 'Cancel']) # OK和Cancel按钮的消息弹窗
pyautogui.confirm(text='', title='', buttons=range(10)) # 10个按键0-9的消息弹窗
a = pyautogui.confirm(text='', title='', buttons=range(10))
print(a) # 输出结果为你选的数字# 可以输入的消息弹窗,带OK和Cancel按钮。用户点击OK按钮返回输入的文字,点击Cancel按钮返回None。
pyautogui.prompt(text='', title='', default='')# 样式同prompt(),用于输入密码,消息用*表示。带OK和Cancel按钮。用户点击OK按钮返回输入的文字,点击Cancel按钮返回None。
pyautogui.password(text='', title='', default='', mask='*')

图像操作

import pyautogui
im = pyautogui.screenshot() # 返回屏幕的截图,是一个Pillow的image对象
im.save('屏幕截图.png') #保存图片
# 或者
im = pyautogui.screenshot('屏幕截图.png') # 截全屏并设置保存图片的位置和名称
print(im) # 打印图片的属性# 不截全屏,截取区域图片。截取区域region参数为:左上角XY坐标值、宽度和高度
pyautogui.screenshot('屏幕截图.png', region=(0, 0, 300, 400))# 获得文件图片在现在的屏幕上面的坐标,返回的是一个元组(top, left, width, height)
# 如果截图没找到,pyautogui.locateOnScreen()函数返回None
a = pyautogui.locateOnScreen(r'目标图片路径')
print(a) # 打印结果为Box(left=0, top=0, width=300, height=400)
x, y = pyautogui.center(a) # 获得文件图片在现在的屏幕上面的中心坐标
print(x, y) # 打印结果为150 200
# 或者
x, y = pyautogui.locateCenterOnScreen(r'目标图片路径') # 这步与上面的四行代码作用一样
print(x, y) # 打印结果为150 200# 匹配屏幕所有与目标图片的对象,可以用for循环和list()输出
for pos in pyautogui.locateAllOnScreen(r'C:\Users\ZDH\Desktop\PY\region_screenshot.png'):print(pos)
# 打印结果为Box(left=0, top=0, width=300, height=400)
a = list(pyautogui.locateAllOnScreen(r'C:\Users\ZDH\Desktop\PY\region_screenshot.png'))
print(a) # 打印结果为[Box(left=0, top=0, width=300, height=400)]

注意:pyautogui的图像识别是模板匹配算法 无法跨分辨率识别(图片放大缩小就无法识别) 提供以下图像识别算法

# -*- coding: utf-8 -*-
"""
使用需求:需要安装 airtest  pip install  airtest  -i https://mirrors.aliyun.com/pypi/simple/运行时如果出现以下错误:  import win32apiImportError: DLL load failed: 找不到指定的程序。重新安装win32api版本pip install pywin32==227   # 安装 227版本不行的话再试试pip install pywin32==223  # 安装 223版本"""import sys
import types
from copy import deepcopy
from airtest import aircv
from airtest.aircv import cv2
from airtest.aircv.template_matching import TemplateMatching
from airtest.core.cv import MATCHING_METHODS, Predictor
from airtest.core.error import InvalidMatchingMethodError
from airtest.core.helper import logwrap, G
from airtest.core.win.screen import screenshot
from airtest.utils.transform import TargetPos
from six import PY3
from airtest.core.settings import Settings as ST  # noqa# # -*- encoding=utf8 -*-
import logging
logger = logging.getLogger("airtest")
logger.setLevel(logging.ERROR)
# 日志级别有[DEBUG]、[INFO]、[WARNING] 和 [ERROR]class Template(object):"""picture as touch/swipe/wait/exists target and extra info for cv matchfilename: pic filenametarget_pos: ret which pos in the picrecord_pos: pos in screen when recordingresolution: screen resolution when recordingrgb: 识别结果是否使用rgb三通道进行校验.scale_max: 多尺度模板匹配最大范围.scale_step: 多尺度模板匹配搜索步长."""def __init__(self, filename, threshold=None, target_pos=TargetPos.MID, record_pos=None, resolution=(), rgb=False, scale_max=800, scale_step=0.005):self.filename = filename# self.filename =os.path.join(Settings.Picture_Path,filename)self._filepath = Noneself.threshold = threshold or ST.THRESHOLDself.target_pos = target_posself.record_pos = record_posself.resolution = resolutionself.rgb = rgbself.scale_max = scale_maxself.scale_step = scale_step@propertydef filepath(self):return self.filenamedef __repr__(self):filepath = self.filepath if PY3 else self.filepath.encode(sys.getfilesystemencoding())return "Template(%s)" % filepathdef match_in(self, screen):match_result = self._cv_match(screen)G.LOGGING.debug("match result: %s", match_result)if not match_result:return Nonefocus_pos = TargetPos().getXY(match_result, self.target_pos)return focus_posdef match_all_in(self, screen):image = self._imread()image = self._resize_image(image, screen, ST.RESIZE_METHOD)return self._find_all_template(image, screen)@logwrapdef _cv_match(self, screen):# in case image file not exist in current directory:ori_image = self._imread()image = self._resize_image(ori_image, screen, ST.RESIZE_METHOD)ret = Nonefor method in ST.CVSTRATEGY:# get function definition and execute:func = MATCHING_METHODS.get(method, None)if func is None:raise InvalidMatchingMethodError("Undefined method in CVSTRATEGY: '%s', try 'kaze'/'brisk'/'akaze'/'orb'/'surf'/'sift'/'brief' instead." % method)else:if method in ["mstpl", "gmstpl"]:ret = self._try_match(func, ori_image, screen, threshold=self.threshold, rgb=self.rgb, record_pos=self.record_pos,resolution=self.resolution, scale_max=self.scale_max, scale_step=self.scale_step)else:ret = self._try_match(func, image, screen, threshold=self.threshold, rgb=self.rgb)if ret:breakreturn ret@staticmethoddef _try_match(func, *args, **kwargs):G.LOGGING.debug("try match with %s" % func.__name__)try:ret = func(*args, **kwargs).find_best_result()except aircv.NoModuleError as err:G.LOGGING.warning("'surf'/'sift'/'brief' is in opencv-contrib module. You can use 'tpl'/'kaze'/'brisk'/'akaze'/'orb' in CVSTRATEGY, or reinstall opencv with the contrib module.")return Noneexcept aircv.BaseError as err:G.LOGGING.debug(repr(err))return Noneelse:return retdef _imread(self):return aircv.imread(self.filepath)def _find_all_template(self, image, screen):return TemplateMatching(image, screen, threshold=self.threshold, rgb=self.rgb).find_all_results()def _find_keypoint_result_in_predict_area(self, func, image, screen):if not self.record_pos:return None# calc predict area in screenimage_wh, screen_resolution = aircv.get_resolution(image), aircv.get_resolution(screen)xmin, ymin, xmax, ymax = Predictor.get_predict_area(self.record_pos, image_wh, self.resolution, screen_resolution)# crop predict image from screenpredict_area = aircv.crop_image(screen, (xmin, ymin, xmax, ymax))if not predict_area.any():return None# keypoint matching in predicted area:ret_in_area = func(image, predict_area, threshold=self.threshold, rgb=self.rgb)# calc cv ret if foundif not ret_in_area:return Noneret = deepcopy(ret_in_area)if "rectangle" in ret:for idx, item in enumerate(ret["rectangle"]):ret["rectangle"][idx] = (item[0] + xmin, item[1] + ymin)ret["result"] = (ret_in_area["result"][0] + xmin, ret_in_area["result"][1] + ymin)return retdef _resize_image(self, image, screen, resize_method):"""模板匹配中,将输入的截图适配成 等待模板匹配的截图."""# 未记录录制分辨率,跳过if not self.resolution:return imagescreen_resolution = aircv.get_resolution(screen)# 如果分辨率一致,则不需要进行im_search的适配:if tuple(self.resolution) == tuple(screen_resolution) or resize_method is None:return imageif isinstance(resize_method, types.MethodType):resize_method = resize_method.__func__# 分辨率不一致则进行适配,默认使用cocos_min_strategy:h, w = image.shape[:2]w_re, h_re = resize_method(w, h, self.resolution, screen_resolution)# 确保w_re和h_re > 0, 至少有1个像素:w_re, h_re = max(1, w_re), max(1, h_re)# 调试代码: 输出调试信息.G.LOGGING.debug("resize: (%s, %s)->(%s, %s), resolution: %s=>%s" % (w, h, w_re, h_re, self.resolution, screen_resolution))# 进行图片缩放:image = cv2.resize(image, (w_re, h_re))return imageif __name__ == '__main__':"""用法:res = Template(目标图片路径,threshold=匹配阈值,target_pos=可以是123456789 分别对应图片的九个点).match_in(screenshot(None))"""res = Template("pppp.png",threshold=0.8,target_pos=5).match_in(screenshot(None))print(res)

python自动化操作神器pyautogui使用相关推荐

  1. python自动化操作电脑的简单实现

    最近由于工作原因,需要机械性重复性的计算好多组数据,而这些数据不同点就在于输入参数的不同,所以就想着利用python来解放双手. 在网页直接bing"python自动化"后,发现了 ...

  2. python开发autocad_利用Python自动化操作AutoCAD的实现

    1 Python自动绘图 在这里我主要运用了pyautocad库进行AutoCAD的自动化操作,pyautocad是一款功能非常强大的AutoCAD操作处理库,可以实现Python自动绘图.CAD图像 ...

  3. 用Python自动化操作PPT,看完这篇文章就够了!

    作者:超级大洋葱806 https://tangxing.blog.csdn.net/article/details/109568830 大家好,我是小z 今天给大家分享一波Python自动化操作PP ...

  4. Python自动化操作Excel

    二.基础准备 环境:python 3.7+ 需要安装第三方模块:xlwings 运行编辑器:jupyter notebook 三.动手动脑 3.0 我们为什么要学编程 首先和大家简单聊一下运营(这里运 ...

  5. python自动化框架学习-pyautogui

    一.适用平台:PC(windows和mac均可用) 二.下载安装: 推荐使用命令行下载(因为会自动安装依赖库): pip install PyAutoGUI 该框架的依赖库还是蛮多的,第一次用的同学耐 ...

  6. sikuli:前端自动化操作神器【简单实用】

    前端自动话操作应用很广泛,从网购秒杀活动实现自动化抢购,到区块链货币高频交易前端脚本编写(非合作交易所不提供api的情况下). 自动化的流派分为2类,一类是对DOM对象进行解析的,这个是主流,但是受特 ...

  7. wps python 自动化_请教下 Python 高手,如何用 Python 自动化操作 Excel?

    最近迷上了高效处理数据的pandas,其实这个是用来做数据分析的,如果你是做大数据分析和测试的,那么这个是非常的有用的!! 但是其实我们平时在做自动化测试的时候,如果涉及到数据的读取和存储,那么而利用 ...

  8. python自动化操作浏览器

    python的语法精炼简洁,并且很方便集成自动化工具selenium,因此特别适合各个行业的工作人员学习和编写简单程序来实现"机器人助理"帮我们处理频繁重复的网站操作. 废话不多说 ...

  9. python用于cad_【笔记】利用Python自动化操作AutoCAD

    1 Python自动绘图 在这里我主要运用了pyautocad库进行AutoCAD的自动化操作,pyautocad是一款功能非常强大的AutoCAD操作处理库,可以实现Python自动绘图.CAD图像 ...

最新文章

  1. ios应用的分发和上传
  2. 虚拟机ubuntu使用笔记之samba安装
  3. php函数文件,PHP文件函数大全
  4. NET问答: 如何用 C# 计算相对时间 ?
  5. 学不会的JAVA,消不了的忧愁! 1
  6. PaperNotes(9)-Learning deep energy model: contrastive divergence vs. Amortized MLE
  7. 源码调试debug_info 的作用和使用方法
  8. 三甲医院his系统源码_三甲医院科研管理系统是什么,科研成果包括哪些
  9. centos6安装mysql 5.5_CentOS6.5上安装MySQL5.5
  10. Firefox附加在合谋表演,谁跟踪你上网
  11. ACDSee QuickView(图片浏览器)v1.2.42官方版
  12. 广数系统加工中心编程_数控加工中心编程的步骤
  13. 高频小信号谐振放大器设计-课程设计Multisim仿真
  14. 程序猿生存指南-1 初出茅庐
  15. Kubernetes Egress 网络策略指南
  16. 【Pandas 基础知识 数据修改总结】
  17. 诊断和响应故障_执行闪回和数据库时间点恢复(Flashback and Database Point-in-Time Recovery)
  18. 熵、相对熵、交叉熵等理解
  19. Rocketmq原理与实践
  20. 白话文讲解Word2vec

热门文章

  1. Python 的学习脚印(1)
  2. JZOJ 5904【NOIP2018模拟10.15】刺客信条
  3. UnityWebRequest.Post 发送和接收Json数据
  4. 负载均衡工作原理详解
  5. 自学Java随时放弃(十一 循环结构语句③)
  6. Android: Camera2相机开发 知识储备
  7. 学习Java的自我总结与心得体会(20200311)
  8. flexible的用法
  9. Linux+MCSM9+Docker 搭建Minecraft基岩版BDS私服,我的世界基岩版开服教程
  10. 数字引领未来,第七届粤港澳大湾区跨界融合产业创新交流会圆满举行