PythonでSeleniumを使った自動テスト

#PythonでSeleniumを使った自動テスト
##スペック

* Ubuntu17.04
* Intel i7-7500U
* Python 3.6.0
* Selenium 3.8.0
* Visual Studio Code 2.0

#導入
インストールにはパッケージ管理ツールpipを使います.

```shell-session

$ pip3 install selenium -U

```
またブラウザを動かすにはそのブラウザのドライバが必要になります.今回は,どのOSでも使用できるChromeを使おうと思います.
https://chromedriver.storage.googleapis.com/index.html?path=2.34/
から自分のOSにあったドライバをダウンロードし,解凍した中のドライバをパスの通ったところに置きましょう.(Ubuntuの場合usr/bin/localに起きます.)

```shell-session
$ unzip chromedriver_linux64
$ sudo mv chromedriver /usr/local/bin/
```

seleniumの詳細について知りたければ,以下の公式サイトを見ると良いでしょう.
api詳細
http://docs.seleniumhq.org/docs/
Selenium python
http://selenium-python.readthedocs.io/

Seleniumのみでテストを行って言っても良いのですが,Pythonには便利なテストモジュール**unittest**が用意されています.これを使うことにします.**unittest**で覚えて置くことは以下の点です.

* テストクラスに**unittest.TestCase**を継承させる.
* テストメソッドのメソッド名はtestで始まるものにする.
* 各テストメソッドの前と後にはそれぞれ,**setUp()**,**tearDown()**メソッドが自動で呼ばれる.

##チュートリアル

はじめにサンプルとして,Google翻訳が正しく動いているかテストしてみましょう.
練習のため,直接サイトのリンクには飛ばず,Googleのトップページから辿っています.

```py3:sample_test1.py

import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

class SampleGoogleTest(unittest.TestCase):
    def setUp(self):
        #ブラウザ起動
        self.browser = webdriver.Chrome()
        #5秒停止
        time.sleep(5)
        #画面最大化
        self.browser.maximize_window()
    def tearDown(self):
        self.browser.quit()
    def test_check_google_translate_work_properly(self):
        #Googleアクセス
        self.browser.get("https://www.google.co.jp/")
        #検索窓取得
        input_search = self.browser.find_element_by_xpath("//input[@title='検索']")
        #キーワード入力
        input_search.clear()
        input_search.send_keys('翻訳')
        input_search.submit()
        #一時停止
        time.sleep(5)
        #『Google 翻訳』というリンクをクリック
        link_list = self.browser.find_element_by_link_text("Google 翻訳")
        link_list.click()
        #一時停止
        time.sleep(5)
        #入力のinputを要素名,idから取得し『america』と入力
        input_text = self.browser.find_element_by_xpath("//textarea[@id='source']")
        input_text.send_keys("america")
        #Enterキー(おそらく押さなくても結果は出るが念の為)
        input_text.send_keys(Keys.ENTER)
        #一時停止
        time.sleep(5)
        #出力を要素名,idから取得
        output_text = self.browser.find_element_by_xpath("//span[@id='result_box']/span")
        #出力が想定したものと間違っていないか確認
        self.assertEqual(output_text.text,'アメリカ')


if __name__ == '__main__':
    unittest.main(verbosity=2)
    

```

簡単に説明しておきます.
###setUp()
 ここではまず,webdriverクラスのメソッド**Chrome()**を使いブラウザを起動します.他のFirefoxやIEなどのブラウザのメソッドも用意されているので,ドライバが用意されていれば使えます.
ここで**time.sleep(5)**を呼んでいます.これは,指定した秒数停止するメソッドです.
seleniumには**implicity_sait()**という一時停止の関数があるのですが,この関数はブラウザによって不安定なのでそちらは使わないようにしてください.
最後にmaximize_window()で画面を最大化します.

###test_check_google_translate_work_properly()
このメソッドが実際のテストメソッドとなります.
まず,**get("URL")**で目的のページに飛びます.
そこから先は**find_element〜〜**メソッドで要素を取得し,**click()**や**send_key()**などのメソッドを使い,ブラウザを操作して行きます.**find_element〜〜**や取得したエレメントを操作するメソッドに何があるかについては,http://selenium-python.readthedocs.io/locating-elements.html
とhttp://selenium-python.readthedocs.io/navigating.html
を見ると良いでしょう.

キーボードの特別なキー(Enterなど)はKeysクラスに用意されています.

ページの出力が目的のものと一致するか否かは**TestCase**のメソッド**assert〜〜**を使います.どんなメソッドがあるか気になるなら,
https://docs.python.jp/3/library/unittest.html#assert-methods

を見てみましょう.

###tearDown()
ここでは,ブラウザをとじています.
ブラウザが毎回起動したままだと鬱陶しいです.

##main
ここでテストの実行をしています.
verbosityはエラーを表示する最大数です.

テストを実行してみましょう.
自動的にchromeが立ち上がり操作してくれるはずです.

```shell-session

$ python3 sample_test1.py 

```