PerlでSeleniumを使ってブラウザ自動化する方法まとめ
この記事では、PerlでSeleniumを使ってブラウザ自動化を行う方法について解説する。
環境構築
まず、以下のモジュールをインストールする。cpmを使う。
cpm install Selenium::Remote::Driver
今回はChromeを使うので、ChromeDriverもインストールしておく。
ChromeとChromeDriverのバージョンを合わせる必要があるので、まずはコマンドラインでChromeのバージョンを確認する。
google-chrome --version
Google Chrome 140.0.7339.127
今回は140.0.7339.127なので、同じバージョンのChromeDriverをインストールする。(もし、なければより近いバージョンを使うこと)
chromedriverのインストールは、「Chrome for Testing availability」 のページからURLをチェックすること。
そして、以下のコマンドでダウンロードして解凍する。
wget https://storage.googleapis.com/chrome-for-testing-public/140.0.7339.127/linux64/chrome-linux64.zip
unzip chrome-linux64.zip
解凍すると、chrome-linux64
というディレクトリができ、その中にchromedriver
がある。
PerlでSeleniumを使ってみる
では、実際にPerlでSeleniumを使ってみよう。
use strict;
use warnings;
use Selenium::Remote::Driver;
# Chromeをヘッドレスで起動させる。
%capabilities = (
browser_name => 'chrome',
extra_capabilities => {
'goog:chromeOptions' => {
args => [ '--headless', '--disable-gpu', '--no-sandbox' ],
},
},
);
my $driver = Selenium::Remote::Driver->new(%capabilities);
# 指定したURLを開く
$driver->get('https://www.example.com');
# 現在のタブのタイトルを取得
say $driver->get_title();
# 現在のタブのURLを取得
say $driver->get_current_url();
# スクリーンショットを保存
say $driver->capture_screenshot('screenshot.png');
# ページのHTMLソースを取得
say $driver->get_page_source();
# 終了する
$driver->quit();
HTMLを取得したり操作したりする
SeleniumではHTMLを取得したり、要素を操作したりすることができる。
例えば、以下のような感じで。
# find_element 要素を1つ取得できる
$driver->find_element('h1', 'css')->get_text(); # h1要素のテキストを取得
$driver->find_element('#submit', 'css')->click(); # idがsubmitの要素
$driver->find_element('ul li#first img', 'css')->get_attribute("src"); # img要素のsrc属性を取得
# find_elemements 要素を複数取得できる
my @links = $driver->find_elements('a', 'css'); # a要素
for my $link (@links) {
say $link->get_attribute("href"); # href属性を取得
}
# find_child_element 子要素を1つ取得できる
my $form = $driver->find_element('#login', 'css'); # idがloginの要素を取得
my $username = $form->find_child_element($form, 'input[name="username"]', 'css'); # 子要素のinput要素を取得
$username->send_keys('myusername'); # キーボード入力
# find_child_elements 子要素を複数取得できる
my @inputs = $form->find_child_elements($form, 'input', 'css');
for my $input (@inputs) {
say $input->get_attribute("name"); # name属性を取得
}
他にも色々あるが、最も使うメソッドは上記のものだろう。
Python等の他言語のSeleniumに比べると、find_child_element
が少し面倒な感じがする。
参考文献
もっと詳しく知りたい場合は、以下のドキュメントを参照するとよい。