Selenium:打开扩展的弹出窗口

问题描述 投票:0回答:2

我正在尝试使用 Selenium 为我的扩展编写 E2E 测试。对于我的测试,我需要打开扩展程序的弹出页面 - 就像用户单击扩展程序的徽标(位于浏览器的右下角)一样。

我已经成功使用扩展程序初始化 ChromeDriver,方法是:

ChromeOptions options = new ChromeOptions();
options.addExtensions(new File("...\\dist.crx"));

这样,浏览器(网络驱动程序)就会打开并根据需要安装。但问题是,我不知何故需要打开弹出页面。

所以我想到了一个很好的解决方案,不幸的是没有成功: 我设置了键盘快捷键来打开扩展程序(使用 Google 的Command API)。问题是 - 它只能手动工作。

手动选择我选择的快捷方式(Ctrl + Shift + Y)根据需要打开扩展程序。但是当使用 Selenium 将这些密钥发送到浏览器时,什么也没有发生*:

Actions actions = new Actions(webDriver);
actions.sendKeys(Keys.chord(Keys.CONTROL, Keys.SHIFT, "Y")).perform();

因此,如果这不起作用,我使用 Java 的机器人来单击扩展程序的图标,并为其提供 x,y 偏移坐标。这个解决方案是有效的,但它非常丑陋而且不好,因为它无法在不同的屏幕上正确点击。我正在尝试找到一个可以在所有屏幕尺寸上运行的全局解决方案。

提前致谢。

*当我以这种方式发送密钥时,其他操作对我来说效果很好(例如 Control + A 来标记所有) - 所以我猜测问题不在于我发送密钥的方式。

澄清:我想测试我的弹出页面(和后台脚本)与 DOM 本身(内容脚本)之间的交互。这意味着我需要打开弹出页面,对其执行一些操作,然后对网页的“真实”DOM 进行断言。因此,仅全屏打开弹出页面并不能让我编写所有我想要的 E2E 测试。

java selenium selenium-webdriver google-chrome-extension selenium-chromedriver
2个回答
3
投票

换句话说,Chrome 扩展程序中的所有页面都只是内置于包中的 HTML 页面。因此,您可以使用特制的 URL 直接打开它们。

第一步是找出您的包裹 ID。它是一个唯一的 32 个字符的字符串。该值源自用于对包进行签名的密钥,因此它应该相当一致。找到这个值的最快方法是:

打开安装了扩展程序的 Chrome
  1. 转到扩展列表(菜单 > 更多工具 > 扩展)
  2. 确保选中顶部的“开发者模式”复选框
  3. 在列表中找到您的分机,将会有一个名为“ID:”的条目
  4. 复制该值
  5. 例如,Drive 的应用程序启动器是“
ID:lmjegmlicamnimmfhcmpkclmigmmcbeh

了解此值意味着您现在可以访问包中的任何页面。

String EXTENSION_PROTOCOL = "chrome-extension"; String EXTENSION_ID = "lmjegmlicamnimmfhcmpkclmigmmcbeh"; indexPage = EXTENSION_PROTOCOL + "://" + EXTENSION_ID + "/index.html"; optionsPage = EXTENSION_PROTOCOL + "://" + EXTENSION_ID + "/options.html"; popupPage = EXTENSION_PROTOCOL + "://" + EXTENSION_ID + "/popup.html"; driver.get(indexPage);

这样做有一些缺点:

它不测试按钮本身
  • 页面始终全屏呈现,因此您可能会遇到一些布局问题
  • 如果您可以解决这些问题,您至少可以测试 Chrome 扩展程序的大部分功能。


1
投票

import java.awt.*; import java.awt.event.KeyEvent; private void openExtension() throws AWTException { Robot robot = new Robot(); robot.keyPress(KeyEvent.VK_CONTROL); robot.keyPress(KeyEvent.VK_SHIFT); robot.keyPress(KeyEvent.VK_Y); }

编辑:

当然,按下这些键后释放这些键是个好主意(否则它们将保持按下状态)。所以最终的解决方案看起来像这样: public void openExtension() { robotKeyPress(KeyEvent.VK_CONTROL, KeyEvent.VK_SHIFT, KeyEvent.VK_Y); robotKeyRelease(KeyEvent.VK_CONTROL, KeyEvent.VK_SHIFT, KeyEvent.VK_Y); } private void robotKeyPress(int... keys) { for (int k : keys) { robot.keyPress(k); } } private void robotKeyRelease(int... keys) { for (int k : keys) { robot.keyRelease(k); } }

© www.soinside.com 2019 - 2024. All rights reserved.