package com.example.jxbrowser; import com.teamdev.jxbrowser.chromium.Browser; import com.teamdev.jxbrowser.chromium.DataReceivedParams; import com.teamdev.jxbrowser.chromium.RequestCompletedParams; import com.teamdev.jxbrowser.chromium.ResponseStartedParams; import com.teamdev.jxbrowser.chromium.ba; import com.teamdev.jxbrowser.chromium.dom.By; import com.teamdev.jxbrowser.chromium.dom.DOMDocument; import com.teamdev.jxbrowser.chromium.dom.events.DOMEvent; import com.teamdev.jxbrowser.chromium.dom.events.DOMEventListener; import com.teamdev.jxbrowser.chromium.dom.events.DOMEventType; import com.teamdev.jxbrowser.chromium.dom.internal.Element; import com.teamdev.jxbrowser.chromium.dom.internal.MouseEvent; import com.teamdev.jxbrowser.chromium.events.ConsoleEvent; import com.teamdev.jxbrowser.chromium.events.ConsoleListener; import com.teamdev.jxbrowser.chromium.events.FinishLoadingEvent; import com.teamdev.jxbrowser.chromium.events.LoadAdapter; import com.teamdev.jxbrowser.chromium.swing.BrowserView; import com.teamdev.jxbrowser.chromium.swing.DefaultDialogHandler; import com.teamdev.jxbrowser.chromium.swing.DefaultDownloadHandler; import com.teamdev.jxbrowser.chromium.swing.DefaultNetworkDelegate; import com.teamdev.jxbrowser.chromium.swing.DefaultPopupHandler; import javax.swing.*; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.math.BigInteger; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; public class Demo { static { // 破解jxbrowser的代码块 导入下面的包是关键 // import com.teamdev.jxbrowser.chromium.ba; try { Field e = ba.class.getDeclaredField("e"); e.setAccessible(true); Field f = ba.class.getDeclaredField("f"); f.setAccessible(true); Field modifersField = Field.class.getDeclaredField("modifiers"); modifersField.setAccessible(true); modifersField.setInt(e, e.getModifiers() & ~Modifier.FINAL); modifersField.setInt(f, f.getModifiers() & ~Modifier.FINAL); e.set(null, new BigInteger("1")); f.set(null, new BigInteger("1")); modifersField.setAccessible(false); } catch (Exception e1) { e1.printStackTrace(); } } public static void main(String[] args) { JFrame jFrame = new JFrame(); jFrame.setTitle("WebClient"); Browser browser = new Browser(); BrowserView browserView = new BrowserView(browser); browser.setDownloadHandler(new DefaultDownloadHandler(browserView)); browser.setDialogHandler(new DefaultDialogHandler(browserView)); browser.setPopupHandler(new DefaultPopupHandler()); jFrame.getContentPane().add(browserView, BorderLayout.CENTER); jFrame.setSize(800, 600);//初始大小 jFrame.setLocation(0, 0);//位置 // 设置为全屏模式 // jFrame.setExtendedState(JFrame.MAXIMIZED_BOTH); // 去掉边框 // setUndecorated(true); // 置顶 // setAlwaysOnTop(true); jFrame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { // 关闭应用时要释放资源 jFrame.dispose(); System.exit(0);//0正常退出,1非正常退出 } }); // 显示 jFrame.setVisible(true); // 先加载空白页 browser.loadURL("about:blank"); // 控制台日志 browser.addConsoleListener(new ConsoleListener() { @Override public void onMessage(ConsoleEvent consoleEvent) { System.out.println(consoleEvent.getMessage()); } }); // 监听加载完成 browser.addLoadListener(new LoadAdapter() { @Override public void onFinishLoadingFrame(FinishLoadingEvent event) { if (event.isMainFrame()) { DOMDocument document = browser.getDocument(); document.getDocumentElement().addEventListener(DOMEventType.OnClick, new DOMEventListener() { @Override public void handleEvent(DOMEvent domEvent) { Element target = (Element) domEvent.getTarget(); String xPath = target.getXPath(); System.out.println(xPath + "==>OnClick"); } }, true); // 通过右击采集Element xpath document.getDocumentElement().addEventListener(DOMEventType.OnMouseUp, new DOMEventListener() { @Override public void handleEvent(DOMEvent domEvent) { MouseEvent mouseEvent = (MouseEvent) domEvent; //0左键,1中键,2右键 int button = mouseEvent.getButton(); if (button == 2) { Element target = (Element) domEvent.getTarget(); String xPath = target.getXPath(); System.out.println(xPath + "==>OnKeyPress"); } } }, true); System.out.println("加载完成..."); } } }); // 休眠3秒 sleep(1); browser.getContext().getNetworkService().setNetworkDelegate(new DefaultNetworkDelegate() { private Map responseMap = new HashMap<>(); private boolean isFollow(String url) { if (url.equals("/auth/login")) { return true; } return false; } @Override public void onResponseStarted(ResponseStartedParams params) { if (!isFollow(params.getURL())) { return; } responseMap.put(params.getURL(), new ByteArrayOutputStream(2 << 10)); } @Override public void onDataReceived(DataReceivedParams params) { if (!isFollow(params.getURL())) { return; } // 接口返回数据较多时,会进行分段接受,需要进行拼接 ByteArrayOutputStream stream = responseMap.get(params.getURL()); if (stream != null) { try { stream.write(params.getData()); } catch (IOException e) { throw new RuntimeException(e); } } } @Override public void onCompleted(RequestCompletedParams params) { if (!isFollow(params.getURL())) { return; } System.out.println(params.getURL()); System.out.println(new String(responseMap.get(params.getURL()).toByteArray())); } }); browser.loadURL("http://test.wbsite.xyz:8027/login.htm"); sleep(1); // 设置input DOMDocument document = browser.getDocument(); document.findElement(By.className("el-input__inner")).setAttribute("value", "1"); } private static void sleep(int seconds) { try { TimeUnit.SECONDS.sleep(seconds); } catch (InterruptedException e) { throw new RuntimeException(e); } } }