[Ranorex] tips

# Background
RanorexはWebのE2Eテスト自動化に優れている。
自動化がむつかしい部分の実装や、保守性等を考えての実装方法のtipsを列挙する

# 1. 変数系

## 変数の変数化
処理の中で、複数の変数に対してルーチン処理をさせたい場合がある
配列を使う手段もあるが、Ranorexの場合、外からのデータソースの授受は配列が使えない。

### 対応策
Reflectionを活用する

例えば　変数　local_aite_uma1_flag　～　local_aite_uma16_flag　に対してルーチン処理を行いたい場合
1. 数字の部分を変数化し、1-16でループさせる
2. 変数名を　"GetType().GetProperty" で作成する
3. 作成した変数の変数の値を取得する場合、"GetValue"で取得
4. 作成した変数の変数に値を代入する場合、"SetValue"で設定

<IMG SRC="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/d4fddb50-cc76-5e39-21bf-cb9c9310bf1c.png">





# 2. 文字入力系

## Key Sequence 文字入力
文字入力を行う一つの方法として、"Key Sequence"がある。
ただ、これを使うときには注意点がある。
windows上の文字入力モードに依存する点である。

###課題
たとえば、英数文字を自動化で入力する処理があるとする。
ただ、IMEの日本語入力モードになっていると、日本語変換しようとした入力になってしまう。
そのため、実行時に入力モードを意識する必要がある。

###対応策
1. 入力モードのオンとオフをホットキーに割り当てる
　今回の例では、"USモードに切り替える"を"Ctrl+0"とする

<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/d415b4d6-d224-edc7-48a2-dbf0bdd9f633.png" width=60%>
2. Key Sequenceの実施前に、"Key Shortcut"アクションを追加し、上記で作成したshort cutを設定する

<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/02b26cd7-553a-c25d-7ca2-35761179580e.png" Width=80%>

# 3. 値
## 画面上の値を正規表現等で取得

###課題
文字列から一部値をとりたいことがある。
例えば、カンマ付き数字列から数字を取りたい場合等

###対応策
1. "Get Value"で取得する文字列から値をとるアクションを定義する
<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/fcc9dfa3-9857-d6e0-a11d-c4194fb1985b.png" width=80%>
2. 上記アクションを"ユーザーコードに変換"する
3. 作成したユーザーコード内で、C#で文字列操作の関数で希望の文字列を取得する
<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/f56e70b4-d647-6205-ee69-74d34c4298ac.png" Width=80%>

参考
C#で文字列操作するによく使う関数は以下のとおり

- Regex , Match を用いた正規表現
- Replace を用いた 文字変換（削除）

## select のsetvalueの値指定

### 課題
Ranorexでselect-boxで値を選択する処理をcaptureすると、下図のようにactionがとられる

<TABLE BORDER=1>
<TR><TH>Action</TH><TD>Set value</TD></TR>
<TR><TH>Name</TH><TD>Tag Value</TD></TR>
<TR><TH>Value</TH><TD>select HTML tagのoptionの値<BR>（今回の例では 三連複は"8"である）</TD></TR>
</TABLE>

<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/4f3b3d8a-3d82-b22d-afd3-e874817f8d2f.png" width=80%>

この場合、この設定する値を変数化し、データドリブン等で値を設定する場合、optionの値を入れる必要がある。（今回の例では、単勝=1, 複勝=2, 三連複=8 etc)
こうなると、データドリブンのデータを用意するとき、そのoptionの値を入れる必要があり、mapping tableを持つ必要がでてくる。

### 解決
以下のステップで、select-boxで表示されている文字列を選べるようにする

1. SPYでoptionのオブジェクトをrepositoryとして取る
　　この時、図のように WebElementとしてinnertextでとる
2. 1で取得したオブジェクトのinnertextに対する値を変数にする
3. 1で取得したオブジェクトを"Invoke action" の "Select"でActionに追加する

<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/f0e2d939-3647-6f1b-e2f0-ffe81093d8b0.png" width=80%>

<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/0d95c90c-669e-001c-fe36-3d7b3d18c984.png" width=80%>





# 4. 処理分岐
## 要素が表示されているときに正しいと判断する

### 課題
CSSでコンテンツの表示の制御を行っている場合、画面上存在しないが
要素を認識する場合がある。
これは、RanorexがHTMLベースで要素を認識しているためで、画面の表示の確認をdefaultしていないからである（と思う）

要素がページ上表示され、かつ認識しているケース
<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/7c8452fe-32f6-01b2-c082-c0450a65c53c.png" width=80%>

要素がページ上表示されてないが、認識しているケース
<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/db9ab72f-f6a1-8ea3-52fe-9962d9dea40f.png" width=80%>


### 対応策

Xpath に @Visible='True' を定義する。
このoptionは表示の有無を確認している

<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/ec4da5c4-393a-4baa-0b5e-247a698abc71.png" width=80%>







# 5. 動作安定性

## WebがLoad終わってから自動化処理を進める
Ranorexは、ページ遷移が完全に終わるのを待たない。
次のアクションの実行に入るが、その時にそのオブジェクトが出現するのを待つ。
そのため、ページがロードしてから次の処理に進んでいるように見える。

###課題
CSS等でコンテンツレイアウトを定義している場合。
ページ表示にバナー等順次読み込み、その次にレイアウトを組み立てていくページがある。
この場合、バナーの配置がロード中に変わってしまう。
Ranorexは、バナーが出現したらマウスクリック等を行おうとするが、レイアウトが変わってしまうので
失敗してしまう可能性がある。

###対応策
ページ遷移が発生した後、 WaitForDocumentLoaded 関数を読み出す
これはコンテンツが読み終わるまで(timeout指定可能)待つ

<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/1ff267ff-92c6-0389-8d08-27af668a4c12.png" width=80%>

## validateするときのrepositoryの存在チェック

ValidateのAttributeContainを実施するとき、そのrepositoryが完全な形（LOADが完全に終わり表示されている）になっていないと、失敗するときがある
以下がそのエラーの例

```
Module execution was aborted because a validation step has failed. 
Attribute 'InnerText' of element for item 'XXXXX' can not be evaluated (element is not valid). 
```

これは、画面が表示され、そのrepositoryのattributeを取りに行くが、完全に表示されてないため
失敗する
そのため、これが発生する場合、その直前にrepositoryが存在することを確認する処理waitForなどを使う

ex. before
<IMG SRC="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/90725ce2-0ad2-0882-0ade-7f28fd1898a4.png" width=80%>


ex. after
<IMG SRC="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/7179b065-7cc0-2778-5988-c93e6bbc92b3.png" width=80%>

repositoryをclickするなどの処理は、そのrepositoryの存在のチェック（timeoutあり）してから進むので、上記問題は考えなくていいが、validationの場合、存在する前提で動いていると思われるので、このようなエラーが起きると思われる


## エラー時の処理
Ranorexはエラーが発生したとき、それ以降どのようにふるまうかを設定することができる

- 1. 次の繰り返しに移動して続行
- 2. 次のテストケースに移動して続行 (default)
- 3. 次の親テストケースに移動して続行
- 4. 停止


<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/170db05e-ca56-b23d-50c1-8cf0c64a85c1.png" width=80%>

各レコードモジュールで失敗したときに、どうなると最適化を考えて設定する。

<B>例1. ランダムのデータを大量に作成したい場合</B>
繰り返し処理でデータを大量に作成したく、かつ一部失敗しても問題ない場合を想定する。
その場合、1回のループで失敗しても、次のループで改めて実行を繰り返しても問題はない。
その場合の選択肢として、"1. 次の繰り返しに移動して続行"を選ぶとよい

<B> 例2. 毎日チェックするタスク（CI)の場合</B>
定期的な動作確認として使い場合を想定する。
その場合、早くエラーを検知通知することが求められる。
その場合、失敗した時点で以降の処理を中断し "4. 停止" 、Jenkinsはエラーを返すのがベター。
原因解析後、再実施させればよい

<B>例3. 失敗しても後処理が必要な場合</B>
スマートフォルダを利用し、最後のスマートフォルダにエラーになったとしても後処理をさせる必要がある場合を想定する。
その場合、"3. 次の親テストケースに移動して続行" を選ぶとよい。


## データソース肥大化によるパフォーマンス低下

データソースでエクセルを多く使っていると、Ranorex Studio自体のレスポンスが低下する
その回避策は以下の通りである

”データの自動ロードの無効化”

[データソースの管理]画面　にて　 [データの自動ロード]のチェックボックスをオフ



# 6. Mobile

## Timeout

appiumをつかった、real device SP web、Native Appをテストするとき、起動時に時間がかかる
そのため、タイムアウトすることがよく発生する
そのタイムアウトを設定にて長めに設定する

<IMG SRC="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/18eef2b3-a814-cebd-ddec-12466617925f.png" width=80%>

<IMG SRC="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/4ba8e8cf-cfd4-e03a-3ff0-514e9409caa9.png" width=80%>


## Android App install　できない

APKをInstrumentするときに失敗するときがある

<IMG SRC="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/e6bd9c20-d223-7c58-7220-9cfce10b95e7.jpeg" width=80%>

この時、以下の方法で回避することができる

### APKツール 最新化
https://bitbucket.org/iBotPeaches/apktool/downloads/
ここから、最新のAPKをdownloadする
※ただし、Ranorex versionとの相性があるかもしれない
Ranorex 8.3.1 の場合 APK 2.4.0

C:\Program Files (x86)\Ranorex 8.3\Bin\RxEnv\Android\tools\apkTool
ここのapktool.jarと差し替える

Instrumentation flagsに以下オプション（APKファイルの参照メソッド総数の上限設定）を定義する

```
 -static -multidex -smali_redist
```

<IMG SRC="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/d63d4b37-900a-6195-4cfe-cefcc89b7126.jpeg" width=80%>




### APK インストルメントオプションの変更

以下OPTIONの無効化をする

- "Full image comparison"



<IMG SRC="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/efe99c35-d1d3-cc6a-ab40-f8e2f8a614ba.jpeg" width=80%>



# 7. Report
## compressed log
実行結果のreportを1ファイルに、圧縮する。
ほかのメンバーと結果を共有するとき、これをONにしてzlogを使うと便利

<IMG SRC="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/0f698780-4fa1-8232-877f-b0c95c50814e.png" width=80%>


# 8. browser open & close

## Browserのclose applicationは closeWindowsを使う

close applicationの killProcessは便利なところがある。
ブラウザの複数タブが立ち上がっている場合、タブの数を気にせずに終了させることができる
しかし、それをつかうと、次回起動時警告が出るときがある。
chromeであれば、前回正しく終了できませんでした　と。
このアラートがでると、やっかいである。
次回起動時に、その周辺にあるボタンをクリックできないから。
そのため、基本的には closeWindowsを使う。



<IMG SRC="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/ff01fc53-f128-bc19-cdd7-f7d654c07734.png" width=80%>