做自动化的时候,比较常见的一种场景
上面这个列表,我们需要鼠标去点击每个锁定标题,当然可以直接点击黄色15¥,黄色15¥和黄色20¥,相似度应该在0.7左右但是算是匹配成功的。
做法可以是:
先截取一张模板
然后在最开始的一张截图去锁定,代码如下
png_path = r'E:\python\auto_exe\yuanshen\photo\ico_1.png'
screen = lackey.Screen()
ico_1_list = list(screen.findAll(png_path))
if len(ico_1_list) != 0:
for index in range(len(ico_1_list)):
screen.click(ico_1_list[index])
time.sleep(1)
当然上面的只是一部分,像原神的游戏公告自动化点击,消除小红点是下面代码完成的,不可直接复制粘贴,因为缺少截图。完整程序包请直接访问百度网盘下载,更改原神的启动路径即可。
效果如下:由于版权原因,上传视频和程序包都失败,视频最后上传到小破站了,程序包上传到百度云网盘了,有兴趣的话可以看下。
python | 第1集 实现自动化拍照,自动化点击游戏公告,消除小红点
https://www.bilibili.com/video/BV1qe4y1H7Nd/?vd_source=74491db4ef604fb16ac63f32db8f3abf
百度云网盘:
链接:https://pan.baidu.com/s/1395qW18qU6tpTo8exQ7oLg
提取码:1ski
import time
import keyboard
from lackey import Button, Match
from pywinauto import mouse
from PIL import ImageGrab
import pywinauto
2022年9月25日19:47:10
当前版本需要先获取一个screen
screen = lackey.Screen()
account_png = lackey.Pattern(r'E:\python\auto_exe\photo\account.png')
screen.click(account_png)
screen.type('123456')
import lackey
def try_click_again(png_path='', massage='', press_alt=False):
error_count = 120
while True:
error_count = error_count - 1
try:
screen = lackey.Screen()
click_png = lackey.Pattern(png_path)
if press_alt:
keyboard.press("Alt")
time.sleep(2)
screen.click(click_png)
print(massage + " success!")
time.sleep(15)
pic = ImageGrab.grab()
pic.save(massage + ".jpg")
if press_alt:
keyboard.release("Alt")
break
except Exception as e:
time.sleep(1)
print(e.args[0] + "\n" + massage + ", try to click again ...\n")
if error_count == 0:
print(massage + ',try to click again fail,will exit...')
exit()
def main_page():
time.sleep(10)
keyboard.press_and_release("Esc")
time.sleep(10)
def main_page_photo():
try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\photo.png',
massage='click click in(打开主页后,点击拍照按钮)')
keyboard.parse_hotkey("Ctrl+H")
time.sleep(10)
keyboard.press_and_release("Enter")
try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\save.png',
massage='click click in(点击保存按钮)')
try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\exit.png',
massage='click click in(点击退出按钮)')
try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\exit.png',
massage='click click in(点击退出(二次退出)按钮)')
def main_page_advs():
try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\advs.png',
massage='click click in(打开主页后,点击公告按钮)')
try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\game_advs.png',
massage='click click in(点击游戏公告)')
while True:
png_path = r'E:\python\auto_exe\yuanshen\photo\ico_1.png'
screen = lackey.Screen()
ico_1_list = list(screen.findAll(png_path))
if len(ico_1_list) != 0:
for index in range(len(ico_1_list)):
screen.click(ico_1_list[index])
time.sleep(1)
try:
screen = lackey.Screen()
click_png = lackey.Pattern(r'E:\python\auto_exe\yuanshen\photo\game_advs_end.png')
screen.click(click_png)
break
except Exception as e:
print(e.args[0] + "\n未定位到【公平运营声明】公告,结束条件不满足")
mouse.scroll(coords=(270, 415), wheel_dist=-1)
print("鼠标滚动!")
try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\active_advs.png',
massage='click click in(点击游戏公告)')
while True:
png_path = r'E:\python\auto_exe\yuanshen\photo\ico_1.png'
screen = lackey.Screen()
ico_1_list = list(screen.findAll(png_path))
if len(ico_1_list) != 0:
for index in range(len(ico_1_list)):
screen.click(ico_1_list[index])
time.sleep(1)
time.sleep(1)
try:
screen = lackey.Screen()
click_png = lackey.Pattern(r'E:\python\auto_exe\yuanshen\photo\active_exit.png')
screen.click(click_png)
break
except Exception as e:
print(e.args[0] + "\n未定位到【神铸赋形】公告,结束条件不满足")
mouse.scroll(coords=(270, 415), wheel_dist=-1)
print("鼠标滚动!")
def main_page_email():
try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\email.png',
massage='click click in(打开主页后,点击邮件按钮)')
screen = lackey.Screen()
ico_1_list = list(screen.findAll(r'E:\python\auto_exe\yuanshen\photo\no_email.png'))
if len(ico_1_list) != 0:
keyboard.press_and_release("Esc")
time.sleep(5)
keyboard.press_and_release("Esc")
return
try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\delete_read_finish.png',
massage='click click in(点击删除已读按钮')
try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\yes.png',
massage='click click in(点击 确认删除按钮')
try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\all_get.png',
massage='click click in(点击【全部领取】按钮)')
mouse.press(Button.LEFT)
time.sleep(5)
keyboard.press_and_release("Esc")
time.sleep(5)
keyboard.press_and_release("Esc")
time.sleep(5)
def main_page_adjust_time():
try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\email.png',
massage='click click in(打开主页后,点击调整时间)')
def run(mihoyo_path=''):
main_page()
main_page_email()
if __name__ == '__main__':
run(mihoyo_path=r'D:\yuanshen\Genshin Impact\launcher.exe')
当前程序涉及的库
import time
import keyboard
import lackey
import pywinauto
from PIL import ImageGrab
这种风险很大,你并不知道我exe程序中到底写的程序是怎么样的,万一是个后台进程记录你的个人隐私,
在通过网络传输给我呢,所以一般没有经过认证的exe不要直接使用。
鼠标键盘完全自动化,所以鼠标轨迹都是直线的,显得很僵硬。当前程序涉及的库import time # 用于延迟处理,由于网络波动页面加载需要一定的时间,可用延迟加载的处理方式import keyboard # 用于原神当中打开页面使用,像Esc可以从主界面进入到个人主页,Enter可以实现拍照# Ctrl+H 实现拍照全屏import lackey # 实现按钮锁定,根据截图在屏幕中锁定位置,之后可以进行点击import pywinauto # 实现自动化打开exe程序
lackey.Screen() 入参:int类型0表示主监视器,屏幕1
lackey.Pattern() 入参: image 要匹配的图片
lackey.click() lackyy.wait 入参 lackey.Pattern 当然可以直接入参image ,但是不建议这么做!
def test_023(self):
# 选择屏幕,0是主监视器
r = lackey.Screen(0)
# 等待账号输入框、出现后点击
Lackey是Sikuli脚本的Python实现,允许您使用纯Python运行在Sikuli编辑器中开发的自动化脚本。 如果您试图在不依赖Java的环境中运行Sikuli脚本或将它们集成到现有的Python测试结构中,那么这是适合您的库。
安装简单:
pip install Lackey
然后,您可以将Lackey导入Sikuli-script python文件的头部:
from lackey import *
警告请注意,这将创建将覆盖某些Python函数(例如type()全局方法。 有关更多信息,请参见下面的“ Sikuli修补”部分。
安装Tesseract OCR
OCR功能取决于第三方实用程序Tesseract OCR(v3.05 +)。 您适用于您平台
python+pywinauto+lackey实现PC端exe自动化欢迎阅读框架介绍环境搭建Tim自动化完整代码写在最后
最近一年多一直在从事PC端exe的测试,也是趁着闲余时间,调研了下exe的自动化。
核心框架为python+pywinauto+lackey这样的一个组合方式
本文以大家熟知的Tim为例子,实现打开exe,输入账号密码并且登录,搜索具体聊天对象,发送消息,并退出账号的一系列简单操作。
依然是从环境搭建开始,我会尽我所能,详细的去介绍每一步,让各位能看懂我每一步操作的目的和理由。
一、pyautogui模块简要说明
## 使用 pyautogui 模块相关函数,可以模拟鼠标及键盘操作, 完整说明文档见: http://pyautogui.readthedocs.org/
# pip install pyautogui
# 要注意的是,模拟移动鼠标与击键可能太快,导致其他程序跟不上,并且程序可能失去控制,
# 需要掌握如何从问题中恢复,至少要能中止它。
# 防止或恢复GUI自动化问题
# 1) 使用pyautogui.PAUSE设置每个PyAutoGUI函数调
app.UntitledNotepad.menu_select("File->SaveAs")
app.SaveAs.ComboBox5.select("UTF-8")
app.SaveAs.edit1.set_te
Cannot run program “D:\jdk8\bin\java.exe“ (in directory “C:\Users\Administrator\AppData\Local\JetBra
Cannot run program “D:\jdk8\bin\java.exe“ (in directory “C:\Users\Administrator\AppData\Local\JetBra
acid_zch: