こんにちは、SEの孟です。
今日のブログネタはphantomjsにしたいと思います。
http://phantomjs.org/
phantomjsはクローラやjavascriptのテストツールとして多く使われているそうです。
ちなみに、インストールは簡単です。(この記事書いた時点での最新版は1.8.1です)
http://phantomjs.org/download.html
まずは、インストールに必要なライブラリを入れておきましょう。
gothicとminchoのフォントを入れておかないと文字化けします。
gothicとminchoのフォントを入れておかないと文字化けします。
# cp bin/phantomjs /usr/local/bin
これで、インストール完了!
page.open("http://facebook.com",function(){phantom.exit();})
こんな感じです。まぁ、javascriptなので分かりやすいですよね。
phantomjsのコードは、ほとんどがコールバックの非同期方式です。最初はちょっと慣れないかもしれません。
では、これを実行してみます
# phantomjs facebook.phantomjs
続きまして、Facebookにログインしてみたいと思います。
Facebookのログインフォームのエレメントにはそれぞれidが指定してあるので、document.querySelectorで値を入れてformをsubmitする感じにしたいと思います。この一連のdom操作にはpage.evaluateを使います。
そして、先ほどのスクリーンショットは、ログイン後に作るようにonLoadFinishedを使います。
そして、先ほどのスクリーンショットは、ログイン後に作るようにonLoadFinishedを使います。
var username = "blogphantomjs20130207@sute.jp";var password = "hogehoge"var page = require("webpage").create();page.open("http://facebook.com",function(){page.onLoadFinished=function(){phantom.exit();}page.evaluate(function(arr){document.querySelector("#email").value=arr[0];document.querySelector("#pass").value=arr[1];document.querySelector("#login_form").submit();},[username,password]);})
※ page.evaluateの中から、外の変数を利用することできません。使いたい変数をevaluateの引数に渡せばOKです
※ evaluateのcallbackからreturnされた返り値はevaluateの返り値として受け取れます。var hoge = page.evaluate(...
実行してみると... はい!ログインできました。スクリーンショットも取れています。
最後に、近況を投稿してみましょう!
このブログのために、アカウントを作ったばかりなので、友達がいません!
プロファイルページに行ってから書くしかないですね...
var username = "blogphantomjs20130207@sute.jp";var password = "hogehoge"var page = require("webpage").create();page.open("http://facebook.com",function(){// step 2page.onLoadFinished=function(){// step 4page.onLoadFinished = function(){// step 6page.onLoadFinished = function(){}// step 5page.evaluate(function(){document.querySelector("textarea").value="hello world!!! sent by phantomjs.";document.querySelector("form[action*=updatestatus]").submit();})// step 7window.setTimeout(function(){phantom.exit();},3000);}// step 3page.evaluate(function(){var link = document.querySelector("a[href*=profile]");location.href=link.href;});}// step 1page.evaluate(function(arr){document.querySelector("#email").value=arr[0];document.querySelector("#pass").value=arr[1];document.querySelector("#login_form").submit();},[username,password]);})
step順にソースを読むと理解しやすいと思います。
- step 1 ログイン情報をdomで入れてformをsubmitしてログイン
- step 2 先にcallbackを書く必要があるので、formをsubmitする前に書き換え、ログイン後のロジックをここに入れる
- step 3 profileリンクを探して、リダイレクトする
- step 4 リダイレクトされた後のロジックはここです
- step 5 近況を書く場所を探して、値を入れて投稿
- step 6 投稿後のコールバックロジックはここです。Ajaxで投稿するため、コールバックが複数回発生します。このため、空にしておきます
- step 7 一連の動作が終わるまでTimeoutで待ってからスナップショットを取ります
はい、こんな感じですね。この通りhello worldがphantomjsから投稿されました。
皆さんもphantomjsを使ってみてください。