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

我已经设法通过使用以下命令来初始化带有扩展名的ChromeDriver:

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

这样,浏览器(Web驱动程序)将根据需要打开并安装。但问题是,我需要以某种方式打开弹出页面。

因此,我想到了一个不错的解决方案,但不幸的是它没有用:
我设置了一个键盘快捷方式来打开扩展名(使用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测试。

最佳答案

我解决这个问题的方法是直接打开页面。
换句话说,Chrome扩展程序中的所有页面都是内置于软件包中的HTML页面。这样,您可以直接使用特制URL打开它们。
第一步是找出您的包裹ID。它是一个唯一的32个字符的字符串。此值是从用于对软件包进行签名的密钥派生的,因此它应该相当一致。找到此值的最快方法是:

  • 在安装了扩展程序的情况下打开Chrome
  • 进入扩展列表(菜单>更多工具>扩展)
  • 在顶部,确保已选中“开发人员模式”复选框
  • 在列表中找到您的扩展名,然后会有一个条目“ID:”
  • 复制该值

  • 例如,云端硬盘的应用启动器为“ID:lmjegmlicamnimmfhcmpkclmigmmcbeh”
    知道此值意味着您现在可以访问包中的任何页面。
    String EXTENSION_PROTOCOL = "chrome-extension";
    String EXTENSION_ID = "lmjegmlicamnimmfhcmpkclmigmmcbeh";
    indexPage = EXTENSION_PROTOCOL + "://" + EXTENSION_ID + "/index.html";
    optionsPage = EXTENSION_PROTOCOL + "://" + EXTENSION_ID + "/options/options.html";
    
    driver.get(indexPage);
    
    这有一些缺点:
  • 它不测试按钮本身
  • 页面始终以全屏呈现,因此您可能会遇到布局问题

  • 如果可以解决这些问题,则至少可以测试Chrome扩展程序的大部分功能。

    08-18 10:32
    查看更多