selenium with python 意図的にページを別タブで開く


seleium with pythonで、

web driverの getメソッドを実行すると、


webサービスの運営者側の実装によって、

同じタブで開いたり、別タブで開いたり

動作が異なることがあるのでしょうか?



そして、意図的に

web driverにたいして、

ページを別タブで開きたい場合のメソッド、


というのはあるのでしょうか?




### Selenium の `get` メソッドにおける挙動


Selenium の `get` メソッドは、

通常は **現在のタブを使って指定された URL を開く** ように

設計されています。


ただし、Webサービス側の実装によって次のような場合があります:



1. **同じタブで開く**: 


これは `get` のデフォルトの挙動であり、通常のリンク遷移と同じです。


2. **別タブで開く**: 

サイトが JavaScript や HTML 属性

(例: `<a target="_blank">`)を利用して、

リンクを別タブで開くように設計されている場合。


このような動作の違いは、主にWebサービスの設計に依存しており、

`get` メソッド自体の動作ではありません。


---


### Selenium で意図的に別タブでページを開く方法


Selenium を使ってページを別タブで開きたい場合、

以下の方法があります。


---


#### **方法 1: JavaScript を使用する**


JavaScript を使って新しいタブを開き、

そのタブで操作を行う方法です。


```python

from selenium import webdriver

from selenium.webdriver.common.by import By


# WebDriverのセットアップ

driver = webdriver.Chrome()


# 最初のページを開く

driver.get("https://example.com")


# JavaScriptを使用して新しいタブを開く

driver.execute_script(

"window.open(

'https://another-example.com', '_blank');")


# 新しいタブにフォーカスを移動

# 一番新しいタブに切り替え

driver.switch_to.window(

driver.window_handles[-1])  


# 新しいタブで操作を続ける

print(driver.current_url)  # 現在のURLを確認

```


---


#### **方法 2: キーボードのショートカットをシミュレーション**


キーボードのショートカット

(例: `Ctrl + T` や `Command + T`)


をシミュレートして新しいタブを開く方法です。


```python

from selenium import webdriver

from selenium.webdriver.common.action_chains

import ActionChains

from selenium.webdriver.common.keys import Keys


# WebDriverのセットアップ

driver = webdriver.Chrome()


# 最初のページを開く

driver.get("https://example.com")


# アクションチェーンで新しいタブを開く

# Macの場合はKeys.COMMAND

ActionChains(driver).key_down(Keys.CONTROL)

.send_keys('t').key_up(Keys.CONTROL).perform()  


# 新しいタブにフォーカスを移動

driver.switch_to.window(driver.window_handles[-1])


# 新しいタブで特定のURLを開く

driver.get("https://another-example.com")


# 操作を続ける

# 現在のURLを確認

print(driver.current_url)  

```


---


#### **方法 3: `target="_blank"` リンクをクリック**


リンクが

 `<a href="..." target="_blank">` のように

 設定されている場合、

 リンクをクリックして別タブを開き、そのタブに切り替える方法です。


```python


from selenium import webdriver

from selenium.webdriver.common.by import By


# WebDriverのセットアップ

driver = webdriver.Chrome()


# 最初のページを開く


driver.get("https://example.com")


# target="_blank" 属性のリンクをクリック

link = driver.find_element(

By.LINK_TEXT, "リンクテキスト")

link.click()


# 新しいタブに切り替え


driver.switch_to.window(

driver.window_handles[-1])


# 新しいタブで操作を続ける


print(driver.current_url)  # 現在のURLを確認

```


---


### **ポイント**


1. **タブの切り替え**


   新しいタブが開いた後は、

   `driver.switch_to.window()` を使用して

   タブを切り替える必要があります。



2. **タブのリスト**


   Selenium では

   現在のウィンドウ(タブ)をリストとして保持しており、

   `driver.window_handles` で取得できます。


   - `driver.window_handles[0]`: 最初のタブ


   - `driver.window_handles[-1]`: 最新のタブ



3. **安全な操作**


   タブを切り替えた後に操作を行うときは、

   `switch_to.window()` を忘れないようにしましょう。



---



以上の方法で、

`get` メソッドとは異なるタブ制御を行うことが可能です!



コメント