selenium_with_python_headless_mode_aタグのクリックによる_ページ移動について

selenium with pythonで 

headless modeでwebページにアクセスしていて、

aタグを操作するときに、


そのaタグのhref属性の値である

他のウェブページへ移動して、


そのページに記述されているデータなどを取得したいとき、


headless modeだと UIを視覚的に操作するわけではないですから、


単に はじめのページの操作のコードで


aタグに対して click()のメソッドを適用すれば、


別のページでの操作に移れるのでしょうか?


ようするに 


driver.window_handlesにアクセスして、

handleを切り替えたりせずに、

あるいは別のコード上での操作をせずに、


別のページに移動できるのでしょうか?



はい、Seleniumのheadless modeでも、

`click()` メソッドを使って `<a>` タグをクリックすれば、

通常のブラウザと同じようにページ遷移が発生します。


ただし、いくつか注意点があります。



### **1. `click()` でページ遷移する場合**


- `<a>` タグに `target="_blank"` が **設定されていない場合**、

`click()` を適用すると

**現在のページが新しいページに置き換わる** ため、 

`driver.getCurrentUrl()` で確認すると、

新しいページのURLになっているはずです。



- そのまま `driver.page_source` などを使って、

新しいページの情報を取得できます。



- **`window_handles` の切り替えは不要** です。


### **2. `target="_blank"` で新規タブが開く場合**


- `click()` を適用すると、新しいタブで開かれるため、 

`driver` は元のタブに留まります。


- この場合は、`driver.switch_to.window(

driver.window_handles[-1])` 


を使って新しいタブに移動する必要があります。



### **3. `click()` せずに `href` で直接移動する方法**


もし `click()` を使わずにシンプルにページ移動したい場合、 

`a` タグの `href` 属性を取得し、

それを `driver.get()` で開くのがより確実です。



```python


from selenium import webdriver

from selenium.webdriver.chrome.service import Service

from selenium.webdriver.common.by import By

from selenium.webdriver.chrome.options import Options


options = Options()


# ヘッドレスモードを有効化

options.headless = True 

 

# 適宜パスを変更

service = Service("/path/to/chromedriver")  

driver

 = webdriver.Chrome(service=service, options=options)



# 1. 最初のページにアクセス

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



# 2. aタグのhref属性を取得


link_element

 = driver.find_element(

By.XPATH, "//a[contains(text(), '次のページ')]")

next_page_url

 = link_element.get_attribute("href")



# 3. 取得したURLに直接移動

driver.get(next_page_url)




# 4. 新しいページのデータを取得


page_content = driver.page_source

print(page_content)


driver.quit()


```


この方法なら、 

`window_handles` の切り替えを気にせず、

スムーズにページ遷移できます。



### **結論**


- **`click()` で遷移可能か? → 

はい、可能。

ただし `target="_blank"` の場合は 

`switch_to.window()` が必要。**



- **`click()` せずに遷移できるか? → 

`href` を取得し、 

`driver.get()` で直接移動する方がシンプルで確実。**



どちらの方法を使うかはケースバイケースですが、 

`href` を取得する方法が扱いやすいです。


コメント