Takuya71 のぶろぐ

外資系ソフトウェア会社で働いてます、認定スクラムマスター

文字列から HtmlUnit の HTMLPage オブジェクトを生成するには

htmlunit のテスト

htmlunit を使っているプログラムのテストをしたい

javascript で値を生成しているページの情報を取得するのに htmlunit を使ってますが、プログラムの動作のテストで取得した内容を抽出する部分のプログラムのテストをする為に毎回アクセスするのもいけてないので StringでHTMLのソースをわたして それを使ってテストしたいのですが、htmlunit で取得したコンテンツは HtmlPage というオプジェクトになっております。String のHTMLソースをどうすれば HtmlPage にすることが出来るか というのが今回の内容です。

どうやってやるか

Stackoverflow にありました。
How to create HtmlUnit HTMLPage object from String? まさにこれです。

Answer は Javaですが、Scala でも同じです。

import com.gargoylesoftware.htmlunit.{WebClient, StringWebResponse}
import com.gargoylesoftware.htmlunit.html.{HTMLParser, HtmlPage}
import java.net.URL

val src = Source.fromFile("sample.html")
val htmlsrc = src.toList.mkString
src.close

val url:URL = new URL("http://sample.net/")
val response: StringWebResponse = new StringWebResponse(htmlsrc, url)
val client: WebClient = new WebClient()
val page: HtmlPage = HTMLParser.parseHtml(response, client.getCurrentWindow())

この例では あらかじめ sample.html という対象のページをHTMLで保存しておいて、それを読み込んでStringにしてます。その後 StringWebResponse オプジェクトを作り HTMLParser で HtmlPageを作ります。
これで テストがやりやすくなりました。

おまけ

HtmlPage オプジェクトを HTMLソースの文字列にしたい場合

// page: HtmlPage
page.getWebResponse.getContentAsString
// or
page.asXml

でHTMLソースな文字列となります。(後者は正確にはXMLです。)