前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于python3+pynput进行录制和回放

基于python3+pynput进行录制和回放

作者头像
用户6367961
发布2021-08-13 14:29:18
2K1
发布2021-08-13 14:29:18
举报
文章被收录于专栏:自学测试之道

无意间在网上找到关于python3+pynput下进行监控、录制鼠标、键盘的操作,使得项目自动化测试更完善了。具体代码如下:

录制鼠标、键盘操作

代码语言:javascript
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#  @Time    : 2021-07-23 21:30
#  @Author  : zhong
#  @Site    :
#  @File    : Doctor_Workstation.py
#  @Software: PyCharm

import pynput
import time
import re
import threading

class ControlMouseKeyboard(object):
    mouse = pynput.mouse.Controller()
    keyboard = pynput.keyboard.Controller()

    mouse_listener = None
    keyboard_listener = None
    mouse_keyboard_move = []
    time_order = []

    default_keys = {
        'Key.alt': pynput.keyboard.Key.alt,
        'Key.alt_l': pynput.keyboard.Key.alt_l,
        'Key.alt_r': pynput.keyboard.Key.alt_r,
        'Key.alt_gr': pynput.keyboard.Key.alt_gr,
        'Key.backspace': pynput.keyboard.Key.backspace,
        'Key.caps_lock': pynput.keyboard.Key.caps_lock,
        'Key.cmd': pynput.keyboard.Key.cmd,
        'Key.cmd_l': pynput.keyboard.Key.cmd_l,
        'Key.cmd_r': pynput.keyboard.Key.cmd_r,
        'Key.ctrl': pynput.keyboard.Key.ctrl,
        'Key.ctrl_l': pynput.keyboard.Key.ctrl_l,
        'Key.ctrl_r': pynput.keyboard.Key.ctrl_r,
        'Key.delete': pynput.keyboard.Key.delete,
        'Key.down': pynput.keyboard.Key.down,
        'Key.end': pynput.keyboard.Key.end,
        'Key.enter': pynput.keyboard.Key.enter,
        'Key.esc': pynput.keyboard.Key.esc,
        'Key.f1': pynput.keyboard.Key.f1,
        'Key.f2': pynput.keyboard.Key.f2,
        'Key.f3': pynput.keyboard.Key.f3,
        'Key.f4': pynput.keyboard.Key.f4,
        'Key.f5': pynput.keyboard.Key.f5,
        'Key.f6': pynput.keyboard.Key.f6,
        'Key.f7': pynput.keyboard.Key.f7,
        'Key.f8': pynput.keyboard.Key.f8,
        'Key.f9': pynput.keyboard.Key.f9,
        'Key.f10': pynput.keyboard.Key.f10,
        'Key.f11': pynput.keyboard.Key.f11,
        'Key.f12': pynput.keyboard.Key.f12,
        'Key.f13': pynput.keyboard.Key.f13,
        'Key.f14': pynput.keyboard.Key.f14,
        'Key.f15': pynput.keyboard.Key.f15,
        'Key.f16': pynput.keyboard.Key.f16,
        'Key.f17': pynput.keyboard.Key.f17,
        'Key.f18': pynput.keyboard.Key.f18,
        'Key.f19': pynput.keyboard.Key.f19,
        'Key.f20': pynput.keyboard.Key.f20,
        'Key.home': pynput.keyboard.Key.home,
        'Key.left': pynput.keyboard.Key.left,
        'Key.page_down': pynput.keyboard.Key.page_down,
        'Key.page_up': pynput.keyboard.Key.page_up,
        'Key.right': pynput.keyboard.Key.right,
        'Key.shift': pynput.keyboard.Key.shift,
        'Key.shift_l': pynput.keyboard.Key.shift_l,
        'Key.shift_r': pynput.keyboard.Key.shift_r,
        'Key.space': pynput.keyboard.Key.space,
        'Key.tab': pynput.keyboard.Key.tab,
        'Key.up': pynput.keyboard.Key.up,
        'Key.insert': pynput.keyboard.Key.insert,
        'Key.menu': pynput.keyboard.Key.menu,
        'Key.num_lock': pynput.keyboard.Key.num_lock,
        'Key.pause': pynput.keyboard.Key.pause,
        'Key.print_screen': pynput.keyboard.Key.print_screen,
        'Key.scroll_lock': pynput.keyboard.Key.scroll_lock
    }

    def set_mouse_coordinates(self, x, y):
        # 设置鼠标坐标
        self.mouse.position = (x, y)

    def mouse_move_scroll(self, x, y):
        # 鼠标滚轮
        self.mouse.scroll(x, y)              # 滚动鼠标

    def mouse_move(self, x, y):
        """监听鼠标移动"""
        happen_time = time.time()
        self.time_order.append(happen_time)
        time_index = self.time_order.index(happen_time)
        if time_index != 0:
            sleep_time = happen_time - self.time_order[time_index - 1]
        else:
            sleep_time = 0
        self.mouse_keyboard_move.append((x, y, sleep_time))

    def mouse_right_click(self, x, y, key, state):
        happen_time = time.time()
        self.time_order.append(happen_time)
        time_index = self.time_order.index(happen_time)
        if time_index != 0:
            sleep_time = happen_time - self.time_order[time_index - 1]
        else:
            sleep_time = 0
        self.mouse_keyboard_move.append((x, y, key, state, sleep_time))

    def mouse_click(self, x, y, button, pressed):
        """监听鼠标点击"""
        if pressed:
            if button == pynput.mouse.Button.left:
                self.mouse_right_click(x, y, 'left', 'pressed')
            elif button == pynput.mouse.Button.middle:
                self.mouse_right_click(x, y, 'middle', 'pressed')
            elif button == pynput.mouse.Button.right:
                self.mouse_right_click(x, y, 'right', 'pressed')
        else:
            if button == pynput.mouse.Button.left:
                self.mouse_right_click(x, y, 'left', 'release')
            elif button == pynput.mouse.Button.middle:
                self.mouse_right_click(x, y, 'middle', 'release')
            elif button == pynput.mouse.Button.right:
                self.mouse_right_click(x, y, 'right', 'release')

    def mouse_scroll(self, x, y, dx, dy):
        """监听鼠标滚轮"""
        happen_time = time.time()
        self.time_order.append(happen_time)
        time_index = self.time_order.index(happen_time)
        if time_index != 0:
            sleep_time = happen_time - self.time_order[time_index - 1]
        else:
            sleep_time = 0
        self.mouse_keyboard_move.append((x, y, 'middle', dx, dy * 50, sleep_time))

    def listener_mouse(self):
        """监听鼠标、键盘"""
        self.mouse_listener = pynput.mouse.Listener(on_move=self.mouse_move, on_click=self.mouse_click,
                                                    on_scroll=self.mouse_scroll)
        self.keyboard_listener = pynput.keyboard.Listener(on_press=self.keyboard_input_press,
                                                          on_release=self.keyboard_input_release)
        self.mouse_listener.start()
        self.keyboard_listener.start()
        self.mouse_listener.join()
        self.keyboard_listener.join()
        return

    def keyboard_input_press(self, key):
        """按键按下"""
        happen_time = time.time()
        self.time_order.append(happen_time)
        time_index = self.time_order.index(happen_time)
        if time_index != 0:
            sleep_time = happen_time - self.time_order[time_index - 1]
        else:
            sleep_time = 0
        self.mouse_keyboard_move.append((str(key), True, sleep_time))

    def keyboard_input_release(self, key):
        """按键释放"""
        happen_time = time.time()
        self.time_order.append(happen_time)
        time_index = self.time_order.index(happen_time)
        if time_index != 0:
            sleep_time = happen_time - self.time_order[time_index - 1]
        else:
            sleep_time = 0
        self.mouse_keyboard_move.append((str(key), False, sleep_time))
        if key == pynput.keyboard.Key.esc:
            self.stop_listener_keyoard()
            with open('./Mouse_monitoring.txt', "w") as f:
                for i in self.mouse_keyboard_move:
                    f.write(str(i) + '\n')
                f.close()

    def stop_listener_keyoard(self):
        pynput.keyboard.Listener.stop(self.keyboard_listener)
        pynput.mouse.Listener.stop(self.mouse_listener)

    def click_mouse_press(self, x, y, keys):
        self.set_mouse_coordinates(x, y)
        if keys == 'left':
            self.mouse.press(pynput.mouse.Button.left)
        elif keys == 'right':
            self.mouse.press(pynput.mouse.Button.right)
        elif keys == 'middle':
            self.mouse.press(pynput.mouse.Button.middle)

    def click_mouse_release(self, x, y, keys):
        self.set_mouse_coordinates(x, y)
        if keys == 'left':
            self.mouse.release(pynput.mouse.Button.left)
        elif keys == 'right':
            self.mouse.release(pynput.mouse.Button.right)
        elif keys == 'middle':
            self.mouse.release(pynput.mouse.Button.middle)

    def keyboard_press_key(self, word):
        self.keyboard.press(word)  # 按下

    def keyboard_release_key(self, word):
        self.keyboard.release(word)  # 松开

    def listener_all(self):
        thread_obj = threading.Thread(target=A.listener_mouse)
        thread_obj.start()

if __name__ == '__main__':
    A = ControlMouseKeyboard()
    A.listener_all()

通过上面的录制操作,把经过鼠标或键盘操作的坐标或记录,保存在指定的文本文件,如:Mouse_monitoring.txt

回放记录

代码语言:javascript
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#  @Time    : 2021-07-23 21:30
#  @Author  : zhong
#  @Site    :
#  @File    : Doctor_Workstation.py
#  @Software: PyCharm

import pynput
import time
import re
import threading

class ControlMouseKeyboard(object):
    mouse = pynput.mouse.Controller()
    keyboard = pynput.keyboard.Controller()

    mouse_listener = None
    keyboard_listener = None
    mouse_keyboard_move = []
    time_order = []

    default_keys = {
        'Key.alt': pynput.keyboard.Key.alt,
        'Key.alt_l': pynput.keyboard.Key.alt_l,
        'Key.alt_r': pynput.keyboard.Key.alt_r,
        'Key.alt_gr': pynput.keyboard.Key.alt_gr,
        'Key.backspace': pynput.keyboard.Key.backspace,
        'Key.caps_lock': pynput.keyboard.Key.caps_lock,
        'Key.cmd': pynput.keyboard.Key.cmd,
        'Key.cmd_l': pynput.keyboard.Key.cmd_l,
        'Key.cmd_r': pynput.keyboard.Key.cmd_r,
        'Key.ctrl': pynput.keyboard.Key.ctrl,
        'Key.ctrl_l': pynput.keyboard.Key.ctrl_l,
        'Key.ctrl_r': pynput.keyboard.Key.ctrl_r,
        'Key.delete': pynput.keyboard.Key.delete,
        'Key.down': pynput.keyboard.Key.down,
        'Key.end': pynput.keyboard.Key.end,
        'Key.enter': pynput.keyboard.Key.enter,
        'Key.esc': pynput.keyboard.Key.esc,
        'Key.f1': pynput.keyboard.Key.f1,
        'Key.f2': pynput.keyboard.Key.f2,
        'Key.f3': pynput.keyboard.Key.f3,
        'Key.f4': pynput.keyboard.Key.f4,
        'Key.f5': pynput.keyboard.Key.f5,
        'Key.f6': pynput.keyboard.Key.f6,
        'Key.f7': pynput.keyboard.Key.f7,
        'Key.f8': pynput.keyboard.Key.f8,
        'Key.f9': pynput.keyboard.Key.f9,
        'Key.f10': pynput.keyboard.Key.f10,
        'Key.f11': pynput.keyboard.Key.f11,
        'Key.f12': pynput.keyboard.Key.f12,
        'Key.f13': pynput.keyboard.Key.f13,
        'Key.f14': pynput.keyboard.Key.f14,
        'Key.f15': pynput.keyboard.Key.f15,
        'Key.f16': pynput.keyboard.Key.f16,
        'Key.f17': pynput.keyboard.Key.f17,
        'Key.f18': pynput.keyboard.Key.f18,
        'Key.f19': pynput.keyboard.Key.f19,
        'Key.f20': pynput.keyboard.Key.f20,
        'Key.home': pynput.keyboard.Key.home,
        'Key.left': pynput.keyboard.Key.left,
        'Key.page_down': pynput.keyboard.Key.page_down,
        'Key.page_up': pynput.keyboard.Key.page_up,
        'Key.right': pynput.keyboard.Key.right,
        'Key.shift': pynput.keyboard.Key.shift,
        'Key.shift_l': pynput.keyboard.Key.shift_l,
        'Key.shift_r': pynput.keyboard.Key.shift_r,
        'Key.space': pynput.keyboard.Key.space,
        'Key.tab': pynput.keyboard.Key.tab,
        'Key.up': pynput.keyboard.Key.up,
        'Key.insert': pynput.keyboard.Key.insert,
        'Key.menu': pynput.keyboard.Key.menu,
        'Key.num_lock': pynput.keyboard.Key.num_lock,
        'Key.pause': pynput.keyboard.Key.pause,
        'Key.print_screen': pynput.keyboard.Key.print_screen,
        'Key.scroll_lock': pynput.keyboard.Key.scroll_lock
    }

    def set_mouse_coordinates(self, x, y):
        # 设置鼠标坐标
        self.mouse.position = (x, y)

    def mouse_move_scroll(self, x, y):
        # 鼠标滚轮
        self.mouse.scroll(x, y)              # 滚动鼠标
    def mouse_scroll(self, x, y, dx, dy):
        """监听鼠标滚轮"""
        happen_time = time.time()
        self.time_order.append(happen_time)
        time_index = self.time_order.index(happen_time)
        if time_index != 0:
            sleep_time = happen_time - self.time_order[time_index - 1]
        else:
            sleep_time = 0
        self.mouse_keyboard_move.append((x, y, 'middle', dx, dy * 50, sleep_time))

    def click_mouse_press(self, x, y, keys):
        self.set_mouse_coordinates(x, y)
        if keys == 'left':
            self.mouse.press(pynput.mouse.Button.left)
        elif keys == 'right':
            self.mouse.press(pynput.mouse.Button.right)
        elif keys == 'middle':
            self.mouse.press(pynput.mouse.Button.middle)

    def click_mouse_release(self, x, y, keys):
        self.set_mouse_coordinates(x, y)
        if keys == 'left':
            self.mouse.release(pynput.mouse.Button.left)
        elif keys == 'right':
            self.mouse.release(pynput.mouse.Button.right)
        elif keys == 'middle':
            self.mouse.release(pynput.mouse.Button.middle)
    def playback(self):
        """回放脚本函数"""
        with open('aa.txt', "r") as f:       #  读取已录制保存的txt文档内容
            for line in f.readlines():
                double_list = re.findall(r'[A-Za-z0-9._/;\[\]\\\=\-\`]+', line)
                print(double_list)
                if 'pressed' in line:
                    time.sleep(float(double_list[4]))
                    self.click_mouse_press(int(double_list[0]), int(double_list[1]), double_list[2])
                elif 'release' in line:
                    time.sleep(float(double_list[4]))
                    self.click_mouse_release(int(double_list[0]), int(double_list[1]), double_list[2])
                elif 'middle' in line:
                    time.sleep(float(double_list[5]))
                    self.mouse_move_scroll(int(double_list[3]), int(double_list[4]))
                elif 'Key' in line:
                    if 'Key.esc' in line:
                        pass
                        print(u"程序运行结束")
                    else:
                        if 'True' in line:
                            self.keyboard_press_key(self.default_keys[double_list[0]])
                        if 'False' in line:
                            self.keyboard_release_key(self.default_keys[double_list[0]])
                else:
                    if 'True' in line:
                        self.keyboard_press_key(double_list[0])
                    elif 'False' in line:
                        self.keyboard_release_key(double_list[0])
                    else:
                        time.sleep(0.005)
                        self.set_mouse_coordinates(int(double_list[0]), int(double_list[1]))

    def keyboard_press_key(self, word):
        self.keyboard.press(word)  # 按下

    def keyboard_release_key(self, word):
        self.keyboard.release(word)  # 松开

if __name__ == '__main__':
    Mouse_monitoring = ControlMouseKeyboard()
    Mouse_monitoring.playback()

单独使用此脚本跑了一遍,可以解决重复步骤的手工操作,或者指定步骤的复现操作等。但是要想更好的完成自动化操作,感觉还是需要进一步优化。因为假如在自动化过程中,应用报错或者弹出其他的一些异常提示,根本无法捕捉或截图等。

好记性不如烂笔头,继续学习中

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 自学测试之道 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档