【问题标题】:Selenium: Opening an extension's popup windowSelenium:打开扩展的弹出窗口
【发布时间】:2018-10-01 06:31:53
【问题描述】:

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

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

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

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

所以我想到了一个不错的解决方案,但不幸的是没有奏效: 我设置了一个键盘快捷键来打开扩展程序(使用谷歌的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 本身(内容脚本)之间的交互。这意味着我需要打开 both 弹出页面,对其执行一些操作,然后对网页的“真实”DOM 进行断言。因此,仅全屏打开弹出页面并不能让我编写我想要的所有 E2E 测试。

【问题讨论】:

    标签: java selenium selenium-webdriver google-chrome-extension selenium-chromedriver


    【解决方案1】:

    我解决这个问题的方法是直接打开页面。

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

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

    1. 打开安装了扩展程序的 Chrome
    2. 转到扩展列表(菜单 > 更多工具 > 扩展)
    3. 确保在顶部选中“开发者模式”复选框
    4. 在列表中找到您的扩展程序,会出现一个名为“ID:”的条目
    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/options.html";
    
    driver.get(indexPage);
    

    这样做有一些缺点:

    • 它不测试按钮本身
    • 页面始终全屏呈现,因此您可能会遇到一些布局问题

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

    【讨论】:

    • 感谢您的回复。我实际上已经尝试过你的建议。但我忘了指出——我想测试我的弹出页面(和后台脚本)与 DOM 本身(内容脚本)之间的交互。这意味着我需要同时打开弹出页面,对其执行一些操作,然后对网页的“真实”DOM 进行断言。您提供的解决方案使我只能测试弹出页面,不幸的是,这对我来说还不够。
    • 如果您在后台打开弹出标签(即不活动),这种方法可能仍然有用。
    • 您的意思是在新选项卡中打开弹出窗口,然后在两者之间导航?在弹出选项卡上做某事,然后验证它是否发生在“主”选项卡中?可能吗?如,弹出选项卡中的后台脚本会与“主”选项卡中的内容脚本通信吗?如何在 Selenium 方面执行此操作? (使用扩展程序的弹出页面打开另一个选项卡)
    • 正如@wOxxOm 指出的那样,您应该在单独的选项卡中打开扩展程序并在两者之间切换。抱歉,这在我的原始答案中并不明显。至于如何打开新标签页,本站讨论了多种使用 Robot 或 JavaScript 的方法。
    【解决方案2】:

    好的,我设法让这个工作。 我使用 Java 的 Robot 发送设置为打开扩展程序所需的键(Control + Shift + Y),它可以工作,弹出窗口打开。 sendKeys 不起作用,因为 Selenium 禁用了发送触发浏览器功能的密钥的能力,所以我猜这是一个不错的 hack。

    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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 2017-12-29
      相关资源
      最近更新 更多