YAMAGUCHI::weblog

土足で窓から失礼いたします。今日からあなたの息子になります。 当年とって92歳、下町の発明王、エジソンです。

Selenium for Pythonでタブの切替をする

はじめに

ここ数年はMoney Forwardとかのおかげでお金の管理はほぼ自動でいい感じにできてるんだけど、それでもまだ政治的な理由とかサービス側のセキュリティの問題で、利用している全サービスの自動管理とかできてない。というわけでエンジニアならその辺自動化するでしょ、とSeleniumでコツコツ始めたわけです。

で、ナビゲーションをしてると <a target="_blank"...> になってるaタグとかあって、ちょっとはまったのでメモ。

タブの切替方法

SeleniumはChromeDriverを使ってChromeを動かしている。タブを切り替える作業はいくつか方法があって

  1. WebDriver.send_keys() を使って手動で切り替えるのと同じキーを送る(例: Ctrl+Tabなど)
  2. WebDriver.ActionsChain() を使って 1 と同様にする
  3. WebDriverが持ってるwindowの一覧のなかから特定のwindowに WebDriver.switch_to.window() で切り替える

1と2は動かす環境(OS)が限定されているのであれば、手書きの作業書をそのままコードに書き直すだけなので簡単。ただ今回はOSをまたいで(MacLinux)実行する予定なので3を採用した。

スニペット

main_window = driver.current_window_handle  # 移動前のwindowを取っておく

for window in driver.window_handles:
    driver.switch_to.window(window)
    if driver.title == 'target title text':  # ページの <title> の内容で目的のタブと判定する
        break

do_some_process()
...
driver.switch_to.window(main_window)  # 処理が終わったら戻る

非常に泥臭いコードだけれども、新しいタブが開かれる前は window handle のインスタンスが無いので、結局こうやって処理するしかないと思う。もっといい方法があったら知りたい。