获取JSObject或JSContext来运行applet

如何让JSObject或JSContext从Java运行applet?

我正在尝试自动化一些程序,包括在网页中点击一些链接,然后通过一个applet,所以我做的是通过Java发送一些HTTPRequest,直到我得到带有标签的HTML,通过JSoup,我提取所有参数和代码库等。因为我也想运行applet,我使用ClassLoader加载applet类,我设置了一个自定义存根,可以提供我之前提取的参数。

问题是这个applet与浏览器有一些javascript交互,所以在某些时候它会做一个JSObject.getWindow(applet)来获取文件并进行js调用,这里就是我被困住的地方。 我知道我必须能够提供一个应该实现JSContext的AppletContext,并且能够为这个JSObject提供它是浏览器提供它的窗口。 但有可能嘲笑这样的事情吗?

有一个偷偷摸摸的技巧,首先创建一个扩展AppletContextJSContextinterface

 private interface JSAwareAppletContext extends AppletContext, JSContext { } 

然后以某种方式模拟,以便你有一个实例

 final JSAwareAppletContext myAppletContext = //mock 

现在,您可以在JSAwareAppletContext上模拟实时连接,并从AppletStub返回if。

例如与Mockito:

 final JSAwareAppletContext appletContext = mock(JSAwareAppletContext.class); final JSObject jsObject = mock(JSObject.class); when(appletContext.getJSObject()).thenReturn(jsObject); final AppletStub appletStub = mock(AppletStub.class); when(appletStub.getAppletContext()).thenReturn(appletContext);