デスクトップ アプリケーション オートメーション WinAppDriver の概要

1.WinAppDriverについて

1 はじめに

  • WinAppDriver の正式名は Windows Application Driver で、ユーザーが Selenium が Web を操作するのと同じように Windows アプリケーションを操作できるようにするための API を提供します。

  • サポートされるシステムは、Windows 10 (Home および Pro) および Windows Server 2016 です。

  • ソースコードはまだオープンソースではありません

  • WinAppDriver は、独立して実行することも、appium のプラグインとして使用することもできます。

2.サポートアプリケーションの種類

  • UWP  – ユニバーサル Windows プラットフォーム。ユニバーサル アプリまたはモダン アプリとも呼ばれ、Microsoft の最新のデスクトップ アプリケーション テクノロジです。XAML ベースです。Windows 10 マシンでのみ実行可能

  • WPF  - これも XAML ベースで、より成熟しており、どの Windows バージョンでも実行でき、2006 年から存在しています。

  • WinForms  - 古いテクノロジーの 1 つで、現在は主にレガシー アプリケーションで使用されています。

WPF と WinForms は、インターフェイス レンダリング メソッドの 2 つのセットです。1 つは、GDI を通じて描画される、従来の Windows インターフェイス要素のカプセル化です。もう 1 つは、まったく新しい dx レンダリング インターフェイスで、これも従来の Windows コントロールへの依存から脱却しており、歴史的な問題がなく、理論的にはよりクールなインターフェイスを表示できます。

  • MFC/クラシック Windows  - MFC は、通常 Win32 アプリケーションと組み合わせられる UI ライブラリです。このオプションは通常、低レベルの C++ 処理でさらなる効率が必要な場合、または Microsoft 以外のプラットフォームをサポートする場合に選択されます。

3. リソース

  • WinAppDriver
    https://github.com/microsoft/WinAppDriver/releases/tag/v1.2.1

  • 位置決めツール FlaUInspect
    https://github.com/FlaUI/FlaUInspect/WinAppDriver
    をリリース

  • 位置決めツール UIRcorder https://github.com/microsoft/WinAppDriver/tree/master/Tools/UIRecorder

  • 位置決めツール検査
    Microsoft 公式ツールが Windows SDK に統合されています

UIRecorder (以下では説明しません。参考とメモのみ)

  1. Visual Studio で WinAppDriverUIRecorder.sln を開きます

  2. 「デバッグ」>「デバッグの開始」を選択するか、単に「実行」を選択します。

4. サポートされる測位方法

写真

2. 構成

1. Windowsの開発者モードをオンにする

そうですね、これは携帯電話ではなく、Windows でも利用できます

ステップ 1: 開発者設定を検索する

ステップ 2: 開発者モードをオンにする

写真

ステップ 3: アクティベーションを確認する

写真

2.WinAppDriverを起動します

  • 開発者モードをオンにしない場合のヒント

C:\Program Files (x86)\Windows Application Driver>WinAppDriver.exe
開発者モードが有効になっていません。設定で有効にして、Windows アプリケーション ドライバーを再起動します。
初期化に失敗しました: 0x80004005

  • winappdriverをオンにしてから起動します

C:\Program Files (x86)\Windows Application Driver>WinAppDriver.exe
Windows アプリケーション ドライバーは次の場所で要求を待機しています: http://127.0.0.1:4723/
Enter キーを押して終了します。

  • このように起動することもできます

WinAppDriver.exe 4727
WinAppDriver.exe 10.0.0.10 4725
WinAppDriver.exe 10.0.0.10 4723/wd/hub # 推奨

3. 例

appium-python-client バージョン 2.0 以降は使用しないでください。ここでは 1.2.0 を使用します。

ノート

メモ帳など

from appium import webdriver
des_cap = {}
des_cap['app'] = r'C:\Windows\System32\notepad.exe'
driver = webdriver.Remote(command_executor='http://127.0.0.1:4723/wd/hub',
                          desired_capabilities=des_cap)
driver.implicitly_wait(5)
driver.find_element_by_name('文件(F)').click()
from time import sleep
sleep(2)
driver.find_element_by_name('保存(S)    Ctrl+S').click()
# driver.find_element_by_name('退出(X)').click()
sleep(1)
import pyautogui
pyautogui.PAUSE = 0.5
pyautogui.typewrite(r'D:\hello.txt')
pyautogui.press('enter')

ここで難しいのは、Save(S) Ctrl+S の取得です。

ここではinspect.exeを使用する必要があります

写真

電卓

このようなコードを書くとよいでしょう

from appium import webdriver
des_cap = {}
des_cap['app'] = r'C:\Windows\System32\calc.exe'
driver = webdriver.Remote(command_executor='http://127.0.0.1:4723/wd/hub',
                          desired_capabilities=des_cap)
driver.implicitly_wait(5)

しかし、エラーが報告されます

Traceback (most recent call last):
  File "D:/demo_calc.py", line 5, in <module>
    desired_capabilities=des_cap)
  File "D:\Python37\lib\site-packages\appium\webdriver\webdriver.py", line 157, in __init__
    AppiumConnection(command_executor, keep_alive=keep_alive), desired_capabilities, browser_profile, proxy
  File "D:\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 157, in __init__
    self.start_session(capabilities, browser_profile)
  File "D:\Python37\lib\site-packages\appium\webdriver\webdriver.py", line 226, in start_session
    response = self.execute(RemoteCommand.NEW_SESSION, parameters)
  File "D:\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "D:\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: Failed to locate opened application window with appId: C:\Windows\System32\calc.exe, and processId: 4472

进程已结束,退出代码为 1

電卓を開き、PowerShell で次のコマンドを実行します。

Get-StartApps |Select-String "计算器"
# 输出
@{Name=计算器; AppID=Microsoft.WindowsCalculator_8wekyb3d8bbwe!App} # 你要的是这里的AppID # 同理,记事本你也可以得到其appid,并自动化

コード

from appium import webdriver
des_cap = {}
des_cap['app'] = r'Microsoft.WindowsCalculator_8wekyb3d8bbwe!App'
driver = webdriver.Remote(command_executor='http://127.0.0.1:4723/wd/hub',
                          desired_capabilities=des_cap)
driver.implicitly_wait(5)
driver.find_element_by_name('一').click() # 这些定位你仍然需要inspect
driver.find_element_by_name('二').click()
driver.find_element_by_name('加').click()
driver.find_element_by_name('三').click()
driver.find_element_by_name('四').click()
driver.find_element_by_name('等于').click()
# 通过inspect 获取 automationID 
print(driver.find_element_by_accessibility_id('CalculatorResults').text) # 得到的是   ·显示为 46·  你仍然要处理才能做测试

driver.quit()

これを試して、アプリケーションに基づいてカプセル化できます。ここに持っていきます。

電卓検定(公式サイト)

走らせたわけではないので参考程度に、長さを伸ばすためだと思ってください。

# https://raw.githubusercontent.com/microsoft/WinAppDriver/master/Samples/Python/calculatortest.py
import unittest
from appium import webdriver

class SimpleCalculatorTests(unittest.TestCase):

    @classmethod

    def setUpClass(self):
        #set up appium
        desired_caps = {}
        desired_caps["app"] = "Microsoft.WindowsCalculator_8wekyb3d8bbwe!App"
        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):
        self.driver.find_element_by_name("Clear").click()
        self.driver.find_element_by_name("Seven").click()
        self.assertEqual(self.getresults(),"7")
        self.driver.find_element_by_name("Clear").click()

    def test_addition(self):
        self.driver.find_element_by_name("One").click()
        self.driver.find_element_by_name("Plus").click()
        self.driver.find_element_by_name("Seven").click()
        self.driver.find_element_by_name("Equals").click()
        self.assertEqual(self.getresults(),"8")

    def test_combination(self):
        self.driver.find_element_by_name("Seven").click()
        self.driver.find_element_by_name("Multiply by").click()
        self.driver.find_element_by_name("Nine").click()
        self.driver.find_element_by_name("Plus").click()
        self.driver.find_element_by_name("One").click()
        self.driver.find_element_by_name("Equals").click()
        self.driver.find_element_by_name("Divide by").click()
        self.driver.find_element_by_name("Eight").click()
        self.driver.find_element_by_name("Equals").click()
        self.assertEqual(self.getresults(),"8")

    def test_division(self):
        self.driver.find_element_by_name("Eight").click()
        self.driver.find_element_by_name("Eight").click()
        self.driver.find_element_by_name("Divide by").click()
        self.driver.find_element_by_name("One").click()
        self.driver.find_element_by_name("One").click()
        self.driver.find_element_by_name("Equals").click()
        self.assertEqual(self.getresults(),"8")

    def test_multiplication(self):
        self.driver.find_element_by_name("Nine").click()
        self.driver.find_element_by_name("Multiply by").click()
        self.driver.find_element_by_name("Nine").click()
        self.driver.find_element_by_name("Equals").click()
        self.assertEqual(self.getresults(),"81") 

    def test_subtraction(self):
        self.driver.find_element_by_name("Nine").click()
        self.driver.find_element_by_name("Minus").click()
        self.driver.find_element_by_name("One").click()
        self.driver.find_element_by_name("Equals").click()
        self.assertEqual(self.getresults(),"8")

if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(SimpleCalculatorTests)
    unittest.TextTestRunner(verbosity=2).run(suite)

最後に:以下の完全なソフトウェア テスト ビデオ チュートリアルが編集され、アップロードされています。必要な友人は自分で入手できます[100% 無料保証]

ソフトウェアテスト面接文書

私たちは高給の仕事を見つけるために勉強しなければなりません。以下の面接の質問は、アリババ、テンセント、バイトなどの一流インターネット企業の最新の面接資料からのものであり、バイトの上司の中には権威ある回答をしている人もいます。 set 面接情報に基づいて、誰もが満足のいく仕事を見つけることができると思います。

おすすめ

転載: blog.csdn.net/wx17343624830/article/details/132977458