Desktop-Automatisierung winappdriver, uiautomation, win32, pyautogui...

Meine Anforderung besteht darin, klicken und andere Vorgänge ausführen zu können, ohne die Maus zu verwenden. Genau wie Browser-Skripte können wir andere Dinge tun, während das Automatisierungsskript ausgeführt wird. Um diese Anforderungen gut zu erfüllen

winappdriver+appium:

Ein anerkanntes Automatisierungstool

Die Codes im Internet müssen fast die Appium1.3-Version installieren , um besser zu laufen. Die höhere Version wird den W3C-Standard haben und die Code-API wurde stark geändert (wirklich überzeugt). winappdriver stellt lediglich einen Dienst bereit, der Code ist in Appium geschrieben

auswerten:

Vorteile: Es kann alle Steuerelemente bedienen, die inspect.exe erhalten kann. Es ist fast dasselbe wie die meisten Automatisierungstools und weist einen hohen Erkennungsgrad auf.

Appium ist auch eine Hot-Code-Basis für die Android-seitige Automatisierung

Nachteile: Ohne die Verwendung der Maus können die Anforderungen des Klickens und anderer Vorgänge nicht erfüllt werden. Darüber hinaus gibt es im Internet nur wenige Tutorials, die weniger erklären, sodass Sie es selbst anfassen müssen. Es ist schwierig. Beispiel für einen Code für den Betrieb eines automatischen Taschenrechners
:


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("运行结束...")

UI-Automatisierung

Es handelt sich um eine Automatisierungsbibliothek mit einer bequemeren und vollständigeren API. Ich persönlich finde, dass sie einfacher zu verwenden ist als winappdriver

Während der Installation kann es leicht zu Problemen kommen. Denken Sie daran, dass der Administrator die cmd-Installation öffnet! ! ! ! !
auswerten:

Vorteile: Wie winappdriver sind viele Steuerelemente anwendbar! Die Integration ist hoch, die API ist bequemer und vollständiger und viele Tutorials im Internet eignen sich sehr gut zum Lernen und sind einfach zu verwenden

Nachteile: Es kann immer noch nicht ausgeführt werden, ohne die Maus in Anspruch zu nehmen

Beispiel für einen Notepad-Automatisierungscode:

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 drei Pakete

Es ist ein häufig verwendetes Paket für Python zum Betrieb von Desktops und Windows und eignet sich für kleine Automatisierungsskripte

auswerten:

Vorteile: Endlich! ! ! Dies ist ein Tool, das Klickvorgänge ohne Verwendung einer Maus ausführen kann! ! ! ! !

Nachteile: Der Code ist schwer zu schreiben und zu verstehen, die Integration ist gering, es gibt nur wenige APIs und die anwendbaren Steuerelemente sind erbärmlich.

Klicken Sie automatisch auf das angezeigte Codebeispiel für die Eingabeaufforderung 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

Ich verwende diese Bibliothek hauptsächlich, um ein Skript für eine bestimmte Station zu schreiben. Alle Steuerelemente sind anwendbar (da sie nicht durch Steuerelemente positioniert werden), aber sie ist nicht für umfangreiche Automatisierungsskripte geeignet. Automatische Bedienung mittels Bilderkennung oder durch Anklicken eines festen Bereichs

Bewertung:
Vorteile: Es handelt sich um ein nicht kontrollierbares automatisiertes Tool, und der Bilderkennungsklick ist ein Highlight

Nachteile: Es kann nicht garantiert werden, dass die Bilderkennung korrekt ist (Erkennungsgrad kann eingestellt werden). In letzter Zeit scheint es fast unmöglich zu sein, es auf dem sekundären Bildschirm zu erkennen. Es wäre sehr unpraktisch, wenn es überhaupt keine Kontrolle wäre

Zusammenfassend ist UIAutomation für mich persönlich die beste Wahl

おすすめ

転載: blog.csdn.net/conquer_galaxy/article/details/130460599