SetROBOでOracle WebLogic Serverのインストール自動化

# はじめに
こんにちは。社内PCのキッティングを担当している@Cheeeeeseです。
SetROBOでOracle WebLogic Serverのインストールを自動化させる時に手こずったので記録しておきます。

# 環境
- Windows 10 Pro 22H2 (64bit)
- Oracle Fusion Middleware 19c (14.1.1.0.0) WebLogic Server
- SetROBO for Kitting V2.0.0

# 状況

### :warning: 先ず以ってコントロールの記録が取れない
![01.oracle.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830862/37766938-f3f8-23e1-7ebc-8ab9a7f545fa.png)
この画面をSetROBOで記録した結果がこちら。
![02.oracle.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830862/50b0f691-a507-1e8d-8dbf-42c4c78733d8.png)
ただただ、各ステップの画面をクリックしただけになりました。

まぁね、SetROBOでの記録、稀にこれはある。
バージョンアップして記録機能が強化したとはいってもダメなものはダメなのね。
仕方ない、コントロールを調べるか。。。

### :warning: コントロールも調べられない
記録が取れなかった場合の救世主「インスペクト～」！
こんな画面、インスペクトで一発や！
![2023-09-04 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830862/834290b9-b380-b042-1f3b-c2c579dd1ab7.png)

**！？！？！？**
「次へ(N)」ボタンにマウスカーソル当ててるのに、インストーラー画面全体にハイライトされちゃう...
ウィンドウの要素しか出てこない...

![2023-09-04 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830862/802008bd-5c14-cf01-1af4-0551b5dc7a59.png)

ツリー展開して見ても、コントロール要素は「タイトルバー」にある最小化とか最大化のボタンくらい。
ちなみに、タイトルバーだけはハイライトされた。


てことで、画面の見た目的に普通にコントロール操作できると思ったけど、記録も取れないしInspectでコントロールも調べられないので、
SetROBOではコントロールタイプと名前を指定しての操作が出来ないみたいです。

### :white_check_mark: 各コントロールはショートカットキーで操作
記録もInspectも残念な結果ですが、今回は各コントロールにショートカットキーが設定されているので、
Oracle WebLogic Serverのインストールはキー操作で自動化していきます。

ただ、一部キー操作でもどうにもできない処理があるので、これについても記載しておきます。

# 実装
### 01.Oracleインストーラー起動
1．Oracleのインストーラーをコマンドプロンプトから起動。
```ruby:SetROBO
// コマンドプロンプトを起動
PlayLib.ProcessStart("cmd.exe");

//「cmd.exe」画面の表示確認
if(PlayLib.WaitWindow("*cmd.exe", true, 60) == false) {
    //「cmd.exe」画面が開かなかった場合、ログを出力し処理を終了する
    PlayLib.TestLogError("「cmd.exe」画面が開きませんでした");
    return -1;
}

// コマンドプロンプトを最前面にする
PlayLib.Window("*cmd.exe").Click(30, 40);

// ディレクトリ移動のコマンドを実行
SendKeys.SendWait("cd {Oracleインストーラーのフォルダパス}" + "{Enter}");
PlayLib.Sleep(1000);

// Oracleインストーラー起動のコマンドを実行
SendKeys.SendWait("java -jar fmw_14.1.1.0.0_wls_lite_generic.jar" + "{Enter}");
PlayLib.Sleep(1000);
```

### 02.「ようこそ」画面、「自動更新」画面の操作
![03-04.oracle.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830862/10b74101-d509-b72d-125d-64852a4ea767.png)
1．「ようこそ」画面と「自動更新」画面の「次へ(N)」ボタンを、「Alt＋N」で操作。
```ruby:SetROBO
// 「ようこそ」画面の「次へ(N)」をクリック
PlayLib.Window("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ1 / 8").Input("{Alt_Down}n{Alt_Up}");
PlayLib.Sleep(1000);

// 「自動更新」画面の「次へ(N)」をクリック
PlayLib.Window("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ2 / 8").Input("{Alt_Down}n{Alt_Up}");
PlayLib.Sleep(1000);
```

### 03.「インストール場所」画面の操作
![05.oracle.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830862/36524ea7-b474-04fd-c1b0-7bfc58d9c82e.png)
1．「インストール場所」画面の「Oracleホーム(O)」を「Alt+O」で選択。
2．画面に対してInputでインストール先のフォルダパスを入力。
3．「次へ(N)」ボタンを、「Alt＋N」で操作。
```ruby:SetROBO
//「インストール場所」画面の「Oracleホーム(O)」にフォーカスを当てる
PlayLib.Window("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ3 / 8").Input("{Alt_Down}o{Alt_Up}");
PlayLib.Sleep(1000);
// 「Oracleホーム(O)」にインストール場所を入力
PlayLib.Window("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ3 / 8").Input("{インストールフォルダパス}");
PlayLib.Sleep(1000);
//「インストール場所」画面の「次へ(N)」をクリック
PlayLib.Window("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ3 / 8").Input("{Alt_Down}n{Alt_Up}");
PlayLib.Sleep(1000);
```

### 04.「インストール・タイプ」画面の操作
![06.oracle.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830862/2e64fb14-a806-f784-5ff3-e8d67b83b5fe.png)
1．「インストール・タイプ」画面の「WebLogic Server(W)」を、「Alt+W」で選択。
2．「次へ(N)」ボタンを、「Alt＋N」で操作。
```ruby:SetROBO
//「WebLogic Server(W)」を選択
PlayLib.Window("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ4 / 8").Input("{Alt_Down}w{Alt_Up}");
PlayLib.Sleep(1000);

//「インストール・タイプ」画面の「次へ(N)」をクリック
PlayLib.Window("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ4 / 8").Input("{Alt_Down}n{Alt_Up}");
PlayLib.Sleep(1000);
```

### 05.「前提条件のチェック」画面の操作
![07.oracle.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830862/8d55a8b9-7148-9744-427a-3f582a585a32.png)
1．「前提条件のチェック」画面の「次へ(N)」ボタンを、「Alt＋N」で操作。
```ruby:SetROBO
//「前提条件のチェック」画面の「次へ(N)」をクリック
PlayLib.Window("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ5 / 8").Input("{Alt_Down}n{Alt_Up}");
PlayLib.Sleep(1000);
```

### 06.「インストール・サマリー」画面の操作
![08.oracle.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830862/37f805d2-c0fa-63f3-28fe-e2ddf49baa89.png)
1．「インストール・サマリー」画面の「インストール(I)」ボタンを、「Alt＋I」で操作。
```ruby:SetROBO
//「インストール・サマリー」画面の「インストール(I)」をクリック
PlayLib.Window("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ6 / 8").Input("{Alt_Down}i{Alt_Up}");		
```

### 07.インストール完了の確認処理（キー操作では処理できないところ）
:white_check_mark: 普通にコントロール操作が出来れば、「次へ(N)」や「終了(F)」ボタンがアクティブになったかを確認して、インストール完了を判断するが、
**今回はコントロール操作ができず、かつショートカットキーでは判断が出来ないため、インストール完了の判断は画像検索を使用**します。
![10-1.oracle.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830862/7623939a-2106-3b47-ac31-f5c643b9b4e5.png)
この、ステータスバーが100%になったか画像検索`「ImageLibrary.Search()`で確認します。
```ruby:SetROBO
// インストールが100％になったか繰り返し確認（30回確認×10秒待機）
for (int i = 0; i < 30; i++)
{
    //ステータスバーが「100％」になったか、画像検索を使用し確認
    result = ImageLibrary.Search("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ7 / 8", "{ステータスバー「100％」の画像パス}", 5, ImageLibrary.SearchArea.ALL, 0.8);
    
    if (result == true)
    {
        PlayLib.TestLog("Oracle WebLogic Serverのインストールが100％になりました");
        PlayLib.Sleep(5000); //「次へ(N)」ボタンが可視状態になるのに少し時間がかかるため5秒待機
        break;
    }
    else
    {
        //インストールがまだ完了していなかった場合10秒待機
        PlayLib.TestLog("[" + i + "] Oracle WebLogic Serverインストール中(10秒待機します)");
        PlayLib.Sleep(10000);
    }
}

if(result == false)
{
    //時間内にインストールが完了しなかった場合、スクリーンショットの取得とログを出力し、処理を終了する
    PlayLib.ScreenCapture();
    PlayLib.TestLogError("時間内にOracle WebLogic Serverのインストールが完了しませんでした");
    return -1;
}

```

### 08.「インストールの進行状況」画面の操作
![10.oracle.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830862/d004b715-0585-56b7-3bee-6ddb65466b7a.png)
1．「インストールの進行状況」画面の「次へ(N)」ボタンを、「Alt＋N」で操作。
```ruby:SetROBO
//「インストールの進行状況」画面の「次へ(N)」をクリック
PlayLib.Window("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ7 / 8").Input("{Alt_Down}n{Alt_Up}");
PlayLib.Sleep(1000);
```

### 09.「インストール完了」画面の操作
![11.oracle.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2830862/64bb6287-a32e-be20-5428-cf950fc1a016.png)

1．「インストール完了」画面の「構成ウィザードの自動起動(A)」のチェックを「Alt+A」で外す。
2．「終了(F)」を「Alt＋F」で操作。
```ruby:SetROBO
//「構成ウィザードの自動起動」のチェックを外す
PlayLib.Window("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ8 / 8").Input("{Alt_Down}a{Alt_Up}");
PlayLib.Sleep(1000);
//「インストール完了」画面の「終了(F)」をクリック
PlayLib.Window("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ8 / 8").Input("{Alt_Down}f{Alt_Up}");
PlayLib.Sleep(1000);
```

### まとめ
全体のコードはこちら。
各パスを自動取得にしたり、画面遷移の確認処理など追加しています。
```ruby:SetROBO
using System;
using System.Drawing;
using Arp.Prova.ImageLibrary;
using Arp.Prova.CsvLib;
using Arp.Prova.PlayLib;
using System.IO;
using System.Windows.Forms;

// CodeClass
public class CodeClass
{
	public static int CodeStart()
	{
		// ルートパス
		string rootPath = Path.GetDirectoryName(Application.StartupPath);
		// Oracleインストーラー格納パス
		string oracleFolderPath = Path.Combine(rootPath, @"Tools\fmw_14.1.1.0.0_wls_lite_Disk1_1of1");
		// Oracleインストーラー実行のコマンド
		string oracleExeCmd = "java -jar fmw_14.1.1.0.0_wls_lite_generic.jar";
		// Oracleインストール場所のパス
		string InstallPath = @"C:\Oracle\Middleware\Oracle_Home";
		
		//インストール完了を確認するための進捗バー100％の画像パス
		string ImagePath = Path.Combine(rootPath, @"Image\OracleComplete.PNG");
		//画像比較結果フラグ
		bool result = false;
		
		//■Oracleインストーラー起動
		//コマンドプロンプトを起動
		PlayLib.ProcessStart("cmd.exe");

		//「cmd.exe」画面の表示確認
		if(PlayLib.WaitWindow("*cmd.exe", true, 60) == false) {
			//「cmd.exe」画面が開かなかった場合、ログを出力し処理を終了する
			PlayLib.TestLogError("「cmd.exe」画面が開きませんでした");
			return -1;
		}
		
		//コマンドプロンプトを最前面にする
		PlayLib.Window("*cmd.exe").Click(30, 40);
		
		//ディレクトリ移動のコマンドを実行
		SendKeys.SendWait("cd " + oracleFolderPath + "{Enter}");
		PlayLib.Sleep(1000);
		
		//Oracleインストーラー起動のコマンドを実行
		SendKeys.SendWait(oracleExeCmd + "{Enter}");
		PlayLib.Sleep(1000);
		
		//起動に時間がかかるため、長めに待機
		PlayLib.Sleep(60000);
		
		//■「ようこそ」画面の操作
		// Oracleインストールウィザードの確認
		if(PlayLib.WaitWindow("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ1 / 8", true, 120) == false) {
			//Oracleインストールウィザードの起動が確認できなかった場合、ログを出力し、処理を終了する
			PlayLib.TestLogError("Oracleインストールウィザードの起動が確認できませんでした");
			return -1;
		}

		// 「ようこそ」画面の「次へ(N)」をクリック
		PlayLib.Window("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ1 / 8").Input("{Alt_Down}n{Alt_Up}");
		PlayLib.Sleep(1000);
		
		//■「自動更新」画面の操作
		// 「自動更新」画面の確認
		if(PlayLib.WaitWindow("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ2 / 8", true, 60) == false) {
			//「自動更新」画面が確認できなかった場合、ログを出力し、処理を終了する
			PlayLib.TestLogError("「自動更新」画面が確認できませんでした");
			return -1;
		}
		
		// 「自動更新」画面の「次へ(N)」をクリック
		PlayLib.Window("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ2 / 8").Input("{Alt_Down}n{Alt_Up}");
		PlayLib.Sleep(1000);
		
		//■「インストール場所」画面の操作
		// 「インストール場所」画面の確認
		if(PlayLib.WaitWindow("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ3 / 8", true, 60) == false) {
			//「インストール場所」画面が確認できなかった場合、ログを出力し、処理を終了する
			PlayLib.TestLogError("「インストール場所」画面が確認できませんでした");
			return -1;
		}
		
		//「インストール場所」画面の「Oracleホーム(O)」にフォーカスを当てる
		PlayLib.Window("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ3 / 8").Input("{Alt_Down}o{Alt_Up}");
		PlayLib.Sleep(1000);
		// 「Oracleホーム(O)」にインストール場所を入力
		PlayLib.Window("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ3 / 8").Input(InstallPath);
		PlayLib.Sleep(1000);
		//「インストール場所」画面の「次へ(N)」をクリック
		PlayLib.Window("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ3 / 8").Input("{Alt_Down}n{Alt_Up}");
		PlayLib.Sleep(1000);
		
		//■「インストールタイプ」画面の操作
		// 「インストールタイプ」画面の確認
		if(PlayLib.WaitWindow("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ4 / 8", true, 60) == false) {
			//「インストールタイプ」画面が確認できなかった場合、ログを出力し、処理を終了する
			PlayLib.TestLogError("「インストールタイプ」画面が確認できませんでした");
			return -1;
		}
		
		//「インストールタイプ」画面の「WebLogic Server(W)」を選択
		PlayLib.Window("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ4 / 8").Input("{Alt_Down}w{Alt_Up}");
		PlayLib.Sleep(1000);
		//「インストールタイプ」画面の「次へ(N)」をクリック
		PlayLib.Window("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ4 / 8").Input("{Alt_Down}n{Alt_Up}");
		PlayLib.Sleep(1000);
		
		//■「前提条件のチェック」画面の操作
		// 「前提条件のチェック」画面の確認
		if(PlayLib.WaitWindow("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ5 / 8", true, 60) == false) {
			//「前提条件のチェック」画面が確認できなかった場合、ログを出力し、処理を終了する
			PlayLib.TestLogError("「前提条件のチェック」画面が確認できませんでした");
			return -1;
		}
		
		//「前提条件のチェック」画面の「次へ(N)」をクリック
		PlayLib.Window("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ5 / 8").Input("{Alt_Down}n{Alt_Up}");
		PlayLib.Sleep(1000);
		
		//■「インストール・サマリー」画面の操作
		// 「インストール・サマリー」画面の確認
		if(PlayLib.WaitWindow("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ6 / 8", true, 60) == false) {
			PlayLib.ScreenCapture();
			PlayLib.TestLogError("「インストール・サマリー」画面が確認できませんでした");
			return -1;
		}
		
		//インストール開始ログを出力
		PlayLib.TestLog("Oracle WebLogic Serverのインストールを開始します");
		
		//「インストール・サマリー」画面の「インストール(I)」をクリック
		PlayLib.Window("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ6 / 8").Input("{Alt_Down}i{Alt_Up}");
		
		//■インストール完了の確認処理
		// インストールが100％になったか繰り返し確認（30回確認×10秒待機）
		for (int i = 0; i < 30; i++) {
			//ステータスバーが「100％」になったか、画像検索を使用し確認
			result = ImageLibrary.Search("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ7 / 8", ImagePath, 5, ImageLibrary.SearchArea.ALL, 0.8);
			
			if (result == true) {
				PlayLib.TestLog("Oracle WebLogic Serverのインストールが100％になりました");
				PlayLib.Sleep(5000);　//「次へ(N)」ボタンが可視状態になるのに少し時間がかかるため5秒待機
				break;
			} else {
				//インストールがまだ完了していなかった場合10秒待機
				PlayLib.TestLog("[" + i + "] Oracle WebLogic Serverインストール中(10秒待機します)");
				PlayLib.Sleep(10000);
			}
		}
		
		if(result == false) {
			//時間内にインストールが完了しなかった場合、ログを出力し、処理を終了する
			PlayLib.TestLogError("時間内にOracle WebLogic Serverのインストールが完了しませんでした");
			return -1;
		}
		
		//■「インストールの進行状況」画面の操作
		// 「インストールの進行状況」画面の確認
		if(PlayLib.WaitWindow("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ7 / 8", true, 60) == false) {
			//「インストールの進行状況」画面が確認できなかった場合、ログを出力し、処理を終了する
			PlayLib.TestLogError("「インストールの進行状況」画面が確認できませんでした");
			return -1;
		}
		
		//「インストールの進行状況」画面の「次へ(N)」をクリック
		PlayLib.Window("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ7 / 8").Input("{Alt_Down}n{Alt_Up}");
		PlayLib.Sleep(1000);
		
		//■「インストール完了」画面の操作
		// 「インストール完了」画面の確認
		if(PlayLib.WaitWindow("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ8 / 8", true, 60) == false) {
			//「インストール完了」画面が確認できなかった場合、ログを出力し、処理を終了する
			PlayLib.TestLogError("「インストール完了」画面が確認できませんでした");
			return -1;
		}
		
		//「構成ウィザードの自動起動」のチェックを外す
		PlayLib.Window("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ8 / 8").Input("{Alt_Down}a{Alt_Up}");
		PlayLib.Sleep(1000);
		//「インストール完了」画面の「終了(F)」をクリック
		PlayLib.Window("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ8 / 8").Input("{Alt_Down}f{Alt_Up}");
		PlayLib.Sleep(1000);
		
		if(PlayLib.WaitWindow("Oracle Fusion Middleware 14.1.1 WebLogic Server and Coherenceインストール - ステップ8 / 8", false, 60) == false) {
			//「インストール完了」画面を終了できなかった場合、ログを出力し、処理を終了する
			PlayLib.TestLogError("「インストール完了」画面を終了できませんでした");
			return -1;
		}
		
		//コマンドプロンプトを閉じる
		PlayLib.Window("*cmd.exe").Close();
		//完了ログ出力
		PlayLib.TestLog("Oracle WebLogic Serverのインストールが完了しました");
		return 0;
	}
}
```

# 最後に
結論、記録も取れず、Inspectでもコントロールの要素を調べることが出来ない画面は、SetROBOではコントロールを指定しての操作が出来ない。
今回はショートカットキーが設定されているインストーラーだったので、なんとかキー操作でできたけど、ショートカットキーが設定されていない場合は、全部画像比較でやるしかないかもしれない。
（別の方法があれば模索します）