Help us understand the problem. What is going on with this article?

【Selenium】リンクを新しいタブで開いて移動【Python/ChromeDriver】

ブラウザ操作してますか?

毎日同じブラウザ操作してませんか?

そんなブラウザ操作はSeleniumに任せましょう!

ブラウザを触っているときにリンクをCtrlを押しながらクリックして新しいタブで開くことありませんか?
僕はとてもよくやりますw

そんな一連の流れになります。

リンクを新しいタブで開いて移動

sample.py
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait

import platform

driver = webdriver.Chrome("chromedriver.exe") #chromedriver.exe読み込み

#
#
#該当ページまでの処理
#
#

#クリックする要素
element = driver.find_element_by_xpath('/html/body/hogehoge')
#element = driver.find_element_by_link_text("hogehoge") #リンクテキストで取得したい時はこちら

#クリック前のハンドルリスト
handles_befor = driver.window_handles

#(リンク)要素を新しいタブで開く
actions = ActionChains(driver)

if platform.system() == 'Darwin':
    #Macなのでコマンドキー
    actions.key_down(Keys.COMMAND)
else:
    #Mac以外なのでコントロールキー
    actions.key_down(Keys.CONTROL)

actions.click(element)
actions.perform()

#新しいタブが開ききるまで最大30秒待機
WebDriverWait(driver, 30).until(lambda a: len(driver.window_handles) > len(handles_befor))

#クリック後のハンドルリスト
handles_after = driver.window_handles

#ハンドルリストの差分
handle_new = list(handles_after - sethandles_befor)

#新しいタブに移動
driver.switch_to.window(handle_new[0])

負荷がかかりすぎないように気をつけて
適宜waitsleepを入れましょうー

解説

sample.py
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait

Seleniumライブラリと今回必要なパッケージを読み込みます。

sample.py
import platform

OSを判断する為のライブラリを読み込みます。

sample.py
driver = webdriver.Chrome("chromedriver.exe") #chromedriver.exe読み込み

#
#
#該当ページまでの処理
#
#

chromedriverを起動して操作しましょう。

sample.py
#クリックする要素
element = driver.find_element_by_xpath('/html/body/hogehoge')
#element = driver.find_element_by_link_text("hogehoge") #リンクテキストで取得したい時はこちら

xpathlink_textでクリックする要素を変数に代入しましょう。

sample.py
#クリック前のハンドルリスト
handles_befor = driver.window_handles

新しいタブが開く前のハンドルをリスト形式で取得します。

sample.py
#(リンク)要素を新しいタブで開く
actions = ActionChains(driver)

if platform.system() == 'Darwin':
    #Macなのでコマンドキー
    actions.key_down(Keys.COMMAND)
else:
    #Mac以外なのでコントロールキー
    actions.key_down(Keys.CONTROL)

actions.click(element)
actions.perform()

ActionChainsというクラスを使うとキー操作を記録して実行することができます。
Macとそれ以外のOSではGoogle Chromeブラウザの場合、新しいタブで開くショートカットキーが異なります。

Mac : command + クリック
WindowsやLinux : Ctrl + クリック

platformライブラリでOSを判断して条件分岐させています。

actions.perform()で記録したキー操作が実行されます。

sample.py
#新しいタブが開ききるまで最大30秒待機
WebDriverWait(driver, 30).until(lambda a: len(driver.window_handles) > len(handles_befor))

新しいタブが開いた時に時間がかかることがあるので待機させます。
WebDriverWait(driver, 30)).untilではdriverを最大30秒待機するようにします。

lambda a: len(driver.window_handles) > len(handles_befor)ではラムダ式を使用して一行で記載しています。

len(handles_befor)新しいタブで開く前のハンドル数より
len(driver.window_handles)新しいタブが開いた瞬間のハンドル数が上回ったら待機が解除されます。

sample.py
#クリック後のハンドルリスト
handles_after = driver.window_handles

新しいタブが開いた後のハンドルをリスト形式で取得します。

sample.py
#ハンドルリストの差分
handle_new = list(handles_after - handles_befor)

リストを-で引き算のようにすると差分を取得することができます。
それを変数に代入しています。

sample.py
#新しいタブに移動
driver.switch_to.window(handle_new[0])

差分となったhandle_new[0]が新しいタブのハンドルになるのでswitch_to.windowで移動します。

おまけ

タブを開きすぎて訳がわからなくなってもいつでも戻れるように
(そんなことにはならないようにしましょうw)

事前にカレントハンドルを取得しておくといいかもしれません。

sample.py
#カレントウインドウ(タブ)のハンドルを代入
current_handle = driver.current_window_handle

#
#
#処理
#
#

#カレントウインドウ(タブ)に移動
driver.switch_to.window(current_handle)

ありがとうございました!

tbshiki
#情報収集 が好き 月曜夜のもくもく会 #西中島StudyGroup と IT入門勉強会 #ATTOsaka 主宰
https://tbshiki.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした