「UI Automation PowerShell Extension」を使ってWindowsアプリのUI自動テストを行う

「UI Automation PowerShell Extensions」 と 「PowerShell」を使って、Windows GUIアプリケーションを自動テストまたは自動操作することを試みます。

 

 

 

 

1. 環境構築

まずは環境を構築しましょう。

 

1.1. 環境

ここでは以下の環境を使用します。
「UI Automation PowerShell Extensions」を使用するには、PowerShell Ver.2 以降であれば使用できるそうです。
PowerShell Ver.2 は Windows XP 以降で使用できるので、XP以降であれば恐らくここに記載のほとんどの内容を動作させることができると思います。

[使用環境]
項目 内容 備考
OS Windows 10  
PowerShell Ver. 5.0 Ver.5.0 は Windows 10 標準添付
最低 Ver.2 を必要とする。できればVer.3以降を推奨。
UI Automation PowerShell Extension Ver. 0.8.7 Beta 3 https://uiautomation.codeplex.com/
「UIAutomation.0.8.7B3.NET40.zip」 を使用

2022-06-16 追記:
上記サイトは閉鎖しました。こちら「UI Automation PowerShell ExtensionsのDownload(再配布) – code-lab.net」から取得してください。自己責任で!)

 

1.2. 「WindowsPowerShell」ディレクトリを作成

規定パスとなるフォルダ「WindowsPowerShell」を作成します。

 

1.3. 「UI Automation PowerShell Extension」を準備

(1) https://uiautomation.codeplex.com/」 から 「UIAutomation.0.8.7B3.NET40.zip」 をダウンロード
⇨ 2022-06-16 追記:上記サイトは閉鎖しました。こちら「UI Automation PowerShell ExtensionsのDownload(再配布) – code-lab.net」から取得してください。自己責任で!)

(2) 取得したファイルを展開

(3) 展開した全ファイルについてそれぞれプロパティを開き、「ブロックの解除」にチェックを入れて「OK」ボタンを押します。

「ブロックの解除」にチェック

(4) 展開したファイルを下記フォルダへ保存します。

$env\USERPROFILE\Documents\WindowsPowerShell\modules\UIAutomation

保存するフォルダは任意ですが、後述の Profile.ps1 ファイルへ記述するパスと揃える必要があります。

 

 

1.4. スクリプト実行ポリシーを設定

PowerShell または PowerShell ISE を起動します。
続けて以下のコマンドを入力して、スクリプトを実行できるようにします。

Set-ExecutionPolicy Unrestricted -Scope CurrentUser [Enter]

または

Set-ExecutionPolicy Bypass -Scope CurrentUser [Enter]

を実行します。

 

Set-ExecutionPolicy Bypass -Scope CurrentUser [Enter]

 

実行ポリシーの変更

この画面が表示されたら 「はい(Y)」 または 「すべて続行(A)」 をクリックします。

 

補足:

スクリプト実行ポリシーには次の6種類の設定があります。

 

[table] 実行ポリシー
実行ポリシー 説明
Restricted [デフォルト] 構成ファイル(プロファイル)の読み込みやスクリプトの実行を行わない。
AllSigned すべてのスクリプトおよび構成ファイルが信頼された発行元によって署名されている必要がある。
RemoteSigned Webからダウンロードしたスクリプトおよび構成ファイルに関しては、信頼された発行元によって署名されている必要がある(ローカルのファイルは署名なしで実行できる)。
Unrestricted すべてのスクリプトおよび構成ファイルを実行する。
ただし、Webからダウンロードした署名されていないスクリプトは実行前に確認のプロンプトが表示される。
ByPass すべてのスクリプトおよび構成ファイルを実行する。
Webからダウンロードした署名されていないスクリプトも実行時に確認のプロンプトを表示しない。
Undefined システムの実行ポリシーが未定義となる。
起動オプションで明示指定しない場合は Restricted と同じ扱いとなる。

 

1.5. Profileを準備

「PowerShell を起動したら特定のコマンドを自動実行してほしい。」という希望を叶えるのがProfileです。Profile は、適用対象に応じて以下の2つのタイプが存在します。

いずれの方法でProfileを作成しても結構ですが、
私は「ユーザー単位」の設定で PowerShell および PowerShell ISE 共通の設定を行う profile.ps1 のファイルを作成しました。

各人の選択したProfileを作成後、後述の内容を記載してください。

 

ユーザー単位

 

システム単位

 

1.6. Profileへ記述

作成したProfileへ以下の情報を記載します。

(1) PowerShell起動時のカレントホルダ
(2) 「UIAutomation.dll」のロード
(3) UIAutomation 設定

[profile.ps1 の記載例]
#
# カレントフォルダの指定
#
Set-Location 'C:\users\hoge\Documents\WindowsPowerShell'

#
# import-modules
#
Import-Module .\modules\UIAutomation\UIAutomation.dll

#
# UIAutomation 設定
#
[UIAutomation.Preferences]::Highlight = $false       # UI要素を示す赤枠を表示しない

 

1.7. PowerShell ISE を再起動、動作確認

PowerShell ISE を再起動します。続けて正しく設定できているかを確認します。

 

(1) WindowsPowerShell のバージョンを確認

コンソール画面で「$PSVersionTable [Enter]」と入力します。
画面に表示される「PSVersion」の値が使用している WindowsPowerShell のバージョン番号です。
下図では「5.0.10586.0」がバージョン番号です。

WindowsPowerShell のバージョン確認

 

(2) UIAutomation.dll のロードを確認

コンソール画面で「Get-Module [Enter]」と入力します。
画面にロード済みのモジュール一覧が表示されます。
画面の Name 欄に「UIAutomation」が表示されればOKです。
表示されない場合は前述の特に Profile.ps1 の設定周辺を再確認してください。

UIAutomation.dll のロード確認

 

以上で準備は完了です。

 

 

2. UIAutomation のコマンドレット一覧

「Get-Command *uia*」でコンソール出力されたコマンドレット一覧を以下に記載します。
内容として記載のものは推測交じりです。

コマンドレット 内容
Add-UiaBannerText
Add-UiaWizardStep
 
Clear-UiaControlText  
Connect-UiaRemoteDesktopSession  
ConvertFrom-UiaDataGrid
ConvertFrom-UiaTable
 
ConvertTo-UiaHashtable
ConvertTo-UiaSearchCriteria
 
Exit-UiaWizard  
Get-UiaActiveWindow
Get-UiaButton
Get-UiaButtonToggleState
Get-UiaCalendar
Get-UiaCalendarSelection
Get-UiaCalendarValue
Get-UiaCheckBox
Get-UiaCheckBoxToggleState
Get-UiaChildWindow
Get-UiaComboBox
Get-UiaComboBoxSelection
Get-UiaComboBoxValue
Get-UiaControl
Get-UiaControlAncestors
Get-UiaControlChildren
Get-UiaControlDescendants
Get-UiaControlFirstChild
Get-UiaControlFromHandle
Get-UiaControlFromPoint
Get-UiaControlLastChild
Get-UiaControlNextSibling
Get-UiaControlParent
Get-UiaControlPreviousSibling
Get-UiaCurrentPattern
Get-UiaCurrentPatternFromPoint
Get-UiaCustom
Get-UiaCustomDockPosition
Get-UiaCustomRangeText
Get-UiaCustomRangeValue
Get-UiaCustomSelection
Get-UiaCustomSelectionItemState
Get-UiaCustomText
Get-UiaCustomToggleState
Get-UiaDataGrid
Get-UiaDataGridSelection
Get-UiaDataItem
Get-UiaDataItemSelectionItemState
Get-UiaDataItemText
Get-UiaDataItemToggleState
Get-UiaDesktop
Get-UiaDocument
Get-UiaDocumentRangeText
Get-UiaEdit
Get-UiaEditRangeText
Get-UiaEditRangeValue
Get-UiaEditText
Get-UiaFocus
Get-UiaGroup
Get-UiaGroupBox
Get-UiaHeader
Get-UiaHeaderItem
Get-UiaHyperlink
Get-UiaHyperlinkText
Get-UiaIfUltraGridRow
Get-UiaIfUltraGridSelection
Get-UiaImage
Get-UiaImageSelectionItemState
Get-UiaLabel
Get-UiaLabelText
Get-UiaLinkLabel
Get-UiaLinkLabelText
Get-UiaList
Get-UiaListItem
Get-UiaListItemSelectionItemState
Get-UiaListItemText
Get-UiaListItemToggleState
Get-UiaListSelection
Get-UiaMenu
Get-UiaMenuBar
Get-UiaMenuBarDockPosition
Get-UiaMenuItem
Get-UiaMenuItemSelectionItemState
Get-UiaMenuItemToggleState
Get-UiaPane
Get-UiaPaneDockPosition
Get-UiaProgressBar
Get-UiaProgressBarRangeValue
Get-UiaProgressBarValue
Get-UiaRadioButton
Get-UiaRadioButtonSelectionItemState
Get-UiaRadioButtonToggleState
Get-UiaRegisteredEvent
Get-UiaScreenshot
Get-UiaScrollBar
Get-UiaScrollBarRangeValue
Get-UiaSelectedItem
Get-UiaSelectionItemState
Get-UiaSeparator
Get-UIAshTreeItem
Get-UiaSlider
Get-UiaSliderRangeValue
Get-UiaSliderSelection
Get-UiaSliderValue
Get-UiaSpinner
Get-UiaSpinnerRangeValue
Get-UiaSpinnerSelection
Get-UiaSpinnerValue
Get-UiaSplitButton
Get-UiaStatusBar
Get-UiaTab
Get-UiaTabItem
Get-UiaTabItemSelectionItemState
Get-UiaTable
Get-UiaTabSelection
Get-UiaTestProfile
Get-UiaText
Get-UiaTextBox
Get-UiaTextBoxRangeValue
Get-UiaTextBoxText
Get-UiaTextRangeText
Get-UiaTextRangeValue
Get-UiaTextText
Get-UiaThumb
Get-UiaTitleBar
Get-UiaToolBar
Get-UiaToolBarDockPosition
Get-UiaToolTip
Get-UiaToolTipRangeText
Get-UiaTree
Get-UiaTreeItem
Get-UiaTreeItemSelectionItemState
Get-UiaTreeSelection
Get-UiaWindow
Get-UiaWindowDockPosition
Get-UiaWindowFromHandle
Get-UiaWizard
 
Hide-UiaBanner
Hide-UiaCurrentHighlighter
Hide-UiaExecutionPlan
 
Invoke-UiaButtonClick
Invoke-UiaButtonCollapse
Invoke-UiaButtonExpand
Invoke-UiaButtonToggle
Invoke-UiaCalendarScroll
Invoke-UiaCheckBoxToggle
Invoke-UiaChildWindowTransformMove
Invoke-UiaChildWindowTransformResize
Invoke-UiaChildWindowTransformRotate
Invoke-UiaChildWindowWindowState
Invoke-UiaCollapsePattern
Invoke-UiaComboBoxCollapse
Invoke-UiaComboBoxExpand
Invoke-UiaComboBoxScroll
Invoke-UiaControlClick
Invoke-UiaControlContextMenu
Invoke-UiaCustomClick
Invoke-UiaCustomCollapse
Invoke-UiaCustomExpand
Invoke-UiaCustomScroll
Invoke-UiaCustomScrollItem
Invoke-UiaCustomSelectItem
Invoke-UiaCustomToggle
Invoke-UiaCustomTransformMove
Invoke-UiaCustomTransformResize
Invoke-UiaCustomTransformRotate
Invoke-UiaCustomWindowState
Invoke-UiaDataGridScroll
Invoke-UiaDataItemCollapse
Invoke-UiaDataItemExpand
Invoke-UiaDataItemScrollItem
Invoke-UiaDataItemSelectItem
Invoke-UiaDataItemToggle
Invoke-UiaDockPatternGet
Invoke-UiaDockPatternSet
Invoke-UiaDocumentScroll
Invoke-UiaExpandPattern
Invoke-UiaGroupBoxCollapse
Invoke-UiaGroupBoxExpand
Invoke-UiaGroupCollapse
Invoke-UiaGroupExpand
Invoke-UiaHeaderItemClick
Invoke-UiaHeaderItemTransformMove
Invoke-UiaHeaderItemTransformResize
Invoke-UiaHeaderItemTransformRotate
Invoke-UiaHeaderTransformMove
Invoke-UiaHeaderTransformResize
Invoke-UiaHeaderTransformRotate
Invoke-UiaHotKey
Invoke-UiaHyperlinkClick
Invoke-UiaIfUltraGridSelectItemByName
Invoke-UiaImageClick
Invoke-UiaImageSelectItem
Invoke-UiaInvokePattern
Invoke-UiaLinkLabelClick
Invoke-UiaListItemClick
Invoke-UiaListItemCollapse
Invoke-UiaListItemExpand
Invoke-UiaListItemScrollItem
Invoke-UiaListItemSelectItem
Invoke-UiaListItemToggle
Invoke-UiaListScroll
Invoke-UiaMenuBarCollapse
Invoke-UiaMenuBarExpand
Invoke-UiaMenuBarTransformMove
Invoke-UiaMenuBarTransformResize
Invoke-UiaMenuBarTransformRotate
Invoke-UiaMenuItemClick
Invoke-UiaMenuItemCollapse
Invoke-UiaMenuItemExpand
Invoke-UiaMenuItemSelectItem
Invoke-UiaMenuItemToggle
Invoke-UiaPaneScroll
Invoke-UiaPaneTransformMove
Invoke-UiaPaneTransformResize
Invoke-UiaPaneTransformRotate
Invoke-UiaPaneWindowState
Invoke-UiaRadioButtonSelectItem
Invoke-UiaRadioButtonToggle
Invoke-UiaRangeValuePatternGet
Invoke-UiaRangeValuePatternSet
Invoke-UiaScrollBarScroll
Invoke-UiaScrollItemPattern
Invoke-UiaScrollPattern
Invoke-UiaSelectionItemPattern
Invoke-UiaSelectionPattern
Invoke-UiaSplitButtonClick
Invoke-UiaSplitButtonCollapse
Invoke-UiaSplitButtonExpand
Invoke-UiaTabItemClick
Invoke-UiaTabItemSelectItem
Invoke-UiaTabScroll
Invoke-UiaTextPatternGet
Invoke-UiaTextPatternSet
Invoke-UiaThumbTransformMove
Invoke-UiaThumbTransformResize
Invoke-UiaThumbTransformRotate
Invoke-UiaTogglePattern
Invoke-UiaToggleStateGet
Invoke-UiaToggleStateSet
Invoke-UiaToolBarCollapse
Invoke-UiaToolBarExpand
Invoke-UiaToolBarTransformMove
Invoke-UiaToolBarTransformResize
Invoke-UiaToolBarTransformRotate
Invoke-UiaToolTipWindowState
Invoke-UiaTransformPatternMove
Invoke-UiaTransformPatternResize
Invoke-UiaTransformPatternRotate
Invoke-UiaTreeItemClick
Invoke-UiaTreeItemCollapse
Invoke-UiaTreeItemExpand
Invoke-UiaTreeItemScrollItem
Invoke-UiaTreeItemSelectItem
Invoke-UiaTreeScroll
Invoke-UiaValuePatternGet
Invoke-UiaValuePatternSet
Invoke-UiaWindowPattern
Invoke-UiaWindowTransformMove
Invoke-UiaWindowTransformResize
Invoke-UiaWindowTransformRotate
Invoke-UiaWindowWindowState
Invoke-UiaWizard
 
Move-UiaCursor  
New-UiaRemoteDesktopProtocolFile
New-UiaTestProfile
New-UiaWizard
 
Read-UiaControlAcceleratorKey
Read-UiaControlAccessKey
Read-UiaControlAutomationId
Read-UiaControlBoundingRectangle
Read-UiaControlClass
Read-UiaControlFrameworkIdKey
Read-UiaControlHasKeyboardFocus
Read-UiaControlHelpText
Read-UiaControlIsDisabled
Read-UiaControlIsEnabled
Read-UiaControlIsKeyboardFocusable
Read-UiaControlIsOffscreen
Read-UiaControlIsPassword
Read-UiaControlIsRequiredForForm
Read-UiaControlItemStatus
Read-UiaControlItemType
Read-UiaControlLabeledBy
Read-UiaControlLocalizedControlType
Read-UiaControlName
Read-UiaControlNativeWindowHandle
Read-UiaControlOrientation
Read-UiaControlProcessId
Read-UiaControlType
 
Register-UiaFocusChangedEvent
Register-UiaGridColumnCountChangedEvent
Register-UiaGridRowCountChangedEvent
Register-UiaInvokedEvent
Register-UiaMenuClosedEvent
Register-UiaMenuOpenedEvent
Register-UiaPropertyChangedEvent
Register-UiaRangeValueChangedEvent
Register-UiaStructureChangedEvent
Register-UiaTableColumnCountChangedEvent
Register-UiaTableRowCountChangedEvent
Register-UiaTextChangedEvent
Register-UiaTextSelectionChangedEvent
Register-UiaToggleStateChangedEvent
Register-UiaToolTipClosedEvent
Register-UiaToolTipOpenedEvent
Register-UiaUnexpectedWindow
Register-UiaValueChangedEvent
Register-UiaWindowClosedEvent
Register-UiaWindowOpenedEvent
 
Remove-UiaWizardStep  
Save-UiaScreenshot  
Set-UiaButtonToggleState
Set-UiaCalendarValue
Set-UiaCheckBoxToggleState
Set-UiaComboBoxText
Set-UiaControlForeground
Set-UiaControlKeys
Set-UiaControlText
Set-UiaCurrentTestProfile
Set-UiaCustomDockPosition
Set-UiaCustomRangeValue
Set-UiaCustomText
Set-UiaCustomToggleState
Set-UiaDataItemText
Set-UiaDataItemToggleState
Set-UiaDateTimePickerDate
Set-UiaDocumentRangeText
Set-UiaEditRangeText
Set-UiaEditRangeValue
Set-UiaEditText
Set-UiaFocus
Set-UiaHighligherSettings
Set-UiaHyperlinkText
Set-UiaLabelText
Set-UiaLinkLabelText
Set-UiaListItemText
Set-UiaListItemToggleState
Set-UiaLoggingSettings
Set-UiaMenuBarDockPosition
Set-UiaMenuItemToggleState
Set-UiaOnErrorActionSettings
Set-UiaOnSleepActionSettings
Set-UiaOnSuccessActionSettings
Set-UiaPaneDockPosition
Set-UiaProgressBarRangeValue
Set-UiaProgressBarValue
Set-UiaRadioButtonToggleState
Set-UiaScreenshotSettings
Set-UiaScrollBarRangeValue
Set-UiaSliderRangeValue
Set-UiaSliderValue
Set-UiaSpinnerRangeValue
Set-UiaSpinnerValue
Set-UiaTextBoxRangeValue
Set-UiaTextBoxText
Set-UiaTextRangeText
Set-UiaTextRangeValue
Set-UiaTextText
Set-UiaToolBarDockPosition
Set-UiaToolTipRangeText
Set-UiaWindowDockPosition
 
Show-UiaBanner
Show-UiaContextMenu
Show-UiaCurrentData
Show-UiaDesktop
Show-UiaExecutionPlan
Show-UiaMetroCharm
Show-UiaMetroMenu
Show-UiaMetroStartScreen
Show-UiaModuleSettings
Show-UiaStartRun
Show-UiaTaskManager
 
Start-UiaCachedMode
Start-UiaRecorder
Start-UiaTranscript
 
Step-UiaWizard  
Stop-UiaCachedMode  
Test-UiaControlState  
Unregister-UiaEvent  
Wait-UiaButtonIsEnabled
Wait-UiaButtonIsVisible
Wait-UiaCalendarIsEnabled
Wait-UiaCalendarIsVisible
Wait-UiaCheckBoxIsEnabled
Wait-UiaCheckBoxIsVisible
Wait-UiaChildWindowIsEnabled
Wait-UiaChildWindowIsVisible
Wait-UiaComboBoxIsEnabled
Wait-UiaComboBoxIsVisible
Wait-UiaControlIsEnabled
Wait-UiaControlIsVisible
Wait-UiaControlState
Wait-UiaCustomIsEnabled
Wait-UiaCustomIsVisible
Wait-UiaDataGridIsEnabled
Wait-UiaDataGridIsVisible
Wait-UiaDataItemIsEnabled
Wait-UiaDataItemIsVisible
Wait-UiaDocumentIsEnabled
Wait-UiaDocumentIsVisible
Wait-UiaEditIsEnabled
Wait-UiaEditIsVisible
Wait-UiaEventRaised
Wait-UiaGroupBoxIsEnabled
Wait-UiaGroupBoxIsVisible
Wait-UiaGroupIsEnabled
Wait-UiaGroupIsVisible
Wait-UiaHeaderIsEnabled
Wait-UiaHeaderIsVisible
Wait-UiaHeaderItemIsEnabled
Wait-UiaHeaderItemIsVisible
Wait-UiaHyperlinkIsEnabled
Wait-UiaHyperlinkIsVisible
Wait-UiaImageIsEnabled
Wait-UiaImageIsVisible
Wait-UiaLabelIsEnabled
Wait-UiaLabelIsVisible
Wait-UiaLinkLabelIsEnabled
Wait-UiaLinkLabelIsVisible
Wait-UiaListIsEnabled
Wait-UiaListIsVisible
Wait-UiaListItemIsEnabled
Wait-UiaListItemIsVisible
Wait-UiaMenuBarIsEnabled
Wait-UiaMenuBarIsVisible
Wait-UiaMenuIsEnabled
Wait-UiaMenuIsVisible
Wait-UiaMenuItemIsEnabled
Wait-UiaMenuItemIsVisible
Wait-UiaNoWindow
Wait-UiaPaneIsEnabled
Wait-UiaPaneIsVisible
Wait-UiaProgressBarIsEnabled
Wait-UiaProgressBarIsVisible
Wait-UiaRadioButtonIsEnabled
Wait-UiaRadioButtonIsVisible
Wait-UiaScrollBarIsEnabled
Wait-UiaScrollBarIsVisible
Wait-UiaSeparatorIsEnabled
Wait-UiaSeparatorIsVisible
Wait-UiaSliderIsEnabled
Wait-UiaSliderIsVisible
Wait-UiaSpinnerIsEnabled
Wait-UiaSpinnerIsVisible
Wait-UiaSplitButtonIsEnabled
Wait-UiaSplitButtonIsVisible
Wait-UiaStatusBarIsEnabled
Wait-UiaStatusBarIsVisible
Wait-UiaTabIsEnabled
Wait-UiaTabIsVisible
Wait-UiaTabItemIsEnabled
Wait-UiaTabItemIsVisible
Wait-UiaTableIsEnabled
Wait-UiaTableIsVisible
Wait-UiaTextBoxIsEnabled
Wait-UiaTextBoxIsVisible
Wait-UiaTextIsEnabled
Wait-UiaTextIsVisible
Wait-UiaThumbIsEnabled
Wait-UiaThumbIsVisible
Wait-UiaTitleBarIsEnabled
Wait-UiaTitleBarIsVisible
Wait-UiaToolBarIsEnabled
Wait-UiaToolBarIsVisible
Wait-UiaToolTipIsEnabled
Wait-UiaToolTipIsVisible
Wait-UiaTreeIsEnabled
Wait-UiaTreeIsVisible
Wait-UiaTreeItemIsEnabled
Wait-UiaTreeItemIsVisible
Wait-UiaWindow
 

 

 

3. まずはやってみよう - 電卓(calc)を起動して自動操作する

3.1. 電卓を起動する

電卓(calc.exe)を起動するには以下のようにスクリプトを記載します。

Start-Process calc

 

 

3.2. 「1+2=」を入力する

電卓を起動後、「1+2=」を入力して結果が「3」になることを自動テストします。

スクリプトは以下の通りです。

["電卓を起動して、1+2=を入力する.ps1"]
<#
概要: 電卓を起動して、"1+2=" を計算する
前提: Windows10 に添付の電卓用です。Windows7を含む他の電卓用には動作しません。
引数: なし
戻値: なし
#>

&{
    # 電卓を起動
    $process = Start-Process calc -PassThru

    #
    # ウィンドウ、ボタン、を取得
    #
    $bLoop = $true
    do{
        try{
            $window = Get-UiaWindow -AutomationId 'TitleBar' -Name '電卓' -Seconds 3        # 電卓のウィンドウを取得
            #$window = Get-UiaWindow -ProcessId $process.Id    # これは calc の場合はNG。
            # c:\windows\system32\calc.exe を起動すると、
            # このプロセスからさらに別のプロセスが起動されていることが原因と思われる

            # ボタン情報を取得
            $btn1 = $window | Get-UiaButton -AutomationId 'num1Button'
            $btn2 = $window | Get-UiaButton -AutomationId 'num2Button'
            $btnPlus = $window | Get-UiaButton -AutomationId 'plusButton'
            $btnEqual = $window | Get-UiaButton -AutomationId 'equalButton'
            $btnClose = $window | Get-UiaButton -AutomationId 'Close'
            
            # 結果表示欄を取得
            $resultText = $window | Get-uiatext -AutomationId 'CalculatorResults'

            $bLoop = $false
        }
        catch{
            write-host 'retry ...'
        }
        finally{
        }
        Start-Sleep -Milliseconds 300
    } while( $bLoop -eq $true )

    # ボタンを押す
    $btn1 | Invoke-UiaButtonClick | Out-Null
    $btnPlus | Invoke-UiaButtonClick | Out-Null
    $btn2 | Invoke-UiaButtonClick | Out-Null
    $btnEqual | Invoke-UiaButtonClick | Out-Null
    
    # 結果を取得
    $results = ($resultText.GetCurrent()).Name     # "表示 3" という文字列を取得
    $result = ($results.Split(" "))[1]             # "表示 3" という文字列をスペースで分離し、2番目の文字列を演算結果として取得

    # 結果をコンソール出力
    Write-Host '1 + 2 =' $result -NoNewline

    # 結果を判定
    if ( $result -eq '3' ){
        Write-Host ' [OK]' -ForegroundColor Cyan
    }
    else{
        Write-Host ' [NG]' -ForegroundColor Red
    }

    # 2秒待機
    Start-Sleep 2

    # 電卓を終了
    $btnClose | Invoke-UiaButtonClick | Out-Null
}

 

 

3.3. キー入力処理、演算結果取得処理、を関数にする

[入力処理などを関数化する]
<#
概要: 電卓を起動して、"1+2=" を計算する
前提: Windows10 に添付の電卓用です。Windows7を含む他の電卓用には動作しません。
引数: なし
戻値: なし
#>


<#
関数: 電卓のキーを取得する
前提: 電卓が起動済みであること
引数: なし
戻値: なし
説明:
#>
function Get-CalcKeys {
    #
    # ウィンドウ、ボタン、を取得
    #
    $bLoop = $true
    do{
        try{
            $window = Get-UiaWindow -AutomationId 'TitleBar' -Name '電卓' -Seconds 3        # 電卓のウィンドウを取得
            #$window = Get-UiaWindow -ProcessId $process.Id    # これは calc の場合はNG。-Class 'Windows.UI.Core.CoreWindow' 
            # c:\windows\system32\calc.exe を起動すると、このプロセスからさらに別のプロセスが起動されていることが原因と思われる

            # ボタン情報を取得
            $script:btn0 = $window | Get-UiaButton -AutomationId 'num0Button' -Class 'Button'
            $script:btn1 = $window | Get-UiaButton -AutomationId 'num1Button' -Class 'Button'
            $script:btn2 = $window | Get-UiaButton -AutomationId 'num2Button' -Class 'Button'
            $script:btn3 = $window | Get-UiaButton -AutomationId 'num3Button' -Class 'Button'
            $script:btn4 = $window | Get-UiaButton -AutomationId 'num4Button' -Class 'Button'
            $script:btn5 = $window | Get-UiaButton -AutomationId 'num5Button' -Class 'Button'
            $script:btn6 = $window | Get-UiaButton -AutomationId 'num6Button' -Class 'Button'
            $script:btn7 = $window | Get-UiaButton -AutomationId 'num7Button' -Class 'Button'
            $script:btn8 = $window | Get-UiaButton -AutomationId 'num8Button' -Class 'Button'
            $script:btn9 = $window | Get-UiaButton -AutomationId 'num9Button' -Class 'Button'
            $script:btnPlus = $window | Get-UiaButton -AutomationId 'plusButton' -Class 'Button'
            $script:btnMinus = $window | Get-UiaButton -AutomationId 'minusButton' -Class 'Button'
            $script:btnEqual = $window | Get-UiaButton -AutomationId 'equalButton' -Class 'Button'
            $script:btnClose = $window | Get-UiaButton -AutomationId 'Close'
            
            # 結果表示欄を取得
            $script:resultText = $window | Get-uiatext -AutomationId 'CalculatorResults'

            $bLoop = $false
            break
        }
        catch{
            write-host 'retry ...'
            Start-Sleep -Milliseconds 300
        }
        finally{
        }
    } while( $bLoop -eq $true )
}


<#
関数: 電卓のキーを入力する
前提: 電卓が起動済みであること
引数: $keys : 入力するキーの配列
戻値: なし
説明:
#>
function Input-Keys( $keys )
{
    foreach ( $key in $keys ){
        switch( $key ){
        0 { $script:btn0 | Invoke-UiaButtonClick | Out-Null }
        1 { $script:btn1 | Invoke-UiaButtonClick | Out-Null }
        2 { $script:btn2 | Invoke-UiaButtonClick | Out-Null }
        3 { $script:btn3 | Invoke-UiaButtonClick | Out-Null }
        4 { $script:btn4 | Invoke-UiaButtonClick | Out-Null }
        5 { $script:btn5 | Invoke-UiaButtonClick | Out-Null }
        6 { $script:btn6 | Invoke-UiaButtonClick | Out-Null }
        7 { $script:btn7 | Invoke-UiaButtonClick | Out-Null }
        8 { $script:btn8 | Invoke-UiaButtonClick | Out-Null }
        9 { $script:btn9 | Invoke-UiaButtonClick | Out-Null }
        + { $script:btnPlus | Invoke-UiaButtonClick | Out-Null }
        - { $script:btnMinus | Invoke-UiaButtonClick | Out-Null }
        = { $script:btnEqual | Invoke-UiaButtonClick | Out-Null }
        }
    }
}


<#
関数: 電卓の演算結果を取得する
前提: 電卓が起動済みであること
引数: なし
戻値: 電卓の演算結果
説明:
#>
function Get-Result{
    # 結果を取得
    $results = ($script:resultText.GetCurrent()).Name     # "表示 3" という文字列を取得
    $result = ($results.Split(" "))[1]                      # "表示 3" という文字列をスペースで分離し、2番目の文字列を演算結果として取得

    return $result
}


<#
関数: 計算結果の判定
前提: なし
引数: $result:   演算結果
          $expect:  期待する結果
戻値: なし
説明:
#>
function Judge-Result ( $result, $expect )
{
    if ( $result -eq $expect ){
        Write-Host ' [OK]' -ForegroundColor Cyan
    }
    else{
        Write-Host ' [NG]' -ForegroundColor Red
    }
}


&{
    # 電卓を起動
    $process = Start-Process calc -PassThru

    # 電卓のキー情報を取得
    Get-CalcKeys

    # 1 + 2 = 3
    &{
        # テスト内容
        $keys = '1', '+', '2', '='
        $expect = '3'

        # ボタンを押す
        Input-Keys( $keys )
    
        # 結果を取得
        $result = Get-Result

        # 結果をコンソール出力
        Write-Host '1 + 2 =' $result -NoNewline

        # 結果を判定
        Judge-Result  $result $expect
    }

    Start-Sleep 1

    # 10 + 21 = 31
    &{
        # テスト内容
        $keys = '1', '0', '+', '2', '1', '='
        $expect = '31'

        # ボタンを押す
        Input-Keys( $keys )
    
        # 結果を取得
        $result = Get-Result

        # 結果をコンソール出力
        Write-Host '10 + 21 =' $result -NoNewline

        # 結果を判定
        Judge-Result  $result $expect
    }

    Start-Sleep 1

    # 100 - 1 = 99
    &{
        # テスト内容
        $keys = '1', '0', '0', '-', '1', '='
        $expect = '99'

        # ボタンを押す
        Input-Keys( $keys )
    
        # 結果を取得
        $result = Get-Result

        # 結果をコンソール出力
        Write-Host '100 - 1 =' $result -NoNewline

        # 結果を判定
        Judge-Result  $result $expect
    }

    # 3秒待機
    Start-Sleep 3

    # 電卓を終了
    $script:btnClose | Invoke-UiaButtonClick | Out-Null
}

 

実行結果
電卓のテスト 実行結果

 

 

 

ライセンス

本ページの情報は、特記無い限り下記 MIT ライセンスで提供されます。

MIT License

Copyright (c) 2016-2022 Kinoshita Hidetoshi

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

 

 

 

参考

 


 

変更履歴

2022-06-16 - ページデザイン更新
2016-01-23 - 新規作成

 

Programming Items トップページ

プライバシーポリシー