【Python】Selenium(タブ切り替え)

スポンサーリンク

久しぶりにSeleniumについて書きたいと思います。
これはねぇ~先日知人からの相談で対応していて、一緒に調べて解決した事なんですよね。
何があったかというと、【クリックしたら、リンク先が新しいタブで開いた】んですよね。。。
今回は『新しいタブで開いたページをどうやって取得したらいいのか』を紹介したいと思います。

使用する関数

タブの切り替えには下記2つの関数を使用します。

driver.window_handles[<Index>]
driver.switch_to.window(<handle値>)

ここでのdriverとは、WebDriverのことです。
例:
driver = webdriver.Chrome()

まずは、Windowのハンドル値を取得します。取得したハンドル値を使って、タブを切り替えます。
例:
handle = driver.window_handles[1] #2つめのタブ
driver.switch_to.window(handle) #切り替える

また、古い関数だと[switch_to_window()]という関数があるようです。
現在のバージョンだと使用できないので注意しましょう。

サンプルを作ってみる

簡単ですが、サンプルを作成してみました。
処理の流れとしては、下記の通りです。

■グーグルで「モバイルモニタ」を検索
■表示されたページから広告の商品があるので、一番左をクリック
■新しいタブで開くので、タブの切り替え
■商品名を取得する

本題は赤字の部分です。

処理の内容

Scriptファイルを紹介するのは面倒なのですべてを一気に紹介します。
赤字の部分が今回の本題の処理です。

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

def ExeChromeStart(url):    
    #Chromeを操作
    driver = webdriver.Chrome(ChromeDriverManager().install())
    driver.maximize_window()
    
    #デフォルト待機時間
    driver.implicitly_wait(2)
    
    #引数のアドレス(URL)にアクセスする
    driver.get(url);
            
    return driver

def SearchGoogle(driver,word):
    #inputbox取得
    element = driver.find_element_by_css_selector('.gLFyf.gsfi')
    
    #キーワード入力後検索
    element.send_keys(word)
    element.submit()
    
def ClickProduct(driver):
    #商品をクリック
    elements = driver.find_elements_by_css_selector('.mnr-c.pla-unit')
    
    #適当に一番左をクリック
    elements[0].click()

def ChangeTab(driver):
    #一番右のタブに切り替える
    handle = driver.window_handles[-1]
    driver.switch_to.window(handle)

if __name__ == "__main__":
    
    #Google検索へ
    URL = 'https://www.google.co.jp/'
    driver = ExeChromeStart(URL)
 
    #モバイルモニタを検索
    SearchGoogle(driver, "モバイルモニタ")

    #広告の商品をクリックする
    ClickProduct(driver)
    
    #新しいタブで開いているので、タブを切り替える
    ChangeTab(driver)

    #ここからは、そのページごとの処理になる。
    #今回はアマゾンのページから商品名を取得する
    element = driver.find_element_by_css_selector('.a-size-large.a-spacing-none')
    print(element.text)

    input('クリック')
    driver.quit()

今回は、一番右のタブを取得するように指定したかったので、ハンドルの配列のIndex値は[-1]としました。

まとめ

Seleniumを使った処理として、クリックしたら新しいタブに開くパタンを初めて経験しました。
他の対処方法としては、クリックするエレメントのリンクを取得して、そのページで飛ぶようにする方法もあるそうです。
Seleniumを使っているという事は、基本的に常に作業として変わらない事だと思いますので、方法としてはどちらを選択したもいいのかもしれません。
ただ、今回の件でタブを切り替える方法が分かりました。
情報として、昔の関数[switch_to_window()]が上がっていたので、現在の関数を見つけるまでに時間がかかりました。

コメント

タイトルとURLをコピーしました