uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

HtmlUnit賛歌

知っている人には、今さらですが、HtmlUnitというものがあります。名前からするとxUnit系の、ユニットテストツールのような気がするかもしれませんが、違うよ!全然違います。誤解を招く名称です*1

これはGUIレスなブラウザなのです。GUIがないだけでなく、CUIコマンドラインインターフェースもありません。唯一できるのは、プログラムからブラウザの機能をJavaAPIを通じてJava(やGroovy)から呼び出し、そのAPIメソッド呼出しの結果を得るだけです。「非対話型ブラウザ」です。

いままで、XmlParserやNekoHtmlやHttpBuilderといったもののみでスクレイピングをしてきた諸兄は、HtmlUnitを一回使ってみるのがよろしいと思いました*2HtmlUnitを使うことで、ログイン処理や、ページ遷移が簡単になったり、ページの表示にJavaScriptとかを使うケースも対応できたりとか、それらを使ってちまちまやるよりも圧倒的に簡単になることがあります。プロトコルレベルでやるってことは、基盤となるブラウザ機能の必要なところは自前で作らないといけないってことですから。ブラウザの実装であるHtmlUnitは、そこらへんJavaScriptを含めて実装済みになるので、楽なのです。

FireFoxをお使いなら、こちらHtmlUnitScripterHtmlUnitのコード断片を生成させるのも良しでしょう。

HtmlUnitでは、XPathを使う*3ことができるのですが、これも気に入りました。XPathはそれ自体汎用的で強力であるだけでなく、ブラウザと連携する他のツール(AutoPager Add-on(Chrome用もある)とかWebTest Recorder Sidebarでも使える)もあるのが強みです。

そんなこんなしてHtmlUnitを使って、

などを、JGGUG合宿の企画g100ponのリモート参加ネタとして上げさせていただきました。サンプルとして御笑覧下さい。なおリモート参加にあたり、規定コメントの不足やtwtterの送信を怠るなど、各位には失礼をば致しました。

*1:もちろんWeb機能テストで使えますが、そんなこと言ったら足し算だってユニットテストで使えます。

*2:HtmlUnitは下位層ではNekoHtmlを呼び出しています。

*3:HtmlPage#getByXPath()