Selenium:打开扩展的弹出窗口

Ami*_*'er 6 java selenium google-chrome-extension selenium-chromedriver selenium-webdriver

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

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

ChromeOptions options = new ChromeOptions();
options.addExtensions(new File("...\\dist.crx"));
Run Code Online (Sandbox Code Playgroud)

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

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

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

Actions actions = new Actions(webDriver);
actions.sendKeys(Keys.chord(Keys.CONTROL, Keys.SHIFT, "Y")).perform();
Run Code Online (Sandbox Code Playgroud)

因此,如果这不起作用,我使用 Java 的 Robot 点击扩展的图标,通过给它 x,y 偏移坐标。此解决方案有效,但它非常丑陋且不好,因为它无法在不同的屏幕上正确单击。我试图找到一个可以在所有屏幕尺寸上运行的全局解决方案。

提前致谢。

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

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

Ami*_*'er 2

好的,我设法让它工作。我使用 Java 的机器人发送了我设置的打开扩展程序所需的键 (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);
}
Run Code Online (Sandbox Code Playgroud)

编辑:当然,按下这些键后释放这些键是一个好主意(否则它们将保持按下状态)。所以最终的解决方案看起来像这样:

    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);
    }
}
Run Code Online (Sandbox Code Playgroud)