こんにちは、ハッカー見習いのたぬ(@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
の方が後々わかりやすいです。
ルールとマナーを守って、楽しくスクレイピングしよう!