1: 2016-12-03 (土) 09:06:42 njf |
2: 2016-12-03 (土) 12:09:10 njf |
| *Seleniumとは [#oce1ae90] | | *Seleniumとは [#oce1ae90] |
| + | Seleniumとは本来は微量元素、セレンのことですが、ここではブラウザをスクリプトから操作するツール群のことです。[[公式ページはこちら:http://www.seleniumhq.org/]]。 |
| + | |
| + | これを使うとWebアプリのテストなどの自動化が可能です。 |
| + | |
| + | それ以外にも、例えばログインなどの面倒なサイトへ自動ログインして自動で情報の取得、更新ができる自分用のツールを作ったりもできます。 |
| + | |
| + | もちろん、コマンドラインだけでログインなども可能なのですが、Javascriptなどで情報のやりとりを行っているサイトも多く、意外にうまくいかないこともあります。かといってディベロッパーツールなどでネットアクセスを解析するのも面倒です。そんなときにはブラウザでアクセスできるSeleniumが便利です。 |
| + | |
| + | 対応言語はJava、C#、Ruby、Python、Javascripと幅広く、対応ブラウザもChrome、FireFoxなど主なところはだいたい対応していると思ってよいでしょう。 |
| + | |
| + | 個人的にはログインの面倒なサイトなどの自動化でPythonとChromeの組み合わせで使っており、ここでもその二つを中心に解説します。 |
| + | |
| *Macでのインストール [#r511c824] | | *Macでのインストール [#r511c824] |
| + | |
| + | SeleniumをPythonで動かすには二つのステップが必要です。 |
| + | -Seleniumをインストール |
| + | -ブラウザのドライバーをインストール |
| + | |
| + | 他にSeleniumサーバというのもありますが、個人でちょっとしたことに使う分には必要ありません。 |
| + | |
| + | **Seleniumをインストール [#v0421e9f] |
| + | |
| + | pipに対応しているので、コマンドラインから簡単にインストールできます。 |
| + | sudo pip install selenium |
| + | もし「-H」オプションが必要と言われたらつけてください。 |
| + | sudo -H pip install selenium |
| + | |
| + | **ブラウザのドライバーをインストール [#ac8322ad] |
| + | ブラウザのドライバーはサードパーティーなどによって各ブラウザごとに開発されています。[[こちら:http://www.seleniumhq.org/download/]]のページからダウンロード可能です。 |
| + | ここではChromeのものをダウンロードしてきます。 |
| + | |
| + | 解凍したドライバはパスの通った場所に置く必要があります。 |
| + | または、メンテナンスなどを考えるとリンクの方が楽かも知れません。 |
| + | |
| + | ln -s /yourlocationdir/chromedriver /usr/local/bin/chromedriver |
| + | |
| + | これで準備は完了です。 |
| + | |
| *基本的な使い方 [#z5567493] | | *基本的な使い方 [#z5567493] |
| + | |
| + | まずインポートします。 |
| + | from selenium import webdriver |
| + | |
| + | 次にドライバーのオブジェクトを取得します。 |
| + | driver = webdriver.Chrome() |
| + | |
| + | この段階で、新しいプロセスでブラウザが立ち上がり、空の画面が表示されます。 |
| + | |
| + | 移動は |
| + | |
| + | driver.get("http://njf.jp") |
| + | |
| + | でそのページに移動します。 |
| + | |
| + | そのページに表示されている要素の取得も可能で「find_element_by〜」というメソッドで行います。 |
| + | 特によく使うのは、 |
| + | |
| + | find_element_by_name |
| + | find_element_by_id |
| + | find_element_by_xpath |
| + | |
| + | あたりです。それぞれname、id、XPathをもと要素に取得します。XPathとはその文書の要素のパスで、Chromeだとディベロッパーツールの中のエレメントタブから好きなエレメントを右クリックし、「copy」を選ぶとXPathをコピーできるので、nameやidで区別できない要素を取得するのに便利です。 |
| + | |
| + | &ref(xpath_copy_0.png,mw:480,mh:360); |
| + | |
| + | また取得した要素にはsend_keysというメソッドがあり、これによってフォームに値を入力できます。 |
| + | |
| + | driver.find_element_by_name("email").send_keys("mymail@mymail.jp") |
| + | driver.find_element_by_name("password").send_keys("mypassword") |
| + | |
| + | 日本語を入力するときはUTF-8を使いましょう。 |
| + | |
| + | driver.find_element_by_name("comment").send_keys(u"テストです") |
| + | |
| + | |
| + | ボタンのクリックも可能です。 |
| + | driver.find_element_by_id("form_button").click() |
| + | |
| + | Seleniumはスクレイパーとしての機能はさほど優れてはいないため、情報の取得を行うときは、別途Beautiful Soupなどを使うのがおすすめです。 |
| + | 表示中のhtmlソースはpage_sourceで取得できます。 |
| + | |
| + | html = driver.page_source |
| + | bf = BeautifulSoup(html,"html.parser") |
| + | |
| + | 画面を閉じるのはcloseメソッドです。 |
| + | |
| + | driver.close() |
| + | |
| + | *注意事項 [#kea869af] |
| + | |
| + | 注意としては、普段使っているブラウザでもクッキーなどは共有されないようで、ログイン処理などは毎回しなければなりません。 |
| + | |
| + | また、起動のたびにプロセスが立ち上がるので、開発中は自分で閉じるのを忘れるとメモリを圧迫するので注意が必要です。 |
| + | |
| + | プロセスが終わるとブラウザも落ちてしまうことがあります。その時は以下のような処理を最後に入れて、「q」とコマンドラインで入力するまでプログラムを終了させないようにするとよいでしょう。 |
| + | |
| + | while True: |
| + | inputline = raw_input() |
| + | if inputline == "q": |
| + | break |
| + | |
| + | *まとめ [#x874eeda] |
| + | |
| + | Selenium+Pythonだとかなり簡単にブラウザが操作できます。 |
| + | テストの自動化はもちろん、個人でもたとえば、ちょっとした情報をWebサービスなどで見るのにも、トップページ->ログインページ->ログイン後ページ->目当てのページ、という風にしなければならなかったものを自動化できます。 |
| + | |
| + | この程度の処理なら10分ほどで書けてしまうので、普段の面倒な処理の効率化にもおすすめです。 |