桌面自动化winappdriver、uiautomation、win32、pyautogui...

我的需求是不通过鼠标也能实现点击等操作 就像浏览器脚本一样  可以不用鼠标,可以在自动化脚本运行时我们能做其他的事,但是经过上时间的发掘,我没发现这些库能较好地实现这样的需求

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是最佳选择

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值