kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

Selenium) ウィンドウ・タブを切り替える

故あって別件で

Seleniumでブラウザをいじっていて新しいウィンドウ(タブ)ができても
その後の操作が元のウィンドウに対して行われてしまってちょっと悩んだ話

勝手に新しいウィンドウをターゲットにもしてくれないし
新しいウィンドウのハンドルを返してくれるわけでもない

検索してみたけどあんまりかっこいいやりかたはなさそう
どうやらひとつひとつウィンドウを切り替えながら
自分の探しているウィンドウかどうか確認する、っぽい
ごつい

自分はtitleで探してみた

webdriver.window_handleswebdriver.switch_to_windowを使う

def switch_window_by_title(driver, title):
    for w in driver.window_handles:
        driver.switch_to_window(w)
        if driver.title == title:
            return

なお引数をdriverを渡しているのはなんとなくやってるだけ
ちょっとしたスクリプトならグローバル変数でもいいよ派
でも使い回すなら引数にしておいたほうがいいかな

新しいウィンドウを閉じたら元のウィンドウに戻ってくれるっぽいけど
新しいウィンドウを開いたまま元のウィンドウに戻すなら
もとのウィンドウのtitleで切り替え直すよりも
もとのウィンドウハンドルを覚えておくほうがスマート

webdriver.current_window_handleを使う

    # ウィンドウハンドルを覚えておく
    org_window = driver.current_window_handle

    # クリックしたら新しいウィンドウが開く
    driver.find_element_by_link_text("新しいウィンドウ").click()

    # 新しいウィンドウに切り替え
    switch_window_by_title(driver, "New Window")

    # 何かする

    # 元のウィンドウに戻る
    driver.switch_to_window(org_window)