我正在尝试使用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个字符的字符串。此值是从用于对软件包进行签名的密钥派生的,因此它应该相当一致。找到此值的最快方法是:
例如,云端硬盘的应用启动器为“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扩展程序的大部分功能。