[Python]Seleniumで操作するウィンドウを切り替える2つの方法を紹介

こんにちは、ハッカー見習いのたぬ(@tanuhack)です!

Seleniumを使っていて、ボタンやテキストリンクを押した際に、target="_blank"で『別タブ』あるいは『別ウィンドウ』に飛ばされて、driverが新しいウィンドウに移動せずに操作できなくて困ったことはありませんか?

操作できない原因は、driver.current_url遷移先の前のURLになっているからです。

# driverで操作できるURLを表示する
print(driver.current_url)

つまるところ、driver.current_urlの表示が、遷移先のURLになっていればdriverで操作可能という訳です!

そこで今回は、別タブや別ウィンドウに移動しても、サイトのセキュリティレベルに応じて、PythonのプログラムからWeb操作できるようにする2つの方法を紹介します。

[aside]補足
この先、Seleniumの基本操作は押さえているものとして先に進めます。Seleniumの使い方についてあやふやな方は過去記事を参考にどうぞ!
【完全版】PythonとSeleniumでブラウザを自動操作(クローリング/スクレイピング)するチートシート [/aside]

driver.getを使う

driver.get('遷移後のURL')

大体これでOKです。

ただし、ログインするようなセキュリティが強いサイトでは、接続がタイムアウトしてしまうこともあります…。

そんなときは、次に紹介する方法を使いましょう。

driver.switch_to.windowを使う

driver.switch_to.window('遷移先のウィンドウハンドル')
[aside]ウィンドウハンドルとは
操作しているタブやウィンドウが持っている一意の値のこと[/aside]

ウィンドウハンドルを取得する

ウィンドウハンドルは、driver.window_handlesで取得でき、list型配列として格納されています。

# ウィンドウハンドルを取得する(list型配列)
handle_array = driver.window_handles

ウィンドウハンドルは、新しくタブやウィンドウを開くごとに配列の末尾に格納されます。

list型配列なので、handle_array[0]handle_array[1]のようにアドレスを直接入力して、目的のウィンドウハンドルを容易に取得出来ます。

# それぞれのウィンドウハンドルを表示する
print(handle_array[0]) # CDwindow-C05965EE59CAEC10F211A9409XXXXXXX
print(handle_array[1]) # CDwindow-31F4FEABC928A04414A01D0B5XXXXXXX

ウィンドウを切り替える

目的のウィンドウハンドルが取得できたら、後はdriverを切り替えるだけでSeleniumで操作するウィンドウを切り替えられます。

# ウィンドウハンドルを取得する
handle_array = driver.window_handles

# seleniumで操作可能なdriverを切り替える
driver.switch_to.window(handle_array[1])

driver.switch_to.windowを使えば、遷移前のウィンドウに戻ったり遷移先のウィンドウに進んだりと自由に移動出来ます。

常に末尾のウィンドウに切り替えたい場合

一番最後のウィンドウハンドルを取得したい場合はhandle_array[-1]と配列のアドレスを『-1』にすればOKです。

# ウィンドウハンドルを取得する
handle_array = driver.window_handles

# 一番最後のdriverに切り替える
driver.switch_to.window(handle_array[-1])

変数handle_arrayにすらも格納したくないあなたへ

# これで一気に最後の遷移先へワープ!
driver.switch_to.window(driver.window_handles[-1])

さいごに

今回はSeleniumで『別タブ』や『別ウィンドウ』に遷移しても、遷移元や遷移先に自由に行き来出来る方法を2つ紹介しました。

サイトのセキュリティレベルに応じて、柔軟に使って下さい。

行ったり来たりが多い場合は、driver.switch_to.windowの方が後々わかりやすいです。

ルールとマナーを守って、楽しくスクレイピングしよう!