「UI Automation PowerShell Extensions」 と 「PowerShell」を使って、Windows GUIアプリケーションを自動テストまたは自動操作することを試みます。
まずは環境を構築しましょう。
ここでは以下の環境を使用します。
「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」から取得してください。自己責任で!) |
規定パスとなるフォルダ「WindowsPowerShell」を作成します。
(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 |
PowerShell または PowerShell ISE を起動します。
続けて以下のコマンドを入力して、スクリプトを実行できるようにします。
Set-ExecutionPolicy Unrestricted -Scope CurrentUser [Enter] |
または
Set-ExecutionPolicy Bypass -Scope CurrentUser [Enter] |
を実行します。
この画面が表示されたら 「はい(Y)」 または 「すべて続行(A)」 をクリックします。
補足:
スクリプト実行ポリシーには次の6種類の設定があります。
実行ポリシー | 説明 |
---|---|
Restricted | [デフォルト] 構成ファイル(プロファイル)の読み込みやスクリプトの実行を行わない。 |
AllSigned | すべてのスクリプトおよび構成ファイルが信頼された発行元によって署名されている必要がある。 |
RemoteSigned | Webからダウンロードしたスクリプトおよび構成ファイルに関しては、信頼された発行元によって署名されている必要がある(ローカルのファイルは署名なしで実行できる)。 |
Unrestricted | すべてのスクリプトおよび構成ファイルを実行する。 ただし、Webからダウンロードした署名されていないスクリプトは実行前に確認のプロンプトが表示される。 |
ByPass | すべてのスクリプトおよび構成ファイルを実行する。 Webからダウンロードした署名されていないスクリプトも実行時に確認のプロンプトを表示しない。 |
Undefined | システムの実行ポリシーが未定義となる。 起動オプションで明示指定しない場合は Restricted と同じ扱いとなる。 |
「PowerShell を起動したら特定のコマンドを自動実行してほしい。」という希望を叶えるのがProfileです。Profile は、適用対象に応じて以下の2つのタイプが存在します。
いずれの方法でProfileを作成しても結構ですが、
私は「ユーザー単位」の設定で PowerShell および PowerShell ISE
共通の設定を行う profile.ps1 のファイルを作成しました。
各人の選択したProfileを作成後、後述の内容を記載してください。
適用対象 | PowerShell | PowerShell ISE | 両方 |
ファイル名 | PowerShell_profile.ps1 | Microsoft.PowerShellISE_profile.ps1 | profile.ps1 |
適用対象 | PowerShell | PowerShell ISE | 両方 |
ファイル名 | PowerShell_profile.ps1 | Microsoft.PowerShellISE_profile.ps1 | profile.ps1 |
作成したProfileへ以下の情報を記載します。
(1) PowerShell起動時のカレントホルダ
(2) 「UIAutomation.dll」のロード
(3) UIAutomation
設定
# # カレントフォルダの指定 # Set-Location 'C:\users\hoge\Documents\WindowsPowerShell' # # import-modules # Import-Module .\modules\UIAutomation\UIAutomation.dll # # UIAutomation 設定 # [UIAutomation.Preferences]::Highlight = $false # UI要素を示す赤枠を表示しない
PowerShell ISE を再起動します。続けて正しく設定できているかを確認します。
(1) WindowsPowerShell のバージョンを確認
コンソール画面で「$PSVersionTable [Enter]」と入力します。
画面に表示される「PSVersion」の値が使用している
WindowsPowerShell のバージョン番号です。
下図では「5.0.10586.0」がバージョン番号です。
(2) UIAutomation.dll のロードを確認
コンソール画面で「Get-Module [Enter]」と入力します。
画面にロード済みのモジュール一覧が表示されます。
画面の Name 欄に「UIAutomation」が表示されればOKです。
表示されない場合は前述の特に Profile.ps1 の設定周辺を再確認してください。
以上で準備は完了です。
「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 |
電卓(calc.exe)を起動するには以下のようにスクリプトを記載します。
Start-Process calc |
電卓を起動後、「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 }
<# 概要: 電卓を起動して、"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 | - | 新規作成 |