You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

200 lines
7.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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<String, ByteArrayOutputStream> 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);
}
}
}

Powered by TurnKey Linux.