さよなら WebDriver Client Agouti
はじめに
Agouti は単純で分かりやすくてちょっとしたことに使いやすい Go のライブラリなのですが、もう積極的なメンテナンスはおこなわないとのこと。今日知ったのですが、おととし README にそう書き加えられたようです。残念・・・。
今さらながらの使いどころメモでお焚き上げ。
インストール
ライブラリを go install
して、ドライバを別途インストールする。僕は mac を使うので、brew で設定してしまった。ここにドキュメントがある。
brew install phantomjs
brew install chromedriver
brew install selenium-server-standalone
利用しようとして、セキュリティの警告が出て「削除するか?」と聞いてきたら、とりあえずキャンセルして、mac のシステム環境設定の「セキュリティとプライバシー」を開くと、「ダウンロードしたアプリケーションの実行」なるものが出てるので、そこで許可をすればよい。
基本的な使い方
起動
d := agouti.ChromeDriver(agouti.Browser("chrome"))
if err := d.Start(); err != nil {
return err
}
defer d.Stop()
p, err := d.NewPage()
if err != nil {
return err
}
ページ遷移
if err := p.Navigate("http://example.selenium.jp/reserveApp/"); err != nil {
return err
}
要素を探す
ちゃんとしてるページなら p.FindByID()
でだいたいなんとかなる。ウエブ開発ツール(僕の常用ブラウザは Firefox だ)のインスペクターで「コピー → XPath」すれば、要素の XPath がとれるので、困ったときは p.FindByXPath()
を使うのも手だろう。
ラジオボタン / チェックボックス
ラジオボタンやチェックボックス(type=radio
やtype=checkbox
のとき)は要素に対して .Click()
を使えばよい。
サンプル
使い方で特に困ることはない。インターフェースが単純で分かりやすい。http://example.selenium.jp/reserveApp/
にあるテスト用のフォームを埋めるサンプルを用意したので、これでだいたい分かる。
d.Stop()
しなければブラウザは消えないので、わざと書かない、というのもありなのかもしれない。
package main
import (
"log"
"strconv"
"time"
"github.com/sclevine/agouti"
)
func main() {
// 準備 ====================================================
d := agouti.ChromeDriver(agouti.Browser("chrome"))
if err := d.Start(); err != nil {
log.Fatal(err)
}
defer d.Stop()
p, err := d.NewPage()
if err != nil {
log.Print(err)
returnq
}
// ページ遷移 =================================================
if err := p.Navigate("http://example.selenium.jp/reserveApp/"); err != nil {
log.Print(err)
return
}
// フォームを埋める ---------------------
// 今日の日付が埋まっているが、翌日以降でないとエラーになるので、翌日をセットする
day := time.Now().AddDate(0, 0, 1).Day()
if err := p.FindByID("reserve_day").Fill(strconv.Itoa(day)); err != nil {
log.Print(err)
return
}
// 1泊 となってるところを 3泊に上書き
if err := p.FindByID("reserve_term").Fill("3"); err != nil {
log.Print(err)
return
}
// ラジオボタンを変更する
if err := p.FindByID("breakfast_off").Click(); err != nil {
log.Print(err)
return
}
// プランをチェック
if err := p.FindByID("plan_b").Click(); err != nil {
log.Print(err)
return
}
// 名前を埋める
if err := p.FindByID("guestname").Fill("ねこですねこはいます"); err != nil {
log.Print(err)
return
}
// submit ----------------------
if err := p.FindByID("goto_next").Submit(); err != nil {
log.Print(err)
return
}
// 処理が終わるとすぐブラウザが閉じてしまうので適当に待つ
time.Sleep(time.Hour)
}
おわりに
これから先、agoutil の代わりに何を使えばいいのだろうか?いい選択肢をご存じならば教えてほしい。
Happy hacking!
Discussion