ヒントと言える代物でもないが、私が実践したことを書いていこうと思う。基本的の操作については前の記事を見てほしい。
ページオブジェクトモデル
seleniumを使って自動化スクリプトを作る際に1つのモデルパターンとして「ページオブジェクトモデル」がある。これはselenium公式も推奨しているモデルで、簡単に言うと1ページを1オブジェクトとする考え方である。私自身が感じている利点としては2つある。
- ページごとに切り分けられるので、そのページ内の動作を集中できる
- 辿ってきたルートを考える必要がない
1は新しい機能が追加された時なんかにメンテナンスする箇所を絞れる点が優秀だと感じた。また、ページ内で特殊な操作をする時に、共通で定義されている操作とは別で定義することができるので、そこも便利だと思った。2は例えばa→b→cとa→d→cのページ遷移を考える時に、本来であればaの次にbなのかdなのかをきちんと確認する必要がある。これがページごとに定義をしていれば、bはこの操作をする、dはこの操作をするとルートに関して考える必要がなく、ページごとの操作を単純に記述できるのが優秀だと感じた。これからseleniumで何かしら作る際、ぜひ試してほしい。
xpathのリプレイス
私は、seleniumで何かを作る際は各xpathをまとめたymlファイルを用意して外出しにしている。
xpath.yml
{
'ID': '/html/body/main/form[1]/div[1]',
'Password': '/html/body/main/form[1]/div[2]'
}
表のような関係になっている要素で、それぞれの値を見てAならこう、Bならこうと操作を分けたい時を考える。例えば下記のように社員の役職によってボタンを分けたい場合である。
役員はこちら Button
一般社員はこちら Button
派遣社員はこちら Button
普通であれば役員のボタン、一般社員のボタン、派遣社員のボタンで要素を取得するだろう。しかし、これが100行になった場合や、一番上に社長のボタンが追加された時はどうだろうか。要素をその数分記述したり、メンテナンスがめんどくさそうである。そこで行が同一ということに着目し、押したいボタンの役職から行を取得し、行番号を置き換えて要素とする方法を私はとっている。xpath.ymlを下記のように記述する。
xpath.yml
{
'class': '/html/body/main/form[1]/div[1]/div[*****]',
'button': '/html/body/main/form[1]/div[2]/div[*****]'
}
classが各役職の列、buttonが各ボタンの列に要素とする。それぞれの行番号を「*****」とxpathに含まない文字列で置き換えておく。押す処理としては、classの文字列を取得してその役職の行番号を取得→取得した行番号にbuttonの「*****」を置き換える→その要素をクリック、である。
class_name = '一般社員'
row_num = 0
for index in range(3):
element = driver.find_element(By.XPATH, xpath['class'].replace('*****', str(index)))
text = element.text
if class_name in text:
row_num = index
break
button = driver.find_element(By.XPATH, xpath['button'].replace('*****', str(row_num)))
button.click()
表のような要素の組み合わせは色々な所に存在しているので、ぜひ検討してみてほしい。
Pyautogui
pythonのGUI操作ライブラリとしては、seleniumの他にpyautoguiがある。seleniumはwebの要素を指定して操作を行うのに対し、pyautoguiはスクリーンの座標を指定したり、キーボードを指定して操作を行う。webに限った話ではないため、座標さえ分かってしまえば何でも出来てしまうのである。seleniumで行き詰まった時は、pyautoguiも併用も検討してみて欲しい。出来なかったことが出来るようになったり、更に出来ることが増えてくると感じているため試してほしい。詳細については下記記事で紹介する。
まとめ
今回は私がseleniumを使っている時のコツのようなものを紹介した。役に立ちそうであれば、ぜひ活用してみてほしい。
コメント