当您需要在 SWT 应用程序中显示网页内容时,通常有两种选择:内置的 Browser 小部件或像 JxBrowser 这样的商业选项。
本文将详细剖析两者之间的差异,帮助您根据自身需求做出正确选择。
简而言之
内置的 Browser
是一个简单但功能可靠的小部件,它使用操作系统提供的浏览器引擎。当以下情况时选择 Browser
:
-
您需要使用免费软件。
-
使用场景简单且非关键。
JxBrowser 是一款基于 Chromium 的高级商业网页视图控件。在以下情况下可选择 JxBrowser:
-
使用场景复杂或关键。
-
需要控制浏览器引擎的版本。
-
需要在不同平台上使用一致的浏览器引擎。
-
需要自动测试 SWT 中的网页内容。
-
需要使用某些高级功能。
-
需要技术支持、错误修复或定制功能。
嵌入
由于 Browser
小部件是 SWT 的一部分,因此将其嵌入到应用程序中非常容易:
var browser = new Browser(shell, SWT.NONE);
browser.setUrl("https://example.com");
使用 JxBrowser 时,您需要先将依赖项添加到项目中。根据您的构建系统,您可以使用 Maven 构件,将 JAR 文件添加到类路径,或者创建一个独立的 Eclipse 插件。
添加完库之后,嵌入代码如下:
var engine = Engine.newInstance(HARDWARE_ACCELERATED);
var browser = engine.newBrowser();
var browserView = BrowserView.newInstance(shell, browser);
browser.navigation().loadUrl("https://example.com");
浏览器引擎
Standard Widget Toolkit(标准小部件工具包,简称 SWT)的初衷是提供符合操作系统原生感觉的用户体验。为了实现这一目标,SWT 使用操作系统提供的小部件,而不是像其他工具包那样创建自己的一套小部件。
因此,SWT 中的每个小部件都是对原生对应部件的封装。该工具包为您提供了使用小部件的 API,但小部件的渲染、可访问性、焦点管理以及其他功能则由操作系统处理。Browser
小部件也是以这种方式工作的。
Browser
是对操作系统提供的网页视图控件的简单封装。在 Windows 上,这是基于 Microsoft Edge 的 WebView2
。在 macOS 和 Linux 上,分别是 WKWebView
和 WebKitGTK
,两者都使用 WebKit。
相比之下,JxBrowser 配备了基于 Chromium 的内置浏览器引擎。其设计理念是确保无论操作系统和已安装软件如何,浏览器行为都能保持一致。
浏览器引擎:操作系统提供 vs 捆绑内置。
开发成本
过去,不同浏览器对同一个网站的渲染方式常常有所不同。来自不同厂商的浏览器支持各自的 HTML、CSS,甚至 JavaScript 子集。这种令人头疼的不兼容性导致了巨大的开发和测试成本,也成为了问题的根源。
Internet Explorer 如今早已退出历史舞台,值得庆幸。但是,不兼容的问题也随着它的消失而解决了吗?很遗憾,并没有。浏览器仍会因对代码的执行和样式的渲染方式各异,给开发者带来困扰。
SWT 方法就容易受到这种问题的困扰。在实际应用中,一个跨平台的 SWT 应用程序不仅要面对 Edge 和两种不同版本的 WebKit,还要面对它们的众多版本。有一点很清楚:存在的浏览器运行时越多,所需的开发和测试工作就越多。
JxBrowser 提供了内置的浏览器引擎。通过这种方式,开发人者能够确切知晓应用程序所使用的 Chromium 版本。该版本在所有操作系统上保持一致,只有在 JxBrowser 升级时才会改变。
浏览器越少,开发和测试所需的工作量就越少。
安全性与更新
许多公司都要求浏览器引擎保持最新状态。这是一项安全要求,而且是合理的要求。仅在今年,Chromium 就修复了 179 多个漏洞,其中六个漏洞已知存在可利用的攻击手段。
SWT 使用系统浏览器的方式在企业管理网络中运行良好,在这种网络中,可通过域策略强制进行及时更新。
JxBrowser 使开发者可以控制浏览器的版本。通过这种方式,应用程序能够确保符合公司的安全策略,而无需依赖运行环境。在未受管理的网络或个人计算机中,只要应用程序能够适时升级,这种方式也非常适用。
在 2024 年,JxBrowser 发布了 15 个带有 Chromium 升级的版本。最新版本 JxBrowser {version} 使用的是 Chromium {chromium_version}。
功能
内置的 Browser
是一个功能强大的小部件,但其功能受限于自身的架构。使用不同的浏览器引擎会限制 API,使其仅包含 WebView2
、 WKWebView
和 WebKitGTK
之间兼容的功能。
Browser
支持以下操作:
-
加载网站及本地 HTML 文件;
-
管理 cookies;
-
管理弹出窗口;
-
执行基本授权操作;
-
在 Java 和 JavaScript 之间相互调用;
-
监听页面位置或标题更改的事件。
内置浏览器与 JxBrowser 的 API 界面。
JxBrowser 底层使用 Chromium,这使得它更易于支持更广泛的功能。除了常规的浏览功能外,它还提供了 Chromium 特有的功能。以下列表并不完整,但展示了一些关键功能,帮助您了解 JxBrowser 的能力:
-
Chrome 扩展程序。
-
截图功能。
-
打印支持。
-
表单自动填充。
-
自定义协议。
-
控制 HTTP 流量。
-
高级身份验证(包括 NTLM、SSL 客户端证书、SuisseID、U2F、集成 Windows 身份验证和 Kerberos)。
-
以及更多功能。
对浏览器的控制
创建一个 SWT 浏览器只需要一行简单的代码:new Browser(...)
。但是,这行简单的代码隐藏了实际技术的复杂性。底层的浏览器是非常复杂的项目,它们有不同的进程模型、安全特性,以及各自嵌入像 SWT 这样其他平台的方式。
当需求简单时,我们希望这种复杂性被隐藏起来。然而,当情况变得复杂,对浏览器进行更深入的控制可能就变得必要了。JxBrowser API 提供的概念层级结构赋予您这种控制权。
JxBrowser 的架构。
您可以通过创建一个 Engine
来启动 Chromium 的主进程。如果您需要五个主进程,那就创建五个 Engine
实例。在一个引擎内创建的对象与其他引擎在物理上是隔离的。
在每个引擎中,您拥有一个或多个 Profile
。这些是 Chromium 的配置文件,它们允许将所有的浏览器数据和设置分开保存。您可以在配置文件级别管理缓存、代理、网络、下载、权限以及其他功能。
在一个 Profile 中,您可以创建多个 Browser
实例——可以将它们视为 Chromium 中的标签页。这些是实际的浏览器,您可以通过它们执行导航、分发鼠标和键盘事件、截图、打开开发者工具以及执行其他操作。即使浏览器对用户不可见,它也能完全正常运行,因为默认情况下渲染是在内存中完成的。要显示浏览器,请使用 BrowserView。
最后,一个浏览器中可以包含多个 Frame
实例。它们代表页面上的实际框架,允许您操作 JavaScript 和 DOM。
开发者工具
SWT 的 Browser
API 本身不支持开发者工具,但您可以将其连接到 Microsoft Edge 或 Safari 的开发者工具实例。目前,Linux 平台上尚不支持开发者工具。
JxBrowser 提供了一个 API,可用于打开 Chromium 的 DevTools,并支持所有操作系统。您还可以为任何 JavaScript 库安装开发者工具扩展,并享受与 Google Chrome 一样的原生开发体验。
JxBrowser 中带有 React 扩展的 DevTools。
自动化测试
目前,SWT Browser
中加载的网页内容无法进行自动化测试。
JxBrowser 与支持 Chromium DevTools 协议的自动化测试框架兼容,例如 Selenium、Puppeteer 或 Playwright。
支持与协助
由于 SWT 是一个开源项目,您始终可以依靠社区的支持。如果您发现了一个错误或有不错的功能建议,可以在 GitHub 上分享您的发现,并自由为其贡献。
JxBrowser 是一款商业产品,专为对第三方软件和供应商有严格要求和时间期限的公司而打造。我们提供私人帮助台系统,客户报告将保密。保证的首次响应时间(或 SLA)为一个工作日。
技术支持包括产品使用帮助、故障排查协助、错误修复以及功能请求的考虑。所有的支持请求都将直接由 JxBrowser 的软件工程师处理。