我正在尝试使用Selenium为我的扩展编写E2E测试。对于我的测试,我需要打开扩展的弹出页面,就像用户单击了扩展的徽标一样(在浏览器的右下角)。
通过使用以下命令,我已经成功地插入了带有扩展的ChromeDriver:
ChromeOptions options = new ChromeOptions();
options.addExtensions(new File("...\\dist.crx"));通过这种方式打开浏览器(web驱动程序),并根据需要安装它。但问题是我需要打开弹出式页面。
因此,我想到了一个很好的解决方案,但不幸的是没有奏效:我设置了一个键盘快捷方式来打开扩展(使用谷歌的命令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标记所有的键)--所以我猜问题不在于我发送密钥的方式。
Clarification:,我想测试弹出页面(和后台脚本)与DOM本身(内容脚本)之间的交互。这意味着我需要让和都打开弹出页面,对其执行一些操作,然后在网页的“真实”DOM上进行断言。因此,只在全屏上打开弹出页面并不能让我编写我想要的所有E2E测试。
发布于 2018-04-21 13:59:22
好吧,我成功地完成了这个任务。我使用Java的机器人发送我设置的打开扩展所需的键(Control + Shift + Y),它工作正常,弹出窗口就会打开。sendKeys没有工作,因为Selenium禁用了发送触发浏览器功能的键的能力,所以我认为这是一个不错的攻击。
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);
}
}发布于 2018-04-20 15:44:49
我的方法是直接打开页面。
换句话说,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扩展的大部分功能。
https://stackoverflow.com/questions/49943354
复制相似问题