赞
踩
目录
在使用 Selenium 进行自动化测试时,鼠标事件可以用 ActionChains 类,键盘事件可以用 Keys 类。本篇将介绍一款自动化工具-PyAutoGUI,除了可以满足鼠标、键盘事件操作外,还可以进行消息弹窗、截屏等操作。
PyAutoGUI 是一个纯 Python 的 GUI 自动化工具,其目的是可以用程序自动控制鼠标和键盘操作,多平台支持(Windows,macOS,Linux),并在 Python 2 和 3 上运行。
PyAutoGUI 可以模拟鼠标的移动、点击、拖拽,键盘按键输入、按住操作,以及鼠标+键盘的热键同时按住等操作,可以说手能动的都可以。
PyAutoGUI 有几个特点:
1、移动鼠标并单击其他应用程序的窗口。
2、向应用程序发送点击输入(例如,填写表格)。
3、截取屏幕截图,并给出一个图像(例如,一个按钮或复选框),然后在屏幕上找到它。
4、找到应用程序的窗口,然后移动、调整大小、最大化、最小化或关闭它(目前仅限 Windows)。
5、显示警报和消息框。
Github地址:
https://github.com/asweigart/pyautogui
1、Windows 环境下
PyAutoGUI 没有任何依赖,因为它用 Python 的 ctypes 模块,所以不需要 pywin32。
pip3 install pyautogui
2、macOS 环境下
PyAutoGUI 需要 PyObjC 运行 AppKit 和 Quartz 模块。
- sudo pip3 install pyobjc-core
- sudo pip3 install pyobjc
- sudo pip3 install pyautogui
3、Linux 环境下
PyAutoGUI 需要 python-xlib(Python 2)、python3-Xlib(Python 3)
- sudo pip3 install python3-xlib
- sudo apt-get scrot
- sudo apt-get install python-tk
- sudo apt-get install python3-dev
- sudo pip3 install pyautogui
position():返回整数元组 (x, y),分别表示鼠标光标所在位置的 XY 轴坐标。
size():返回显示器的尺寸整数元组 (x, y)。
onScreen():要检查 XY 坐标是否在屏幕上,需要用此函数来检验,如果在屏幕上返回 True,否则返回 False。
1、获取当前鼠标的坐标
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # 公众号:AllTests软件测试
-
- import pyautogui
- print(pyautogui.position())
运行结果:
2、获取当前屏幕的分辨率(宽度和高度)
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # 公众号:AllTests软件测试
-
- import pyautogui
- print(pyautogui.size())
运行结果:
3、判断坐标是否在屏幕上
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # 公众号:AllTests软件测试
-
- import pyautogui
- x, y = 500, 600
- print(pyautogui.onScreen(x, y))
运行结果:
PAUSE 方法可以进行增加延迟时间,例如 3.5 秒。
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # 公众号:AllTests软件测试
-
- import pyautogui
- pyautogui.PAUSE = 3.5
屏幕位置使用 X 和 Y 轴的笛卡尔坐标系。
原点 (0,0) 在左上角,分别向右、向下增大。
如果屏幕像素是 1920*1080,那么右下角的坐标是 (1919, 1079)。
moveTo():函数会把鼠标光标移动到指定的 XY 轴坐标处。如果传入 None 值,则表示使用当前光标的对象轴坐标值。
moveRel():如果你想让光标以当前位置为原点,进行相对移动,就用此函数。
dragTo() 和 dragRel():函数与 moveTo() 和 moveRel() 函数类似。另外,他们有一个 button 参数可以设置成 left,middle 和 right 三个键。
click():函数模拟单击鼠标左键一次的行为。参数可以设置,其中,button 属性可以设置成 left,middle 和 right。
doubleClick(),tripleClick() 和 rightClick():函数来实现双击、三击和右击操作。
mouseDown() 和 mouseUp():函数可以实现鼠标按下和鼠标松开的操作。两者参数相同,有 x,y 和 button。
scroll():函数控制鼠标滚轮的滚动,amount_to_scroll 参数表示滚动的格数。正数则页面向上滚动,负数则向下滚动。
1、鼠标移动
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # 公众号:AllTests软件测试
-
- import pyautogui
- num_seconds = 1.2
- # 用num_seconds秒的时间把光标移动到(x, y)位置
- pyautogui.moveTo(x, y, duration=num_seconds)
- # 用num_seconds秒的时间把光标的
- # X轴(水平)坐标移动xOffset,
- # Y轴(竖直)坐标向下移动yOffset。
- xOffset, yOffset = 50, 100
- pyautogui.moveRel(xOffset, yOffset, duration=num_seconds)
2、鼠标移动(缓动/渐变)- 改变光标移动过程的速度和方向。通常鼠标是匀速直线运动的。
- # 开始很慢,不断加速
- pyautogui.moveTo(100, 100, 2, pyautogui.easeInQuad)
- # 开始很快,不断减速
- pyautogui.moveTo(100, 100, 2, pyautogui.easeOutQuad)
- # 开始和结束都快,中间比较慢
- pyautogui.moveTo(100, 100, 2, pyautogui.easeInOutQuad)
- # 一步一徘徊前进
- pyautogui.moveTo(100, 100, 2, pyautogui.easeInBounce)
- # 徘徊幅度更大,甚至超过起点和终点
- pyautogui.moveTo(100, 100, 2, pyautogui.easeInElastic)
3、鼠标拖拽
- # 按住鼠标左键,把鼠标拖拽到(100, 200)位置
- pyautogui.dragTo(100, 200, button='left')
- # 按住鼠标左键,用2秒钟把鼠标拖拽到(300, 400)位置
- pyautogui.dragTo(300, 400, 2, button='left')
- # 按住鼠标右键,用2秒钟把鼠标拖拽到(30,0)位置
- pyautogui.dragTo(30, 0, 2, button='right')
4、鼠标点击
- # 先移动到(100, 200)再单击
- pyautogui.click(x=100, y=200, duration=2)
- # 右键
- pyautogui.click(button='right')
- # 双击左键
- pyautogui.click(clicks=2)
- # 两次单击之间停留0.25秒
- pyautogui.click(clicks=2, interval=0.25)
- # 三击右键
- pyautogui.click(button='right', clicks=2, interval=0.25)
5、鼠标按下和鼠标松开
- # 鼠标左键按下再松开
- pyautogui.mouseDown(); pyautogui.mouseUp()
- # 按下鼠标右键
- pyautogui.mouseDown(button='right')
- # 移动到(100, 200)位置,然后松开鼠标右键
- pyautogui.mouseUp(button='right', x=100, y=200)
6、鼠标滚动
- # 向上滚动10格
- pyautogui.scroll(10)
- # 向下滚动10格
- pyautogui.scroll(-10)
- # 移动到(100, 100)位置再向上滚动10格
- pyautogui.scroll(10, x=100, y=100)
typewrite():函数可以实现字符输入。要在两次输入间增加时间间隔,可以用 interval 参数。此函数只能用于单个字符键,不能按 SHITF 和 F1 这些功能键。
KEYBOARD_KEYS:获取按键名称。
press():函数把 pyautogui.KEYBOARD_KEYS 里面按键对应的字符串输入进去。
hotkey():函数来绑定若干键盘热键。像 Ctrl-S 或 Ctrl-Shift-1 都可以用此函数来实现。
1、键盘输入
- # 输入Hello world!
- pyautogui.typewrite('Hello world!')
- # 每次输入间隔0.25秒,输入Hello world!
- pyautogui.typewrite('Hello world!', interval=0.25)
- # 多个键也可以
- pyautogui.typewrite(['a', 'b', 'c', 'left', 'backspace', 'enter', 'f1'], interval=0.5)
2、按键名称
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # 公众号:AllTests软件测试
-
- import pyautogui
- print(pyautogui.KEYBOARD_KEYS)
运行结果:
3、键盘按键
- # ENTER键
- pyautogui.press('enter')
- # F1键
- pyautogui.press('f1')
- # 左方向键
- pyautogui.press('left')
- # 用数组把一组键传入
- pyautogui.press(['left', 'left', 'left'])
press() 函数其实是 keyDown() 和 keyUp() 函数的包装,模拟的按下然后松开两个动作。这两个函数可以单独调用。
例如,按下 shift 键的同时按3次左方向键。每个按键的按下和松开也可以单独调用。
- # 按下`shift`键
- pyautogui.keyDown('shift')
- pyautogui.press('left')
- pyautogui.press('left')
- pyautogui.press('left')
- # 松开`shift`键
- pyautogui.keyUp('shift')
4、键盘热键
- pyautogui.hotkey('ctrl', 'a') # 全选
- pyautogui.hotkey('ctrl', 'c') # 复制
- pyautogui.hotkey('ctrl', 'v') # 粘贴
如果你需要消息弹窗,通过单击 OK 暂停程序,或者向用户显示一些信息,消息弹窗函数就会有类似JavaScript 的功能。
alert():函数显示一个简单的带文字和 OK 按钮的消息弹窗。用户点击后返回 button 的文字。
confirm():函数显示一个简单的带文字、OK 和 Cancel 按钮的消息弹窗,用户点击后返回被点击 button 的文字,支持自定义数字、文字的列表。
prompt():函数可以输入的消息弹窗,带 OK 和 Cancel 按钮。用户点击 OK 按钮返回输入的文字,点击 Cancel 按钮返回 None。
password():函数样式同 prompt(),用于输入密码,消息用 * 表示。带 OK 和 Cancel 按钮。用户点击 OK 按钮返回输入的文字,点击 Cancel 按钮返回 None。
1、alert() 函数
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # 公众号:AllTests软件测试
-
- import pyautogui
- pyautogui.alert(text='点击OK按钮', title='alert()函数', button='OK')
运行结果:
2、confirm() 函数
(1)OK 和 Cancel 按钮的消息弹窗
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # 公众号:AllTests软件测试
-
- import pyautogui
- pyautogui.confirm(text='点击OK或Cancel按钮', title='confirm()函数', buttons=['OK', 'Cancel'])
运行结果:
(2)10 个按键 0-9 的消息弹窗
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # 公众号:AllTests软件测试
-
- import pyautogui
- pyautogui.confirm(text='点击0到9按钮', title='confirm()函数', buttons=range(10))
运行结果:
3、prompt() 函数
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # 公众号:AllTests软件测试
-
- import pyautogui
- pyautogui.prompt(text='输入消息弹窗', title='prompt()函数', default='用户点击OK')
运行结果:
4、password() 函数
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # 公众号:AllTests软件测试
-
- import pyautogui
- pyautogui.password(text='输入消息弹窗', title='password()函数', default='用户点击OK', mask='*')
运行结果:
PyAutoGUI 用 Pillow/PIL 库实现图片相关的识别和操作。
在 Linux 里面,你必须执行 sudo apt-get install scrot 来使用截屏特性。
1、截屏
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # 公众号:AllTests软件测试
-
- import pyautogui
- # 返回一个Pillow/PIL的Image对象
- pyautogui.screenshot()
- pyautogui.screenshot('Desktop.png')
运行结果:
如果你不需要截取整个屏幕,还有一个可选的 region 参数。你可以把截取区域的左上角 XY 坐标值和宽度、高度传入截取。
im = pyautogui.screenshot(region=(0,0,300,400))
2、如果你有一个图片文件想在上面做点击操作,你可以用 locateOnScreen() 函数来定位。
- # 返回(最左x坐标,最顶y坐标,宽度,高度)
- pyautogui.locateOnScreen('pyautogui/looks.png')
3、locateAllOnScreen() 函数会寻找所有相似图片,返回一个生成器。
- for i in pyautogui.locateAllOnScreen('pyautogui/looks.png'):
- print(i)
list(pyautogui.locateAllOnScreen('pyautogui/looks.png'))
4、locateCenterOnScreen() 函数会返回图片在屏幕上的中心 XY 轴坐标值。
pyautogui.locateCenterOnScreen('pyautogui/looks.png')
使用 Selenium 打开 Chrome 浏览器,访问百度首页,输入关键字进行查询,之后向下滚动后再进行截屏的一系列操作。
由于 PyAutoGUI 不支持中文输入,这里使用 pyperclip 库,采用“复制粘贴”的方式来输入中文。
注:由于作者是 macOS 环境下运行,ctrl+v 粘贴则是 command+v。
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # 公众号:AllTests软件测试
-
- import time
- import pyperclip
- import pyautogui
- from selenium import webdriver
- from selenium.webdriver.common.by import By
-
- class TestMyTest():
- def setup_method(self):
- self.driver = webdriver.Chrome()
- self.pyautogui = pyautogui
- self.pyperclip = pyperclip
-
- def teardown_method(self):
- self.driver.quit()
-
- def test_myTest(self):
- self.driver.get("https://www.baidu.com/")
- time.sleep(2)
- self.pyautogui.typewrite('pyautogui', interval=0.25)
- time.sleep(2)
- self.pyperclip.copy("自动化测试")
- time.sleep(2)
- self.pyautogui.hotkey('command', 'v')
- time.sleep(2)
- self.driver.find_element(By.ID, "su").click()
- time.sleep(2)
- self.pyautogui.scroll(-10)
- time.sleep(2)
- self.pyautogui.screenshot('Desktop.png')
精彩推荐
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。