我正在尝试以编程方式单击网页上的按钮。出于某些奇怪的原因,我无法通过在加载页面时在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事件。当我手动单击文档中的任何位置时,都会看到消息“已单击”。我在做什么错了?