文字列から 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です。)