如何在Java-CEF浏览器组件中发送鼠标事件?

时间:2018-12-08 08:11:26

标签: java swing chromium-embedded

我正在尝试以编程方式单击网页上的按钮。出于某些奇怪的原因,我无法通过在加载页面时在CefBrowser实例上执行JavaScript来直接执行此操作。我在Chrome开发者控制台中尝试了相同的JS代码,并且单击时没有任何麻烦。由于这一限制,我计划以一种“本机”方式模拟Java代码中的click事件,这样我就可以绕过任何浏览器安全性限制,如果那是防止JS中单击的原因。

我的问题是,如何在Window / non-osr模式下执行此操作?

我可以看到CefBrowser_N定义了sendMouseEvent之类的方法,但是我无法有效地使用它们。这是我正在尝试的。

因为sendMouseEvent之类的方法是protected,而我需要调用的代码位于org.cef.browser之外,所以我将说明符更改为public。再一次,因为文档说我们不应该直接创建CefBrowser_N的实例,而是选择使用CefBrowserFactory.create,所以我在定义方法CefBrowserFactory.createWrBrowser,它返回CefBrowserWr的实例,因为CefBrowser界面不会公开sendMouseEvent。新方法的实现方式如下:

public static CefBrowserWr createWrBrowser (
        CefClient client, String url, CefRequestContext context) {
    return new CefBrowserWr(client, url, context);
}

在一个单独的类MyBrowserHandler中,我正在创建CefBrowserWr的实例,如下所示:

CefClient client = MainFrame.getCefInstance().createClient();
CefBrowserWr browser = CefBrowserFactory.createWrBrowser(client, Properties.URL, null);
Component uiComponent = browser.getUIComponent();

我为null传递了context可能很有趣。不知道这样做是什么,但是我是按照CefClient类中的方式完成的。检查CefClient.createBrowser的来源,并通知我是否应该以其他方式进行。既然我已经可以使用sendMouseEvent,那么在加载页面(和要单击的元素)时,我就可以这样做:

 MouseEvent mouseEvent = new MouseEvent(
      browser.getUIComponent(),
      MouseEvent.MOUSE_CLICKED,
      System.currentTimeMillis() + 1000, // wait 1 second
      0,
      300, 60, // x, y co-ordinates
      1, false
);

browser.sendMouseEvent(mouseEvent);

我不确定坐标的准确性,但是无论如何,当doument.onclick发生click时,我正在听JavaScript中的document并记录“ Clicked”。当我运行程序时,不会触发click事件。当我手动单击文档中的任何位置时,都会看到消息“已单击”。我在做什么错了?

0 个答案:

没有答案
相关问题