Project ICKX Selenium-IDE User Extensionちょっとだけ


[Project ICKX Selenium-IDE User Extension](http://wkbd.ickx.jp/se/)（略してISIE）は公開はしているけど打って出ていない状態です。
マニュアルがまだだからな！
それなりに色々複雑な機能が多いのでマニュアルとある程度のサンプルが無いと使い出が無いという地獄。

ただ、せっかくご紹介頂いたの[^1]で少しだけ考え方や機能に触れようと思う。

# 考え方

## なんで今更Selenium IDEなの？時代はWeb Driverっしょ！

そもそもWeb Driverはガチプログラマじゃないと効率的に扱えない。

**ISIEはプログラマ以外の人でも効率的に再利用可能なテスト開発、テスト運用が出来るように設計されたユーザ拡張です。**

Selenium IDEの場合、firefoxを開いてポチポチするだけでテストの雛形を簡単に作成でき、また、Firebugなどを組み合わせる事でxpathを取得すれば、柔軟に構造の変化にも対応できるため、プログラマ以外の人でも直感的にテストケースを作成しやすい利点があります。

プログラマ以外の人でも作成、利用しやすいということは、テスト設計者、テスト実施者を増やしやすいという事でもあります。

## なんでデータファイルがCSVなの？XMLの方が柔軟に記述できるじゃん！

そもそもXML重い。

XMLは自由に記述できる反面、記述量が膨大になったり、自由すぎる構造となるきらいがあります。
また、効率的に記述できるエディタも限られており、XMLを理解せずに記述する事も困難です。

一方、CSVは2次元表までしか表現できないという適度な制約があり、また、MS Excelなど高度かつ簡易に記述できるエディタが複数存在します。
また、テキストエディタで加工する事も容易です。
（数値先頭の0が潰れる問題がある点はさておき）

適度な制約は学習コストの低下と、問題自体の解決法に対する自由を与えてくれます。

## なんでユーザ拡張なの？Firefox plug-inの方が入れやすいじゃん！

そもそもFirefox plug-inは作るのも読むのも難儀する。

ユーザが使用していて不便だった場合や、挙動が納得いかないものだった場合に容易に実装を確認できるようにするためです。
また、ユーザによる改造をしやすくするためのものでもあります。

ユーザにとって読みやすいよう、極力日本語でのコメントを付与しています。
最悪、マニュアルがなくてもコメントを読めばある程度なんとかなるはずです。

# ちょっとした使い方

## CSVファイルを読み込んで2次元配列にする

現在のバージョンではUTF-8のファイルのみ取り扱いできます。
SJIS対応は次のpushをお待ちください。

### storeCsv

storeCsvコマンドは対象で指定したパスにあるCSVファイルを読み込み、2次元配列化してから値で指定したストア名に保存します。
空行は許されません。

#### 使用例

|  | 入力値 | コメント |
|:---|:---|:---|
| コマンド | storeCsv |  |
| 対象 | ./test.csv | 実行するテストケースから見た相対パスの指定が可能 |
| 値 | test_list |  |

### storeExtCsv

storeExtCsvコマンドは対象で指定したパスにあるCSVファイルを読み込み、2次元配列化してから値で指定したストア名に保存します。
storeCsvコマンドに対して、次の点が拡張されています。

・空行対応
　空行が存在する場合、スキップされます。
・コメント行対応
　;から始まる行の場合、コメント行としてスキップされます。
　コメントを利用する事により、より明示的な設定が可能となります。

#### 使用例

|  | 入力値 | コメント |
|:---|:---|:---|
| コマンド | storeExtCsv |  |
| 対象 | ./test.csv | 実行するテストケースから見た相対パスの指定が可能 |
| 値 | test_list |  |

### storeExtCsvPreProcess

storeExtCsvPreProcessコマンドは対象で指定したパスにあるCSVファイルを読み込み、2次元配列化してから値で指定したストア名に保存します。
storeExtCsvコマンドに対して、次の点が拡張されています。

・CSV内の変数展開
　CSV中に変数が存在する場合、storeExtCsvPreProcessコマンドが実行された時点の変数が展開されます。

#### 使用例

|  | 入力値 | コメント |
|:---|:---|:---|
| コマンド | storeExtCsvPreProcess |  |
| 対象 | ./test.csv | 実行するテストケースから見た相対パスの指定が可能 |
| 値 | test_list |  |

## 配列を用いた繰り返し処理

### arrayEach

arrayEachコマンドは対象で指定したストア名の配列を元に、対となるendArrayEachまでの間の繰り返し処理を行います。
繰り返しの周が進むたびに読込む配列上のデータの位置が進んでいき、終端に到達すると対となるendArrayEachの次のコマンドに処理が移ります。

arrayEachコマンドとendArrayEachコマンドの組み合わせはネストする事が可能です。

arrayEachコマンドの数とendArrayEachコマンドの数は必ず一致している必要があります。

#### 使用例

|  | 入力値 | コメント |
|:---|:---|:---|
| コマンド | arrayEach |  |
| 対象 | test_list | 対象となる配列 |
| 値 | test_row | 今の周回目の配列の要素 |

### listArrayColumn

listArrayColumnコマンドは対象で指定した配列を値で指定したCSV形式のストア名に一括で代入を行います。

#### 使用例

|  | 入力値 | コメント |
|:---|:---|:---|
| コマンド | listArrayColumn |  |
| 対象 | test_row | 対象となる配列 |
| 値 | id,name,mail_address | ストア先を指定するCSV文字列 |

```
test_rowが[1, 'ICKX=サン', 'ickx@example.com']の場合に上記コマンドを実行すると、次の様に展開される。
id = 1
name = 'ICKX=サン'
mail = 'ickx@example.com'
```

#### 使用例

対象にCSV形式で取得対象を設定すると、最小限のデータのみ展開できます。

|  | 入力値 | コメント |
|:---|:---|:---|
| コマンド | listArrayColumn |  |
| 対象 | test_row,1,2 | 対象となる配列と添え字 配列のため、先頭要素は0を指定する |
| 値 | name,mail_address | ストア先を指定するCSV文字列 |

```
test_rowが[1, 'ICKX=サン', 'ickx@example.com']の場合に上記コマンドを実行すると、次の様に展開される。
name = 'ICKX=サン'
mail = 'ickx@example.com'
```

### endArrayEach

endArrayEachコマンドは、読込む配列上のデータが終端となるまで、対となるarrayEachコマンドまでコマンドの処理位置を戻します。
読込む配列上のデータが終端に到達している場合、次のコマンドに処理位置を移動します。

arrayEachコマンドとendArrayEachコマンドの組み合わせはネストする事が可能です。

arrayEachコマンドの数とendArrayEachコマンドの数は必ず一致している必要があります。

#### 使用例

|  | 入力値 | コメント |
|:---|:---|:---|
| コマンド | endArrayEach |  |
| 対象 |  |  |
| 値 |  |  |

## 例えば、こんな事が出来る

### 複数のユーザでログインできるか確認する

ユーザリストを持つCSVファイル

```delphi:user.csv
; 確かめるためのユーザセット
effy,fullsugar
furt,Ib;IUeWJJPBt>TI|\?4;Y|uy{}9+qhm*
hound,11111111
```

テスト対象のHTML構造

```html:test.html
<html>
<head>
<title>login</title>
</head>
<body>
<form>
    <input type="text" name="user_name">
    <input type="password" name="password">
    <input type="submit" name="submit">
</form>
</body>
</html>
```

テストケースの有効な部分抜粋

```html:test_case.html
<tr>
	<td>storeExtCsv</td>
	<td>./user.csv</td>
	<td>user_list</td>
</tr>
<tr>
	<td>arrayEach</td>
	<td>user_list</td>
	<td>user</td>
</tr>
<tr>
	<td>listArrayColumn</td>
	<td>user</td>
	<td>name,password</td>
</tr>
<tr>
	<td>open</td>
	<td>test.html</td>
	<td></td>
</tr>
<tr>
	<td>type</td>
	<td>name=user_name</td>
	<td>${name}</td>
</tr>
<tr>
	<td>type</td>
	<td>name=password</td>
	<td>${password}</td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>name=submit</td>
	<td></td>
</tr>
<!--後は検証処理-->
<tr>
	<td>endArrayEach</td>
	<td></td>
	<td></td>
</tr>
```

[^1]: [[2016年時点] Selenium IDE のまとめ (インストールから応用まで) - Qiita](http://qiita.com/gluelan2013/items/daa8680e8e86c0937743)