たまには Haskell が書きたかったので、コマンドラインからあるウェブサービスに書き込みできるようにしたが失敗した。

失敗したというか画面を進めていくと止まってしまう。 なにやらアラートがでて処理ができていない感じなのだろうか。 Rubyでやっても停止するので、Haskellの問題ではない。

一応、最低限の使い方がわかったのでメモしとく。

利用したのは、hs-webdriverphantomJS

phantomJS は –webdriver オプションを使用することで、SeleniumのServerとして使えるようになる。 Haskellでは Selenium と対話するための webdriverというライブラリがあって制御することが可能。

Google にアクセスしてスクリーンショットを作成するプログラムをかいてみた。

{-# LANGUAGE OverloadedStrings #-}
import Test.WebDriver
import Control.Monad.IO.Class
import qualified Data.ByteString.Lazy.Char8 as B

main :: IO ()
main =
  runSession defaultConfig $ do
    openPage "http://google.co.jp/"
    screenshotWriteFile "google.png"

screenshotWriteFile::  FilePath -> WD ()
screenshotWriteFile name = do
  string <- screenshot
  liftIO . B.writeFile name  $ string

事前に

$ phantomjs --webdriver=4444

としてから実行する。

実行すると google.png というファイルが生成されている。

screenshot は ByteString を返すので保存しやすいように screenshotWriteFile という関数を定義して保存しやすくした。 これは webdriver が base64 形式で情報を返してくるのでエンコードした情報を返す模様。

ブラウザを操作するための関数はTest.WebDriver.Commandsを見ればかいてある。