使用 python 在 Selenium 中使用“浏览器操作”激活 Chrome 扩展程序

Activate a Chrome Extension with a "Browser Action" in Selenium with python

提问人:madx 提问时间:10/30/2023 最后编辑:madx 更新时间:10/30/2023 访问量:44

问:

出于测试目的,我需要在 Selenium 测试中使用 Chrome 扩展程序。 在图片中,您只看到扩展按钮(拼图),在该按钮(单击)下是我要激活的扩展。

ChromeBar

由于扩展的代码可用,因此我添加了一个以使用 selenium ActionChains 快捷方式轻松激活扩展。 这是我编辑的文件:_execute_browser_actionmanifest.jsonmanifest.json

{
  "manifest_version": 2,
  "name": "The Extension Name",
  "...", "...",
  "...", "...",
  "...", "...",
  "commands": {
      "_execute_browser_action": {
          "suggested_key": {
            "default": "Ctrl+I",
            "mac": "MacCtrl+I"
          }
      }
  }
}

问题是我尝试运行此代码,但扩展未触发(即使我手动检查了快捷方式并且它运行良好):

from selenium import webdriver
from selenium.webdriver import ActionChains, Keys

options = webdriver.ChromeOptions()
# options.add_extension('./my-extension.crx')
options.add_argument("--load-extension=./my-extension-chromium")
options.add_argument("--start-maximized")
driver = webdriver.Chrome(options=options)

url = "http://localhost:9000/"

driver.get(url)

ActionChains(driver)\
        .key_down(Keys.CONTROL)\
        .send_keys("i")\
        .key_up(Keys.CONTROL)\
        .perform()

我测试的另一个解决方案,总是没有成功:pyautogui

import pyscreeze
import PIL
from selenium import webdriver
import pyautogui

__PIL_TUPLE_VERSION = tuple(int(x) for x in PIL.__version__.split("."))
pyscreeze.PIL__version__ = __PIL_TUPLE_VERSION

options = webdriver.ChromeOptions()
# options.add_extension('./my-extension.crx')
options.add_argument("--load-extension=./my-extension-chromium")
options.add_argument("--start-maximized")
driver = webdriver.Chrome(options=options)

url = "http://localhost:9000/"

driver.get(url)

# Click on extension icon
v = pyautogui.locateOnScreen("./puzzle_piece_icon.png")
print(v)
pyautogui.click(x=v.left, y=v.top, clicks=1, interval=0.0, button="left")
# that click is not working. after that i should click on the extension icon
# ext_icon = pyautogui.locateOnScreen("./extension_icon.png")
# pyautogui.click(x=ext_icon.left, y=ext_icon.top, clicks=1, interval=0.0, button="left")


driver.quit()

如果可能的话,我宁愿让第一个解决方案工作(使用 ActionChains 触发器)......因为我不必集成库。 但欢迎任何其他可行的解决方案。pyautogui

python selenium-webdriver 自动测试 键盘快捷键

评论

0赞 pcalkins 10/31/2023
您可以尝试使用 element.send_keys(Keys.CONTROL+ “i”);使用 <body> 元素。或者 ActionChains(driver)\ .send_keys(Keys.CONTROL + “i”)...但要确保活动元素是 DOM 中的内容。
0赞 madx 10/31/2023
这是浏览器激活扩展的操作,而不是页面上的元素(因此,不是在 DOM 上)。无论如何,我只是尝试了一下,但没有成功。
0赞 pcalkins 10/31/2023
Selenium 只能与 DOM 交互。我希望扩展正在那里监听ctrl-i。
0赞 madx 10/31/2023
是的,但我认为快捷方式是在浏览器级别(应用程序)而不是 DOM 级别捕获的。无论如何,即使找到坐标,即使 pyautogui 也无法正常工作(参见变量 v)。
0赞 pcalkins 11/1/2023
并非所有扩展都与 Selenium 兼容。当您启动 Selenium 会话并暂停它时,您可以手动单击该按钮吗?

答: 暂无答案