Python : Heliumを使用したブラウザ操作
はじめに
Pythonでブラウザ操作を行う際にSeleniumを使用することも多いかと思います。その際、もっと簡単に書けないかなぁと思ったことはありませんでしょうか? HeliumというSeleniumのラッパーライブラリを使用することでそれが実現できます。
実際にはここで細かい話をせずとも、公式にてチートシートが用意されていてすぐに使い始めることができるようになっています。ただ、本記事ではチートシートで解説していない機能、関数についてもある程度説明しています。
以下、バージョン3.0.7のHeliumをベースに記載しています。
Heliumの特徴
- Seleniumのラッパーとして動作し、Selenium利用時より30~50%のコード量でコーディングが可能(コーディング削減量は公式の説明を流用)
- ChromeとFirefoxに対応
- chromedriverとgeckodriverを同梱しており、別途導入する必要がない
- ボタンなどのラベルを指定しての操作が可能なため、可読性に優れる
- Seleniumの関数の呼び出しが可能
セットアップ
おなじみのpipを使用します。Seleniumも同時にインストールされます。
pip install helium
Import
from helium import *
ブラウザの起動と終了
基本
WebDriverの指定は不要です。
start_chrome()
start_firefox()
URL指定起動
start_chrome('google.com')
ヘッドレスモードでの起動
start_chrome(headless=True)
start_chrome('google.com', headless=True)
ブラウザの終了
kill_browser()
ページ遷移
ブラウザ起動後に異なるページに遷移する場合はgo_to()
を使用します。refresh()
で現在ページをリフレッシュすることも可能です。
go_to('google.com')
要素のクリック
基本
以下のように、表示されている名称を引数に指定してclick()
を呼ぶだけです。なお、rightclick()
で右クリックが、doubleclick()
でダブルクリックが可能です。
click('Sign in')
以下のように要素名を付加してクリック対象を指定することも可能です。
click(Link('Sign in'))
「Link」以外には「Button」「TextField」「CheckBox」「RadioButton」「Image」「Text」などが用意されています。
マウスカーソルを合わせる
hover('Sign in')
座標指定のクリック
click(Point(100,100))
ドラッグ&ドロップ
drag()
でドラッグが可能です。ドロップ先はto引数に指定します。
drag("ABC", to=TextField('住所'))
ファイルのドラッグ&ドロップも可能です。
drag_file(r"C:\work\sample.txt", to="ここにドロップ")
スクロール
scroll_up()
, scroll_down()
, scroll_right()
, scroll_left()
でそれぞれ上下左右にスクロールできます。デフォルトでは100ピクセル単位にスクロールします。以下のようにスクロール量をピクセル単位で指定することも可能です。
scroll_down(500)
Seleniumの関数の呼び出し
HeliumはSeleniumのすべての機能をラップしているわけではありませんが、以下のようにSeleniumの関数を呼び出すことが可能です。
driver = start_chrome('google.com')
driver.set_window_position(0, 0)
値の取得
基本
以下のように簡単に取得が可能です。
print(TextField('住所').value)
もちろんSeleniumが用意している手法も利用可能です。
print(driver.find_element_by_name('address').text)
要素の存在チェック
if TextField('住所').exists():
print(TextField('住所').value)
ある要素のそばにある要素の指定
例えば値を得たい要素に適切なテキストの表示がない場合、以下のように近くの要素の表示を利用することが可能です。「above」「to_right_of」「below」「to_left_of」が用意されています。
Text(to_right_of='Name:', below=Image(alt='Profile picture')).value
属性の取得
以下の例は「Helium」という表示のリンクのクラス名を取得しています。Heliumのweb_elementプロパティを介してSeleniumのget_attribute()
を呼び出しています。
Link('Helium').web_element.get_attribute('class')
すべての要素を取得
すべての要素を取得する場合は、find_all()
を使用します。この際、上記のような属性の指定方法を利用することも可能ですし、以下のようにHeliumが用意しているS述語を使用した指定も可能です。S述語では「#id名」「.class名」のようなJQueryのセレクタ指定による抽出も可能です。name属性は「@name名」で指定できます。
email_cells = find_all(S("table > tr > td", below="Email"))
表示の待機
表示に時間がかかるページの場合、wait_until()
を使用して操作対象の要素の表示を待つことが可能です。
wait_until(Button('ダウンロード').exists)
内部的には10秒待って表示が完了しない場合は0.5秒ごとにチェックを繰り返す仕様になっています。この待機時間とインターバルのカスタマイズも可能です。以下の例は表示まで30秒待って、それ以降は5秒ごとにチェックを繰り返します。
wait_until(Button('ダウンロード').exists, 30, 5)
wait_until()
を使用しない場合の待機時間のデフォルト値は10秒です。以下のような設定を行うことで、デフォルトの待機時間を変更することが可能です。0を設定すると、Heliumの表示待機機能ではなくSeleniumのimplicitly_wait()
を使用します。
Config.implicit_wait_secs = 30
値の設定
基本
write('password', into='パスワード')
ファイルのアップロード
attach_file(r'c:\test.txt', to='ファイル名')
コンボボックスの選択
select('都道府県', '東京都')
指定キーの入力
press()
で指定したキーを入力することができます。大文字小文字は識別します。
press('A')
文字以外のキーの入力も可能です。キー名はSeleniumと同じですが、「Keys」の指定は不要です。
press(ENTER)
同時押しにも対応しています。
press(CONTROL + 'a')
別ウィンドウへの切り替え
別のウィンドウへ切り替える場合はswitch_to()
を使用します。
switch_to("Google")
該当ウィンドウが複数存在する場合は、find_all()
で該当するすべてのウィンドウを検索して、リストの要素番号でアクセスします。以下は全ウィンドウを取得して、最初の要素のウィンドウに切り替えています。
switch_to(find_all(Window())[0])
サンプルコーディング
以下、Qiitaにログインするサンプルです。
非常に直感的なコーディングが可能になっています。
from helium import *
from getpass import getpass
username = input('User Name : ')
password = getpass('Password : ')
start_chrome('https://qiita.com/')
click('ログイン')
write(username, into='ユーザー名 または メールアドレス')
write(password, into='パスワード')
click('Qiita にログイン')
Discussion