selenium_with_python_pyautogui_右クリック_コンテキストメニュー

 

selenium with pythonで


あるwebページを開いて


あるui要素にマウスをホバーさせたあと、そのwebサービス側が用意している

ポップアップを表示する、


そのようなポップアップの内部に様々な要素が配置されていて、


そのポップアップの内部のaタグをxpathで指定して

参照を保持した後、


その a tagに対して


context clickを実行しようとしていますが、


そのcontext click で表示されるのは

webブラウザ側の機能の画面であって、

内部には リンク先を保存、リンクを保存, 

開発者ツールで検証、などが表示されています。



で、ブラウザがedgeの場合、

そのコンテキストメニューは webページの要素ではないので


開発者ツールからの xpathなどでは指定できないことが

動作確認でわかりました。


seleniumでブラウザ側のコンテキストメニューを操作するには

どのようにすればいいのでしょうか?


今回はブラウザ側のコンテキストメニュー内のリンクを保存して、


そのリンク文字列を print文で出力したいのですが・・・

 

        ↓


Seleniumはブラウザのコンテキストメニュー(右クリックメニュー)を

直接操作することはできません。


理由は、ブラウザ側のコンテキストメニューが

オペレーティングシステムによって制御されるためであり、


SeleniumはそのようなネイティブUIを操作するための機能を提供していないためです。


ただし、以下のような方法を使って目標を達成することが可能です。



---



### 方法1: JavaScriptを使用してリンク先を取得する


ブラウザ側のコンテキストメニューを使わず、

SeleniumでJavaScriptを実行してリンク先を取得する方法です。



#### サンプルコード


```python


from selenium import webdriver

from selenium.webdriver.common.action_chains import ActionChains

from selenium.webdriver.common.by import By


# WebDriverのセットアップ

# Microsoft Edge用のWebDriver


driver = webdriver.Edge()  

driver.get("対象のURL")


# マウスをホバーさせる要素を特定


hover_element

 = driver.find_element(By.XPATH, "ホバー対象のXPath")



# マウスホバー操作

actions = ActionChains(driver)

actions.move_to_element(hover_element).perform()



# ポップアップ内のリンクを取得

popup_link

 = driver.find_element(By.XPATH, "ポップアップ内のリンクXPath")


# JavaScriptでリンクのhref属性を取得

link_href

 = driver.execute_script("return arguments[0].href;", popup_link)


print("リンク先:", link_href)



# 必要に応じてリンク先をファイルに保存

with open("link.txt", "w", encoding="utf-8") as file:

    file.write(link_href)



# 終了


driver.quit()



```


この方法では、コンテキストメニューを操作する必要がなく、

リンク先のURLを直接取得できます。



---



### 方法2: PyAutoGUIを使用してネイティブUIを操作する


どうしてもブラウザのコンテキストメニューを操作したい場合は、

[PyAutoGUI]

(https://pyautogui.readthedocs.io/en/latest/)


などを使用してマウスやキーボードのネイティブ操作を行う方法があります。



#### サンプルコード


```python


import pyautogui


from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.common.action_chains import ActionChains


import time



# WebDriverのセットアップ

# Microsoft Edge用のWebDriver

driver = webdriver.Edge()  

driver.get("対象のURL")



# マウスをホバーさせる要素を特定

hover_element

 = driver.find_element(By.XPATH, "ホバー対象のXPath")



# マウスホバー操作

actions = ActionChains(driver)

actions.move_to_element(hover_element).perform()



# ポップアップ内のリンクを取得

popup_link

 = driver.find_element(By.XPATH, "ポップアップ内のリンクXPath")



# リンクの位置を取得して右クリック

location = popup_link.location

size = popup_link.size

x = location['x'] + size['width'] // 2

y = location['y'] + size['height'] // 2



# PyAutoGUIで右クリックして操作

time.sleep(2)  # 操作を視覚的に確認しやすくするための待機

pyautogui.moveTo(x, y)

pyautogui.rightClick()



# 右クリックメニューの「リンクを保存」の位置を確認し、Enterキーを押すなどの操作を追加

time.sleep(1)

pyautogui.press('down')  # メニューの「リンクを保存」を選択

pyautogui.press('enter')  # 実行

time.sleep(1)



# 必要に応じて保存先からリンク文字列を読み取るコードを記述



# 終了


driver.quit()


```



この方法では画面座標を計算してPyAutoGUIを使用しますが、

座標の計算やメニューの内容はブラウザや画面サイズによって異なるため、

調整が必要です。



---


### 方法3: 

Seleniumに加えてブラウザのDevTools Protocolを使用する


Microsoft Edgeでは、[DevTools Protocol]

(https://learn.microsoft.com/en-us/microsoft-edge/devtools-protocol/)


を使用して高度な操作を行うことができます。


これを活用してリンクを直接取得したり、

右クリックメニューに相当する操作を模倣することができる場合があります。


---


### 推奨する方法


- **リンク先を取得するだけなら方法1が最も簡単かつ信頼性が高い**です。


- **ブラウザのコンテキストメニュー操作にこだわる場合は

    方法2を試してください**。


- **高度な操作や拡張性が必要なら

DevTools Protocolを使用する方法を検討してください**。


何か他にご不明な点があればお知らせください!





pyautogui.press('down')というのは

ui要素内のメニューの選択する際のメニュー間の上下移動でしょうか?

目的の要素までこの場合だと'down'を複数回記述するのでしょうか?




その通りです!

`pyautogui.press('down')` は、

キーボードの「下矢印キー」を1回押す操作を模倣します。

これにより、コンテキストメニューや他のメニュー内で

フォーカスを次の項目に移動できます。


---


### 選択対象まで`down`を複数回記述する方法

もし目的のメニュー項目が、最初に表示されるメニューの一番下にある場合、`pyautogui.press('down')` を複数回記述する必要があります。例えば:


#### サンプルコード

```python

pyautogui.rightClick()  # 右クリックしてメニューを開く

pyautogui.press('down')  # 1回目の「下矢印」

pyautogui.press('down')  # 2回目の「下矢印」

pyautogui.press('down')  # 必要なだけ繰り返す



コメント