无需Selenium的Java浏览器交互机器人:实现谷歌搜索操作
解决方案:无需Selenium的Java浏览器交互实现
1. 使用JavaFX WebView组件
JavaFX自带的WebView是基于WebKit的嵌入式浏览器组件,支持完整的DOM操作、JavaScript执行和交互模拟,完全满足打开浏览器、输入搜索、跳转结果的需求。
示例代码:
import javafx.application.Application; import javafx.concurrent.Worker; import javafx.scene.Scene; import javafx.scene.web.WebEngine; import javafx.scene.web.WebView; import javafx.stage.Stage; import org.w3c.dom.Document; import org.w3c.dom.Element; public class BrowserAuto extends Application { @Override public void start(Stage stage) { WebView webView = new WebView(); WebEngine webEngine = webView.getEngine(); // 加载谷歌搜索页 webEngine.load("https://www.google.com"); // 监听页面加载完成事件 webEngine.getLoadWorker().stateProperty().addListener((obs, oldState, newState) -> { if (newState == Worker.State.SUCCEEDED) { Document doc = webEngine.getDocument(); if (doc != null) { // 定位搜索输入框 Element searchBox = doc.getElementById("APjFqb"); if (searchBox != null) { // 输入搜索内容 searchBox.setAttribute("value", "Java无Selenium自动化"); // 执行JS模拟提交表单 webEngine.executeScript("document.querySelector('form').submit();"); } } } }); Scene scene = new Scene(webView, 800, 600); stage.setScene(scene); stage.show(); } public static void main(String[] args) { launch(args); } }
注意:JDK 11及以上版本需单独配置JavaFX SDK依赖。
2. 直接构造HTTP请求(无浏览器界面)
如果不需要可视化浏览器,仅需模拟搜索并获取结果,可以跳过渲染环节,直接用HTTP请求模拟搜索行为:
示例代码:
import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; import java.io.IOException; import java.net.URLEncoder; public class HttpSearchAuto { public static void main(String[] args) throws IOException { String query = "Java无Selenium自动化"; String encodedQuery = URLEncoder.encode(query, "UTF-8"); String searchUrl = "https://www.google.com/search?q=" + encodedQuery; try (CloseableHttpClient client = HttpClients.createDefault()) { HttpGet request = new HttpGet(searchUrl); // 模拟浏览器UA,避免被拦截 request.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"); String response = EntityUtils.toString(client.execute(request).getEntity()); // 用Jsoup解析搜索结果 Document doc = Jsoup.parse(response); Elements results = doc.select("div.g"); for (var result : results) { String title = result.select("h3").text(); String link = result.select("a").attr("href"); System.out.println("标题: " + title); System.out.println("链接: " + link + "\n"); } } } }
注意:该方法无法处理需要JavaScript渲染的动态页面,部分网站会检测请求头,需按需调整UA等参数。
3. 调用浏览器DevTools协议
Chrome、Edge等现代浏览器支持DevTools协议,可通过HTTP/WebSocket与浏览器通信,实现真实浏览器的自动化控制,无需依赖Selenium。
示例步骤:
- 启动Chrome并开启远程调试:
chrome.exe --remote-debugging-port=9222 - 引入Maven依赖:
<dependency> <groupId>com.github.kklisura.cdt</groupId> <artifactId>cdt-java-client</artifactId> <version>1.3.0</version> </dependency>
- 示例代码:
import com.github.kklisura.cdt.services.ChromeDevToolsService; import com.github.kklisura.cdt.services.ChromeService; import com.github.kklisura.cdt.services.types.ChromeTab; import com.github.kklisura.cdt.protocol.commands.Page; import com.github.kklisura.cdt.protocol.commands.Runtime; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; public class DevToolsAuto { public static void main(String[] args) { ChromeService chromeService = new ChromeService("localhost", 9222); ChromeTab tab = chromeService.getTabs().get(0); try (ChromeDevToolsService devTools = chromeService.createDevToolsService(tab)) { Page page = devTools.getPage(); Runtime runtime = devTools.getRuntime(); // 加载搜索页 page.navigate("https://www.google.com"); page.waitForLoadEventFired(); // 执行JS输入搜索内容并提交 runtime.evaluate("document.getElementById('APjFqb').value = 'Java DevTools自动化';"); runtime.evaluate("document.querySelector('form').submit();"); // 等待结果页加载 page.waitForLoadEventFired(); // 获取页面内容并解析 String pageHtml = runtime.evaluate("document.documentElement.outerHTML").getResult().getValue().toString(); Document doc = Jsoup.parse(pageHtml); // 后续解析逻辑同Jsoup示例 } finally { chromeService.close(); } } }
该方法可控制真实浏览器实例,支持所有交互场景,功能接近Selenium但无额外依赖。
内容的提问来源于stack exchange,提问作者Jyoti kintali
相关产品推荐
相关产品推荐

