如何使用Selenium ChromeDriver执行右键点击?

22

我一直在搜索这个问题,但无法找到Python的答案。

是否可能通过selenium/chromedriver模拟右键单击或打开上下文菜单?

我已经看到了Java和其他一些语言的选项,但从未在Python中看到过。我需要做什么来模拟对链接或图片的右键单击?

4个回答

28
selenium.webdriver.common.action_chains中,它被称为context_click。请注意,Selenium无法处理浏览器级别的上下文菜单,因此我假设您的链接将弹出HTML上下文菜单。
from selenium import webdriver
from selenium.webdriver import ActionChains

driver = webdriver.Chrome()
actionChains = ActionChains(driver)

actionChains.context_click(your_link).perform()

谢谢回复。 你知道有什么可以让我打开浏览器上下文菜单(包括查看源代码、检查元素等)的东西吗?我有一个扩展程序,在其中我需要标记验证码和输入解决方案(插件名为SkipInput或Rumola)。你知道如何让这个工作起来吗? - CamIce
3
actionChains.context_click().perform() 这个操作应该可以。但是你无法对菜单进行任何操作,这已经超出了Selenium的范围。 - Yi Zeng
现在你可以使用 pynput 来按下 updownenter 键来选择菜单选项,即使它们超出了 Selenium 的范围。 - Vladimir Fokow
另外,您还可以使用 pyautogui 发送按键。 - Vladimir Fokow

5

要遍历右键菜单,我们需要使用selenium和pyautogui两者结合。使用pyautogui的原因是我们需要鼠标控制权以操作右键菜单中的选项。为了演示这一点,我将使用Python代码自动在新标签页中打开Avengers Endgame的谷歌图片。

import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ActionChains
import pyautogui

URL = 'https://www.google.com/'
PATH = r'C:\Program Files (x86)\chromedriver.exe'

driver = webdriver.Chrome(PATH)
action = ActionChains(driver)
driver.get(URL)

search = driver.find_element_by_name('q')
search.send_keys('Avengers Endgame')
search.send_keys(Keys.RETURN)

image_tab = driver.find_element_by_xpath('//a[text()="Images"]')
image_tab.click()

required_image = driver.find_element_by_xpath('//a[@class="wXeWr islib nfEiy mM5pbd"]')
action.context_click(required_image).perform()
pyautogui.moveTo(120, 130, duration=1)
pyautogui.leftClick()
time.sleep(1)
pyautogui.moveTo(300,40)
pyautogui.leftClick()

现在在以上代码中,从pyautogui.moveTo(120, 130, duration=1)部分开始是基于selenium的。你的答案从pyautogui.moveTo(120, 130, duration=1)开始,它的作用就是将鼠标移动到上下文菜单的在新标签页中打开图像选项上(请注意屏幕坐标可能会因屏幕大小而异)。下一行代码点击该选项(使用action.click().perform()不会按预期工作)。

接下来的两行用于在打开新标签页后进行导航。希望这段代码有所帮助!


1
我遇到了同样的问题,不得不右键点击并单击“在新标签页中打开链接”。
我在谷歌上搜索了很多答案,但没有找到Python的特定解决方案。
以前,我使用的是ActionChains,右键菜单显示出来,但是后来发现在selenium中无法访问该菜单列表,因为我发现一些线程说这需要操作系统级别的访问。
action = ActionChains(driver)
action.context_click(<obj_which_u_want_to_click>).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform() 

这里,Keys.ARROW_DOWN无法使用,同时希望在同一标签页中打开链接,理想情况下应该在新标签页中打开。

因此,我有两种方法实现这个需求:

第一种是通过send_keys

link = driver.find_elements_by_xpath("//a[contains(@href, 'https:...')]")
link.send_keys(Keys.CONTROL + Keys.ENTER)

其次,通过JavaScript实现:

driver.execute_script("window.open(arguments[0], '_blank');", link)

我认为你无法在Selenium中访问右键菜单项,因为它超出了其范围。

-3

您可以使用ActionChains执行上下文单击,并通过send_keys使用箭头从上下文菜单中选择元素。

ActionChains(context.browser).move_to_element(element).context_click(element).perform()
ActionChains(context.browser).send_keys(Keys.ARROW_UP).perform()
ActionChains(context.browser).send_keys(Keys.ENTER).perform()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接