
BizRobo!でDesktop Automationロボットを作る場合の話ですが、操作対象の画面から項目要素の認識ができない(Web画面のタグや.NET画面のUI Automationオブジェクトが認識できない)場合でも、画像認識を使って操作位置を特定することができます。
画像認識を使った場合、[ロケーションが見つかった場合]ステップに画像イメージが記録されます。
Design Studioで表示すると、以下のように画像が表示できます。

【課題】
ところが、Design Studioが使えない状況では、どのような画像なのか判断することができません。ロボットファイルでは、画像をBase64エンコードした文字列しか見ることができません。

【解決策】
そこで、Design Studioを使わなくても画像を確認できるドキュメントを、ロボットファイルから生成するツールを作成することにしました。ツールの処理内容は以下の通りです。
(1)処理対象のロボットファイルを選択する。
(2)ロボットファイルからすべての画像情報の文字列を抽出する。
(3)画像情報の文字列をBase64デコードして画像ファイルを生成する。
(4)画像ファイルを表示するHTMLファイルを作成する。
【ドキュメント例】
当ブログの画像を[ロケーションが見つかった場合]ステップに指定したロボットファイルから、画像認識で使っている画像の一覧リストを作成した場合の例です。

【ツールプログラム例】
PowerShellスクリプトで実装した例を載せておきます。
#-------------------------------------------- #動作環境の設定 #-------------------------------------------- #ロボットProjectフォルダパスを定義する。 $MYROBOTS = "C:\Users\masuo\Documents\My Robots" #作業フォルダ名を定義する。 $WORKDIRNAME = "作業フォルダ" #カレントディレクトリパスを取得する。 $currentDir = Split-Path $MyInvocation.MyCommand.Path #作業フォルダパスを定義する。 $workDir = Join-Path $currentDir $WORKDIRNAME #生成する画像ファイルの名前に付与するキーワード $KEYWORD = "_image_" $EXTENSION = ".png" #エラー発生時はスクリプトを停止する。 $ErrorActionPreference = 'Stop' #Windows Formsをロードする。 Add-Type -AssemblyName system.windows.forms #-------------------------------------------- #確認ダイアログ #-------------------------------------------- function OKCancelDialog($message){ $caption = "確認" $button = "OKCancel" $icon = "Information" $defaultbutton = "button2" $ans = [System.Windows.Forms.MessageBox]::Show($message, $caption, $button, $icon, $defaultbutton) return $ans } #--------------------------------------------------- #画像ファイル生成 #--------------------------------------------------- function Create_ImageFile($pathDir, $file){ #ファイル名を抽出(拡張子を除去)する。 $name = "" if( $file -match "(?<name>.*?)\..*" ){ $name = $matches.name } #(ロボット)ファイル内の文字列全体を変数に取り込む。 $pathTextFile = Join-Path $pathDir $file $rawtext = Get-Content $pathTextFile -Raw #画像情報を記述している範囲を抽出してリストを作成する。 $mm = [regex]::matches($rawtext,"image`": `"iVB.*`"") #リストでループする。 $no = 1 foreach($m in $mm){ #画像のBase64エンコード部分のみを抽出する。 $result = $m -match "image`": `"(?<encode>.*?)`"" if( $result -eq $true ){ $wk = $matches.encode #「¥」を空白スペースに置換する。 #(文字列に「¥」が含まれている場合があることが判明したため) $encode = $wk.replace('¥',' ')(注1)上記コード表示の部分で、本来は半角「"」のところを全角「”」にしている箇所が2つあります。半角のままだとブログページでの文字色が緑一色になって見づらい状況になったので、これを回避するために全角文字を使っています。
#Base64デコードしてバイナリファイルに出力する。 $decode = [Convert]::FromBase64String($encode) $pathImageFile = $pathDir + "¥" + $name + $KEYWORD + $no.ToString("00") + $EXTENSION [System.IO.File]::WriteAllBytes($pathImageFile, $decode) $no = $no + 1 } } } #-------------------------------------------- #画像一覧リスト作成 #-------------------------------------------- function Create_Document($pathDir){ $pathDoc = $pathDir + "\画像一覧.html" $listFile = Get-ChildItem $pathDir $no = 1 $doc = "<html><body><br>`r`n" foreach( $file in $listFile ){ if( $file.Name.Contains($KEYWORD) ){ $doc = $doc + "<div>" + $no.ToString("00") + ":" + "<img src=`”" + $file.Name + "`”> </div> <br>`r`n" $no = $no + 1 } } $doc = $doc + "</body></html>" $doc | Out-File $pathDoc } #-------------------------------------------- #ファイル選択 #-------------------------------------------- function Select_File(){ #ファイル選択ダイアログのオブジェクトを生成する。 $fd = New-Object System.Windows.Forms.OpenFileDialog #フォルダ初期値を設定する。 $fd.InitialDirectory = $MYROBOTS #ファイル選択ダイアログを表示する。 $ans = $fd.ShowDialog() #[OK]ボタンがクリックされたか?
if( $ans -eq "OK" ){ #選択したファイルのパスを返す。 return $fd.FileName }else{ #空文字を返す。 return "" } } #-------------------------------------------- #メイン処理 #-------------------------------------------- function main(){ while( $true ){ $pathFile = Select_File #ファイルを選択していないとき if( $pathFile.Length -eq 0 ){ $ans = OKCancelDialog "処理を続けるときは[OK]、中止するときは[キャンセル]をクリックしてください。" if( $ans -eq "OK" ){ continue }else{ break } }else{ #作業フォルダのファイルを削除する。 $listFile = Get-ChildItem $workDir foreach( $file in $listFile ){ Remove-Item( Join-Path $workDir $file )
} #選択したファイルを作業フォルダにコピーする。 Copy-Item $pathFile $workDir #コピーしたファイルの画像一覧リストを作成する。 $listFile = Get-ChildItem $workDir foreach( $file in $listFile ){ #64エンコード文字列をデコードしてバイナリファイルに出力する。 Create_ImageFile $workDir $file.Name #フォルダ内の全画像を使って画像一覧リストを作成する。 Create_Document $workDir } } } } #-------------------------------------------- #main()を実行 #-------------------------------------------- main
(注2)png画像ファイルをBase-64エンコードしてロボットファイルに埋め込んでいるとことには違い無いのですが、なぜBase-64で使えない「¥」が含まれているのか理解できないままです。BizRobo!バージョン11で確認したら「¥」が入ってなかったので、バージョン10だけなのかな?
「¥」のままだとデコードしようとしてもエラーになるので、ダメ元で「¥」を空白に置換したらBase-64エンコード文字列として認識されてうまくいきました。

コメント
このブログにコメントするにはログインが必要です。
さんログアウト
この記事には許可ユーザしかコメントができません。