はじめに
seleniumでの自動検査を行っていたときに複数のタブを開きたいことがあってその手順を調べた。
chromeとsafariでウインドウを切り替えたい
どちらを使う場合も、新規ウインドウ(タブ)を出したい時は、
driver.execute_script( 'window.open()' )
でスクリプトで出すことができる。URLは、
driver.get('URL')
で遷移させることができる。スクリプトで指定してもできる。
作成したウインドウにアクティブになっていないので、それを切り替える必要があるのだが、いろいろなところで紹介されている。
driver.switch_to.window(driver.window_handles[-1])
では、safariで作成したウインドウに切り替えることができない。正確にいうと、できることもあるが、正確ではない
window_handlesで開いているウインドウのリストをとれる、だから最新のは最後に追加されるはず、ということなんだろう。確かにchromeでは正確に動く。でもsafariでは失敗する。
そこで、実験して調べたところ、safariだと必ずしもリストの最後に新しいウインドウ名が追加されるわけではないらしい。
だからリストの最後をとってもどれに切り替わるかわからない。
しょうがないので、ウインドウを増やす前のリストとウインドウを増やしたあとのリストを比較することで新しいウインドウ名を調べてそれを指定してあげることにした。
これならばchromeでもsafariでも動く。
#増やす前のウインドウリスト
hadles_1 = driver.window_handles
driver.execute_script( "window.open()" )
#増やした後のウインドウリスト
handles_2 = driver.window_handles
#比較するために一度setにして、差分を取り出したあとにlistに戻す
new_window = set(handles_2) - set(hadles_1)
new_window = list(new_window)
driver.switch_to.window(new_window[0])