普段の仕事で定例化しているものや、同じ作業を何回もしていて面倒だと感じることって結構あると思います。
特にWebの操作はポチポチ何回もやるのは面倒です。
そこで、Selenium WebDriverを使って作業の自動化をしてみます。
WebDriverのクライアントは様々な言語から出ていますが、今回はGolangのAgoutiというライブラリを利用します。
Golangにしたのは、一つのバイナリになるのでチームなどへの連携、配布が楽ってのが大きな理由です。
事前準備
WebDriverをインストール
- Chrome用のWebDriverをインストール
$ brew install chromedriver
他のブラウザでも構わないですが、以下の記事の通り、FireFoxはまだ動きませんでした。(2017/1/24時点)
現状、chromedriverを利用するのが一番ラクそうです。
Safariを利用する場合は、以下からWebDriverのSafari拡張機能をインストールしてください。
また、追加でselenium-server-standalone
もインストールする必要があります。
$ brew install selenium-server-standalone
agoutiをインストール
go get
でインストールします。
$ go get github.com/sclevine/agouti
Qiitaにログインしてみる
ログインだと要素の取得、値の設定、formのサブミットなどがあってちょうど良いので、Qiitaにログインしてみます。
以下のコードを実行すると、Qiitaにログインします。(適宜IDとパスワードは変更してください)
$ go run main.go
package main
import (
"github.com/sclevine/agouti"
"log"
"time"
)
func main() {
// ブラウザはChromeを指定して起動
driver := agouti.ChromeDriver(agouti.Browser("chrome"))
if err := driver.Start(); err != nil {
log.Fatalf("Failed to start driver:%v", err)
}
defer driver.Stop()
page, err := driver.NewPage()
if err != nil {
log.Fatalf("Failed to open page:%v", err)
}
// ログインページに遷移
if err := page.Navigate("https://qiita.com/login"); err != nil {
log.Fatalf("Failed to navigate:%v", err)
}
// ID, Passの要素を取得し、値を設定
identity := page.FindByID("identity")
password := page.FindByID("password")
identity.Fill("Your Id Here.")
password.Fill("Your Passowrd Here.")
// formをサブミット
if err := page.FindByClass("loginSessionsForm_submit").Submit(); err != nil {
log.Fatalf("Failed to login:%v", err)
}
// 処理完了後、3秒間ブラウザを表示しておく
time.Sleep(3 * time.Second)
}
Safariで動かす場合は以下のように修正が必要です。
- driver := agouti.ChromeDriver(agouti.Browser("chrome"))
+ driver := agouti.Selenium(agouti.Browser("safari"))
実際に動かしてみると、こんな感じです。
どうでしょうか?agouti自体が結構シンプルに使えるようにできているので、簡単にログインくらいは自動化できると思います。
業務ではもう少し複雑なシステムへのログイン(CSVにログインに必要なマトリクスを保存しておき、DOMからマトリクスのA1,F2,B5,D1を入力しろといった指示を抽出してマッチングする)なんかを自動化しています。
他にも勤怠情報の登録や、定期的に行ってるRedmineからの情報収集なんかも自動化できそうです。
みなさんもagoutiを使って日々の面倒な作業を自動化してみてはいかがでしょうか?