seleniumによるwebdriverを用いた簡単なテスト自動化（Firefox , Chrome）

#記事にした理由
今回、seleniumのwebdriverを用いてテスト自動化を試みていたわけだが、なぜか、Chromewebページの挙動がおかしい、何も書かれていない記事が生成されてしまう....
さぁ、webで調べれば一発で分かるだろうと思っていたが.....
重要な記事が出てこなかった。
そこで、同じような課題を抱えている人のために記事を書いてみました....

#はじめに
web開発においては少なからず自動化しておきたいテストについて記載していきます。基本的なwebUIテストを如何に自動化していくか、初心者エンジニアの躓くポイントをまとめながら記載していきます。



#seleniumとは
seleniumとは、初心者にとって手を付けやすい自動化テストツールになります。基本的には、Firefoxのアドオンとして提供されています。
seleniumIDEの使い方は、他の記事で詳しく述べられていますので、今回はwebdriverを使用したjavaでの実装方法を説明していきます。

#実装環境
上記でも述べたように、今回はjava言語を用います。eqlipseのmavenprojectで実装を行っていきます。

java 1.8.0_91
eqlipse
Firefox 48.0.2
Chrome 53.0.2785.116 

#実装
###Firefoxの場合
様々なweb記事に記載されているとおりに実装していたらseleniumの深い闇にはまってしまいました.....
1　[全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
2　[selenium IDEで作ったテストケースでchrome,IEでもテスト実行する]
(http://qiita.com/takky/items/9a2c1dc36c1a729c56cb)
3　[Selenium WebDriverでFirefox47を動かす方法](http://qiita.com/yssg/items/a054d67bc7c7fc39b276)
そこで、かなりの時間を費やしてしまった。この記事を読んでくれている人には時間の無駄を作らないように丁寧に説明していきます。

まず、問題だったのがFirefoxのバージョンでした。皆さんもしっかり自分のFirefoxのバージョンを確認してください。
実はFirefox 47 から少し実装が変りました。以前は、
Webdriver driver = FireFox();
と書くだけで良かったのに.....
Firefox 47以降、実にめんどくさくなりましたね。

では、説明に入っていきます。
とりあえず、書いたコードを全部載せます。

```java:Firefox_Test.java
package Selenium.selenium;

import static org.junit.Assert.*;

import java.io.IOException;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.NoAlertPresentException;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.MarionetteDriver;

public class Firefoxtest {
  private WebDriver driver;
  private String baseUrl;
  private boolean acceptNextAlert = true;
  private StringBuffer verificationErrors = new StringBuffer();
  TestCode testcode = new TestCode();

  @Before
  public void setUp() throws IOException {
	String path = "C:\Selenium\IEDriverServer_x64_2.53.1\geckodriver-v0.10.0-win64\wires.exe";
	System.setProperty("webdriver.gecko.driver", path);
	driver = new MarionetteDriver();
	baseUrl = "http://www.google.co.jp/";
  }

  @Test
  public void test() throws Exception {
	  testcode.testCode(driver, baseUrl);
  }

  @After
  public void tearDown() throws Exception {
    driver.quit();
    String verificationErrorString = verificationErrors.toString();
    if (!"".equals(verificationErrorString)) {
      fail(verificationErrorString);
    }
  }
}
```
........
実は、Firefox 47以降からは、geckodriverをダウンロードする必要があるんですね。
以下にURLを載せておきます。
(https://github.com/mozilla/geckodriver/releases) 


ダウンロードしたら、System.setPropertyでdriver情報とパスの設定を行います。 
後は、seleniumIDEからエクスポートしたスクリプトそのままです。

終わってみれば簡単なことでした....
しかし、実際にやっているときは深い沼にはまるものですね....

###Chromeの場合
Chromeだと自分でChromedriverseverを立てる必要があります。そこがめんどくさいですよね。
なぜ、Firefoxに対応していて他のブラウザには対応していないのだ.....
そんなことも言いたくなりますね.....

では、実装の説明に入っていきます。
以下にコードを記載するので見てみてください。


```java:ChromeTest.java
package Selenium.selenium;


import static org.junit.Assert.*;

import java.io.File;
import java.io.IOException;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.NoAlertPresentException;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriverService;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;

public class Chrometest {
	private WebDriver driver;
	private String baseUrl;
	private boolean acceptNextAlert = true;
	private StringBuffer verificationErrors = new StringBuffer();
	private static ChromeDriverService service;
	TestCode testcode = new TestCode();

    @BeforeClass
    public static void createAndStartService() throws IOException {
	    service = new ChromeDriverService.Builder()
	    		.usingDriverExecutable(new File ("C:\Selenium\IEDriverServer_x64_2.53.1\chromedriver_win32\chromedriver.exe"))
	    		.usingPort(9515)
	    		.build();
	    service.start();
    }

    @AfterClass
    public static void createAndStopService() {
      service.stop();
    }

    @Before
    public void createDriver() {
      driver = new RemoteWebDriver(service.getUrl(),
          DesiredCapabilities.chrome());
      baseUrl = "http://www.google.co.jp/";
    }

	@Test
	public void test() throws Exception {
		testcode.testCode(driver, baseUrl);
	}

	@After
	public void tearDown() throws Exception {
	    driver.quit();
	    String verificationErrorString = verificationErrors.toString();
	    if (!"".equals(verificationErrorString)) {
	      fail(verificationErrorString);
	    }
	}
}
```

Firefoxと違う点は、remotewebdriverを使用する点ですね。
また、Port番号が絡んでくるんですよね....
皆さん、Chromeのwebページは表示されるけど、何も書き込まれていない.....
ということがありませんか？上の方にdata:,と記載されているだけのwebページが生成されてしまう....
それを解決するには、Port番号を指定して上げれば良いんです。
上記コードでは、usingPort(9515)としています。
このPort番号は、Chromedriver.exeを立ち上げたときに記載されいるPort番号ですね。

ちなみに、詳しいライブラリの説明、メソッドの説明は各自でお願いします。
参考になるサイトはたくさんありましたよ。

ちなみに今回テストコードは別クラスを作成してそちらに記載しています。


```java:TestCode.java
package Selenium.selenium;

import static org.junit.Assert.*;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

class TestCode {
	public void testCode(WebDriver driver, String baseUrl) throws InterruptedException {
	    driver.get(baseUrl);
	    Thread.sleep(1000);
        assertEquals("Google", driver.getTitle());
        driver.findElement(By.cssSelector("input.lsb")).click();
        driver.findElement(By.name("q")).clear();
        driver.findElement(By.name("q")).sendKeys("google");
	}
}
```

以上でseleniumを用いた簡単なテスト自動化の方法の説明を終わります。
同じような悩みを抱えていた人の助けになれば幸いです。