ますたろー日記

大阪から上京して7年。渋谷界隈で頑張ってます。

Androidアプリのダウンロード数の定点観測を自動化するためのSeleniumコード

Selenium2がお気に入りで仕方がない今日この頃です。
Selenium2を使えば、Ajaxで動的に出力されるコンテンツを自動で取得してくるバッチなんかを、超お手軽に作れます。

例えば、Androidアプリのダウンロード数を確認するためにアクセスするhttps://market.android.com/は、
ダウンロード数を表示している箇所がJSで遅延読み込みされるため、Web::Scraperなどで取得してくるのが難しいです。

f:id:masutaro:20120120231104p:plain

ところが、Selenium2(正確にはSelenium Server2)と、

f:id:masutaro:20120120230757p:plain

サードパーティCPANモジュールのSelenium::Remote::Driverを使えば、
5分くらいで自動化用のスクリプトが書けてしまいます。

以下、サンプルコードです。

#!/opt/local/bin/perl

use strict;
use warnings;
use Encode qw(encode);
use Selenium::Remote::Driver;

my $driver = Selenium::Remote::Driver->new(
    'browser_name'       => 'firefox',
    'remote_server_addr' => 'localhost:4444'
);
$driver->get('https://market.android.com/publish/');

#
# ログイン
#
my $email    = $driver->find_element('Email', 'id');
$email->send_keys('your_address@email.com');

my $password = $driver->find_element('Passwd', 'id');
$password->send_keys('your_password');

my $submit   = $driver->find_element('signIn', 'id');
$submit->click;

#
# JSの処理が終わるまで待つ。通信環境に応じて値は適宜変更。
#
sleep 20;

#
# ダウンロード数情報を取得
#
my $download   = $driver->find_element('GGJ3GERDOX', 'class')->get_text;
$download      = encode('utf8', $download);
my ($sum)      = $download =~ m!合計インストール数(ユーザー): ([0-9]+)!;
my ($total)    = $download =~ m!([0-9]+) 総!;

#
# printfして終わり。自分の本番環境ではメール送信してる。
#
printf("合計インストール数(ユーザー):%s\n", $sum);
printf("総インストール数(端末):%s\n", $total);

おそらくきっと、Selenium1でも出来る技だと思いますが、Selenium IDEで奇妙なテストケースを書くのが受け付けられなかった僕には、Selenium2になって、使いやすいCPANモジュールで簡単にスクリプトの実装が書けるようになってうれしいことこの上ない状態です。

次回はiTunes Connectの自動取得用スクリプトを書こうと思います。

2012年1月21日追記:githubにもソースあげました。
https://github.com/masutaro/selenium_code/blob/master/fetch_android_download_count.pl