Selenide + XlsMapperで自動画面テストを行う

# 環境と実装方法
IDE:eclipse(Oxygen.3)
言語:Java

環境構築まで
eclipseで新規のMavenプロジェクトを作成。
以下のコードを入力して、実行→Maven Install

```
<dependencies>
  <!-- Selenide -->
  <dependency>
    <groupId>com.codeborne</groupId>
    <artifactId>selenide</artifactId>
    <version>5.9.0</version>
    <scope>test</scope>
  </dependency>

  <!-- JUnit -->
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
  </dependency>

  <!-- XlsMapper(Excel読み取り) -->
  <dependency>
    <groupId>com.github.mygreen</groupId>
    <artifactId>xlsmapper</artifactId>
    <version>2.1</version>
  </dependency>
```

# 実装
詳細については他で説明されているものの方が分かりやすいと思うので割愛します。
XlsMapperは公式ドキュメントで十分理解できると思います。
個人的にやっていた方法ですが、Pageクラスを作成しPage内でできる動作を定義しておく方法がコーディングしやすかったです。
ちなみにこの方法だと、一画面でできる動作が動的に変わる場合の実装が難しい気がします。

```PageBase.java
public class PageBase {
  protected SelenideElement hoge() {
    return $("input[name='hoge']");
  }

  protected SelenideElement fuga() {
    return $("input[name='fuga']");
  }
}
```

```Page.java
public class Page extends PageBase {
  // hogeに値をセットする
  public void setHoge(String hoge) {
    hoge().val(hoge);
  }

  // fugaをクリックする
  public void clickFuga(){
    fuga().pressEnter();
  }
}
```

といって具合にPageクラスを用意することで、Logic部分ではそれらを呼び出すだけで実装が可能になります。

```Logic.java
public class Logic {
  public void doLogic(String hoge){
    Page pg = new Page();
    // hoageに値をセットしてfugaをクリック
    pg.setHoge(hoge);
    pg.clickFuga();
    // スクリーンショットを取る
    Selenide.screenshot("hogefuga");
  }
}
```

```Test.java
public class Test {
  @before
  public void setup(){
    // 開くブラウザの種類を指定（IE）
    Configuration.browser = WebDriverRunner.INTERNET_EXPLORER;
    System.setProperty("webdriver.ie.driver", "C:\\eclipse\IEDriver\IEDriverServer.exe");

    // スクリーンショットの保存先を指定
    Configuration.reportsFolder = "/sample/testFolder/";
    // ブラウザで指定のサイトを開く
    open("https://qiita.com");
  }

  @Test
  public void doTest(){
    Logic logic = new Logic();
    logic.doLogic("sample");
  }

  @after
  public void tearDown(){
    // ブラウザを閉じる
    Selenide.closeWebDriver();
  }
}
```

ここまでがSelenideを用いた画面テストの実装です。
上のケースだと、サイトを開いて、hoge要素に「sample」を入力してfuga要素をクリック、ブラウザを閉じる、という動作をします。
ここで、「sample」の値を事前に入力したエクセルの値にするためにXlsMapperを使用します。
XlsMapperの実装のために、別途クラスを用意します。
値が複数ある場合と、値が一つだけの場合で実装方法が異なります。
まず、値が一つだけの場合、Dataクラスを用意します。

```Data.java
@XlsSheet(name="testSheet")
public class Data{
  @XlsLabelledCell(label="hoge" type=LabelledCellType.Right)
  public String hoge;
}
```

```Test.java
@Test
public void doTest(){
  XlsMapper xlsMapper = new XlsMapper();
  Data data = xlsMapper.load(
                        new FileInputStream("testExcel.xlsx"),
                        Data.class);

  Logic logic = new Logic();
  logic.doLogic(data.hoge);
}
```

このように実装することでエクセルの値を取り出すことが出来ます。
値が複数ある場合は、SheetクラスとDataクラスを作成し、Sheetクラスを読み込むことでDataの読み込みを実装します。

```Sheet.java
@XlsSheet(name='testSheet')
public class Sheet {
  @XlsHorizontalRecords(tableLabel="Dataリスト", recordClass=Data.class)
  public List<Data> dataList;
}
```

```Data.java
public class Data {
  @XlsColumn(columnName="hoge")
  @XlsTrim
  public String hoge;
}
```

```Test.java
@Test
public void doTest(){
  XlsMapper xlsMapper = new XlsMapper();
  Sheet sheet = xlsMapper.load(
                        new FileInputStream("testExcel.xlsx"),
                        Sheet.class);

  Logic logic = new Logic();
  for(Data data : sheet.dataList){
    logic.doLogic(data.hoge);
  }
}
```

このようにSheetクラス内のList<Data>の数だけLogicを回すという実装を行います。
この実装の仕方だと、「同一の画面で同一の動作を一定回数繰り返す」仕様になります。

#まとめ
一画面に対して、何回も打鍵してエビデンスを取りたい場合には有効になりますが、複数画面に対して、一回ずつ打鍵するようなテストの場合にはこの実装の仕方は弱いかなって感じです。
自分はITaに向けてコーディングしたのですが、実際にはDB更新に伴う画面表示の確認に使用されてしまったので、めちゃくちゃ弱い実装してしまったなと思っています。
コードも記事もあまりブラッシュアップできていませんが、とりあえず形にできるところまで。