我的需求是不通过鼠标也能实现点击等操作 就像浏览器脚本一样 可以不用鼠标,可以在自动化脚本运行时我们能做其他的事,但是经过上时间的发掘,我没发现这些库能较好地实现这样的需求
winappdriver+appium:
认可度较大的一款自动化工具
网上的代码几乎都要在安装appium1.3版本才能较好的运行 高版本会有w3c标准 代码api大幅改动(真是服了)。winappdriver只是提供一个服务,代码是用appium写
评价:
优点:能操作所有inspect.exe能获取的控件 和大多数自动化工具是差不多一样的 认可度较高
appium同时是安卓端自动化的火热代码库
缺点:不能满足不通过鼠标实现点击等操作的需求 唉 还有就是网上的教程很少 讲解少 得自己摸 苦逼 唉
计算器自动化操作代码示例:
import unittest
from appium import webdriver
import time
class SimpleCalculatorTests(unittest.TestCase):
@classmethod
def setUpClass(self):
#set up appium
desired_caps = {}
desired_caps["app"] = "Microsoft.WindowsCalculator_8wekyb3d8bbwe!App"
# desired_caps["app"] = r"D:\Program Files (x86)\Tencent\QQ\Bin\QQScLauncher.exe"
# desired_caps = {
# # "app": r"D:\Program Files (x86)\XMind\XMind.exe",
# "app": r"D:\Program Files (x86)\Tencent\QQ\Bin\QQScLauncher.exe",
# 'platformName': 'Windows',
# 'automationName': 'Windows'
# }
self.driver = webdriver.Remote(
command_executor='http://127.0.0.1:4723',
desired_capabilities= desired_caps)
@classmethod
def tearDownClass(self):
self.driver.quit()
def getresults(self):
displaytext = self.driver.find_element_by_accessibility_id("CalculatorResults").text
displaytext = displaytext.strip("Display is " )
displaytext = displaytext.rstrip(' ')
displaytext = displaytext.lstrip(' ')
return displaytext
def test_initialize(self):
print("111111")
print(self.driver.find_element_by_name("清除"))
self.driver.find_element_by_name("七").click()
self.assertEqual(self.getresults(),"7")
# self.driver.find_element_by_name("Clear").click()
time.sleep(10)
def test_addition(self):
self.driver.find_element_by_name("一").click()
self.driver.find_element_by_name("加").click()
self.driver.find_element_by_name("七").click()
self.driver.find_element_by_name("等于").click()
self.assertEqual(self.getresults(),"8")
def test_combination(self):
self.driver.find_element_by_name("七").click()
self.driver.find_element_by_name("除以").click()
self.driver.find_element_by_name("九").click()
self.driver.find_element_by_name("加").click()
self.driver.find_element_by_name("一").click()
self.driver.find_element_by_name("等于").click()
self.driver.find_element_by_name("等于").click()
self.driver.find_element_by_name("八").click()
self.driver.find_element_by_name("等于").click()
self.assertEqual(self.getresults(),"8")
def test_division(self):
self.driver.find_element_by_name("八").click()
self.driver.find_element_by_name("八").click()
self.driver.find_element_by_name("除以").click()
self.driver.find_element_by_name("一").click()
self.driver.find_element_by_name("一").click()
self.driver.find_element_by_name("等于").click()
self.assertEqual(self.getresults(),"8")
def test_multiplication(self):
self.driver.find_element_by_name("九").click()
self.driver.find_element_by_name("除以").click()
self.driver.find_element_by_name("九").click()
self.driver.find_element_by_name("等于").click()
self.assertEqual(self.getresults(),"81")
def test_subtraction(self):
self.driver.find_element_by_name("九").click()
self.driver.find_element_by_name("减").click()
self.driver.find_element_by_name("一").click()
self.driver.find_element_by_name("等于").click()
self.assertEqual(self.getresults(),"8")
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(SimpleCalculatorTests)
unittest.TextTestRunner(verbosity=2).run(suite)
input("运行结束...")
uiautomation
是api较方便、完善的一款自动化库 个人感觉比winappdriver好用
安装时容易遇到问题 记得管理员打开cmd安装!!!!!
评价:
优点:和winappdriver一样 很多控件都适用! 集成度高,api较方便、完善的,网上很多教程 很适合学习 且很好用
缺点:还是 唉 不占用鼠标就不能运行
记事本自动化操作代码示例:
from time import sleep
import uiautomation as auto
class Calc():
def open_calc(self):
#打开计算器
desktop=auto.PaneControl(Name='任务栏')
#点击任务栏
desktop.Click()
#Win+D ,显示桌面
desktop.SendKeys('{Win}d')
#Win+R ,打开运行界面,并输入calc,打开浏览器
desktop.SendKeys('{Win}r')
run_win = auto.WindowControl(Name='运行')
run_win_edit=run_win.EditControl(ClassName='Edit',Name='打开(O):')
run_win_edit.SendKeys("calc")
run_win_ok=run_win.ButtonControl(ClassName="Button",Name='确定')
run_win_ok.Click()
sleep(3)
def calc_auto(self):
calc_win=auto.WindowControl(ClassName='ApplicationFrameWindow',Name="计算器")
# 开始计算
calc_five=calc_win.ButtonControl(Name='五')
calc_five.Click()
calc_five.Click()
calc_mult=calc_win.ButtonControl(Name='乘以')
calc_mult.Click()
calc_one = calc_win.ButtonControl(Name='一')
calc_one.Click()
calc_three = calc_win.ButtonControl(Name='三')
calc_three.Click()
calc_four = calc_win.ButtonControl(Name='四')
calc_four.Click()
calc_equal= calc_win.ButtonControl(Name="等于")
calc_equal.Click()
sleep(3)
calc_win_close_btn = calc_win.ButtonControl(AutomationId='Close')
calc_win_close_btn.Click()
if __name__ == '__main__':
calc = Calc()
calc.open_calc()
calc.calc_auto()
win32gui、win32api、win32con三个包
是python操作桌面、窗口常用的包,适用于小型的自动化脚本
评价:
优点:终于!!!这个是可以做到不用鼠标实现点击操作的工具!!!!!
缺点:代码难写 难懂 集成度小,api很少,适用的控件少的可怜 唉 市面上的软件几乎都用不了 哭死
自动点击出现的提示messageBox代码示例:
import win32gui
import win32api
import win32con
import time
# 定义函数查找窗口中符合条件的控件句柄
def find_control(hwnd, control_class, control_name):
handle = win32gui.FindWindowEx(hwnd, None, control_class, control_name)
return handle
# 通过窗口标题查找窗口句柄
while True:
hwnd = win32gui.FindWindow(None, "错误") # 找名为错误的窗口
if hwnd ==0:
hwnd = win32gui.FindWindow(None, "下载成功") # 找名为下载成功的窗口
for i in range(3):
try:
if hwnd != 0:
# 查找“确定”按钮的句柄
button_hwnd = find_control(hwnd, "Button", "确定") # 找hwnd为父组件 控件类属为Button text名为确定的控件的句柄
if button_hwnd != 0: # 对该句柄进行操作
# 模拟鼠标左键点击该按钮
win32api.PostMessage(button_hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, 0)
win32api.PostMessage(button_hwnd, win32con.WM_LBUTTONUP, None, 0)
print("已点击确定按钮")
else:
print("未找到指定按钮")
else:
print("未找到指定窗口",end='')
except:
print("出错!")
time.sleep(1)
pyautogui
我主要就是用的这个库写的某站的脚本 这个所有控件都适用(因为它不以控件来定位) 但是不适合大型自动化脚本。通过图片识别等方式或点击固定区域进行自动化操作
评价:
优点:是非控件的自动化工具,其中的图像识别点击是一大亮点
缺点:图像识别不能保证正确(能设置识别度) 最近发现在副屏幕好像几乎识别不了;完全非控件的话会很不方便
综上所述 个人而言 uiautomation是最佳选择