SikuliX:取っ掛かり用サンプル(UIAutomation版)

シナリオ

このサンプルと内容は同じ。
テキスト操作をUIAutomationで処理。
SikuliXでUIAutomationを使用するにはここを参照
  1. メモ帳を起動(Appクラスのメソッドから起動
  2. メモ帳にメッセージを書き込み
  3. ワードを起動(ファイル名を指定して実行から起動
  4. ワードの後ろに隠れたメモ帳をアクティブにする
  5. メモ帳のテキストをクリア後メッセージを書き込み
  6. ワードを閉じる
  7. メモ帳のテキストをクリア後メッセージを書き込み
  8. メモ帳をファイル名を指定して保存
  9. メモ帳を閉じる

動画

サンプルコード

PowerShellスクリプト:C:¥ps¥Set-Value.ps1
Param($p)
Import-Module C:\UIAutomation\UIAutomation.dll
[UIAutomation.Preferences]::highlight = $false
$ErrorActionPreference = "Stop" # 例外をキャッチするためのおまじない
try {
    $wndw = Get-UiaWindow -Name $p[0]
    switch($p[1])
    {
      'cmb' {$wndw | Get-UiaComboBox -AutomationId $p[2] | Set-UiaComboBoxText -Text $p[3] | Out-Null}
      'edt' {$wndw | Get-UiaEdit -AutomationId $p[2] | Set-UiaEditText -Text  $p[3] | Out-Null}
      'doc' {$wndw | Get-UiaDocument -AutomationId $p[2] | Set-UiaControlText $p[3] | Out-Null}
      'key' {$wndw.Keyboard.TypeText($p[3])}
      'btn' {$wndw | Get-UiaButton -AutomationId $p[2] | Invoke-UiaButtonClick | Out-Null}
    }
} catch [Exception] {
    return 9
}

SikuliXスクリプト
import os
import sys
import datetime

reload(sys)
sys.setdefaultencoding("utf-8")
#######################################################################
# CONSTANT AREA
#######################################################################
# PowerShellスクリプトの保存先
CMD_PATH = u"C:\\ps\\Set-Value.ps1"
# PowerShellコマンドのベース
BASE_CMD = "powershell -NoProfile -ExecutionPolicy Bypass " + CMD_PATH
#######################################################################
# FUNCTION AREA
#######################################################################
# UIAutomation 操作
# コマンド引数:1-ウィンドウタイトル 2-処理タイプ 3-AutomationID 4-値
def execUIA(wndw, type, atid, text):
    # 改行をPowerShell用に変換    
    text = (text).replace("\n","`n")
    cmd = BASE_CMD + " '" + \
              wndw + "'," + \
              type + ","  + \
              atid + ","  + \
              text 
    # コマンド実行
    rtn = run(cmd)
    if rtn == 9:
        popup(u"powershellでエラー")
        exit()
# カウントダウン
def countdown():
    wndw = u"*無題 - メモ帳"
    type = "key"
    atid = "15"
    cnt = 5
    for i in range(5):
        cmd = BASE_CMD + " '" + \
                  wndw + "'," + \
                  type + ","  + \
                  atid + ","  + \
                  str(cnt) 
        # コマンド実行
        rtn = run(cmd)
        if rtn == 9:
            popup(u"powershellでエラー")
            exit()
        cnt = cnt - 1
        wait(0.5)
# 指定画像の表示待ち
def waitprog(pic):
    try:
        wait(pic, 10)
    except:
        popup(u"タイムアウト")
        exit()
#######################################################################
# MAIN
#######################################################################
# メモ帳起動
notepadpath = os.path.join(os.environ["WINDIR"], "notepad.exe")
notepad = App.open(notepadpath)

# メモ帳に書き込み
string = "---------------------------------\n"
string += u"このあとワードを起動します\n"
string += u"その後メモ帳をアクティブにします\n"
string += "---------------------------------\n"
execUIA(u"*無題 - メモ帳", "doc", "15", string)
countdown() # カウントダウン

# ワードを起動
type("r", Key.WIN) # ファイル名を指定して実行のショートカット
execUIA(u"ファイル名を指定して実行", "key", "1001", "winword.exe")
type(Key.ENTER)

# ワード起動待ち
waitprog("1616246876450.png") # 左記の画像が表示するまで待つ

# メモ帳をアクティブにする
notepad.focus()
wait(2)
# メモ帳に書き込み
string = "---------------------------------\n"
string += u"このあとワードを閉じます\n"
string += "---------------------------------\n"
execUIA(u"*無題 - メモ帳", "doc" , "15", string)
countdown() # カウントダウン

# ワードを閉じる
App.close("Word")

# メモ帳をアクティブにする
notepad.focus()
wait(1)
# メモ帳に書き込み
string = "---------------------------------\n"
string += u"このあとメモ帳の内容を保存します\n"
string += "---------------------------------\n"
execUIA(u"*無題 - メモ帳", "doc", "15", string)
countdown() # カウントダウン

# 名前を付けて保存
type("s", Key.CTRL + Key.SHIFT)
# 保存ダイアログ表示待ち
waitprog("1616254249888.png") # 左記の画像が表示するまで待つ
# ファイル名:yyyymmdd_hhmmss.txt
date = datetime.datetime.today().strftime("%Y%m%d_%H%M%S")
path = u"c:\\sample\\" + date + ".txt"
# ファイル名指定
execUIA(u"名前を付けて保存", "edt", "1001", path)
# 保存クリック
execUIA(u"名前を付けて保存", "btn", "1", "dummy")
# メモ帳を閉じる
notepad.close()

SikuliX IDE画面