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` を取得する方法が扱いやすいです。
コメント
コメントを投稿