👋

さよなら WebDriver Client Agouti

2022/07/22に公開

はじめに

Agouti は単純で分かりやすくてちょっとしたことに使いやすい Go のライブラリなのですが、もう積極的なメンテナンスはおこなわないとのこと。今日知ったのですが、おととし README にそう書き加えられたようです。残念・・・。

今さらながらの使いどころメモでお焚き上げ。

https://github.com/sclevine/agouti

インストール

ライブラリを 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=radiotype=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