久しぶりに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()]が上がっていたので、現在の関数を見つけるまでに時間がかかりました。
業務でプログラミング(C#/VB/Python)を作っている。
挫折を何回も繰り返し、幾度の壁を乗り越えてきた。
乗り越えてきた事を忘れないように記録に残す。
同じ思いをしている人への情報提供になれたらと思う。
基本は初心者に向けたプログラムの情報を提供する。
コメント