选择 JxBrowser 还是 SWT Browser

当您需要在 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 上,分别是 WKWebViewWebKitGTK,两者都使用 WebKit。

相比之下,JxBrowser 配备了基于 Chromium 的内置浏览器引擎。其设计理念是确保无论操作系统和已安装软件如何,浏览器行为都能保持一致。

浏览器引擎:操作系统提供 vs 捆绑内置。

             浏览器引擎:操作系统提供 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,使其仅包含 WebView2WKWebViewWebKitGTK 之间兼容的功能。

Browser 支持以下操作:

  • 加载网站及本地 HTML 文件;

  • 管理 cookies;

  • 管理弹出窗口;

  • 执行基本授权操作;

  • 在 Java 和 JavaScript 之间相互调用;

  • 监听页面位置或标题更改的事件。

内置浏览器与 JxBrowser 的 API 界面。

          内置浏览器与 JxBrowser 的 API 界面。

JxBrowser 底层使用 Chromium,这使得它更易于支持更广泛的功能。除了常规的浏览功能外,它还提供了 Chromium 特有的功能。以下列表并不完整,但展示了一些关键功能,帮助您了解 JxBrowser 的能力:

  • Chrome 扩展程序。

  • 截图功能。

  • 打印支持。

  • 表单自动填充。

  • 自定义协议。

  • 控制 HTTP 流量。

  • 高级身份验证(包括 NTLM、SSL 客户端证书、SuisseID、U2F、集成 Windows 身份验证和 Kerberos)。

  • 以及更多功能。

对浏览器的控制

创建一个 SWT 浏览器只需要一行简单的代码:new Browser(...)。但是,这行简单的代码隐藏了实际技术的复杂性。底层的浏览器是非常复杂的项目,它们有不同的进程模型、安全特性,以及各自嵌入像 SWT 这样其他平台的方式。

当需求简单时,我们希望这种复杂性被隐藏起来。然而,当情况变得复杂,对浏览器进行更深入的控制可能就变得必要了。JxBrowser API 提供的概念层级结构赋予您这种控制权。

JxBrowser 的架构。

                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。

             JxBrowser 中带有 React 扩展的 DevTools。

自动化测试

目前,SWT Browser 中加载的网页内容无法进行自动化测试。

JxBrowser 与支持 Chromium DevTools 协议的自动化测试框架兼容,例如 Selenium、Puppeteer 或 Playwright。

支持与协助

由于 SWT 是一个开源项目,您始终可以依靠社区的支持。如果您发现了一个错误或有不错的功能建议,可以在 GitHub 上分享您的发现,并自由为其贡献。

JxBrowser 是一款商业产品,专为对第三方软件和供应商有严格要求和时间期限的公司而打造。我们提供私人帮助台系统,客户报告将保密。保证的首次响应时间(或 SLA)为一个工作日

技术支持包括产品使用帮助、故障排查协助、错误修复以及功能请求的考虑。所有的支持请求都将直接由 JxBrowser 的软件工程师处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/967888.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RoboGrasp:一种用于稳健机器人控制的通用抓取策略

25年1月来自北京大学和哈佛大学的论文“RoboGrasp: A Universal Grasping Policy for Robust Robotic Control”。 模仿学习和世界模型在推进通用机器人学习方面显示出巨大的潜力,而机器人抓取仍然是实现精确操控的关键挑战。现有方法通常严重依赖机械臂状态数据和…

金仓数据库-KingbaseES-学习-01-单机部署(非图形化安装)

目录 一、环境信息 二、介绍 三、下载地址 四、安装步骤 1、配置内核参数 (1)文件系统相关 (2)共享内存与信号量(IPC) (3)网络与端口配置 (4)关键场…

双周报Vol.65:新增is表达式、字符串构造和数组模式匹配增强、IDE模式匹配补全增强...多项技术更新!

MoonBit更新 新增 is 表达式 这个表达式的语法形式为 expr is pat,这个表达式为 Bool 类型,当 expr 符合 pat 这个模式的时候返回 true,比如: fn use_is_expr(x: Int?) -> Unit {if x is Some(i) && i > 10 { .…

【Apache Paimon】-- 作为一名小白,如何系统地学习 Apache paimon?

目录 一、整体规划 1. 了解基本概念与背景 2. 学习资料的选择 3. 学习路径与规划 4. 学习建议 5. 注意事项 6. 参考学习资料 二、详细计划 阶段 1:了解基础(1-2 周) 阶段 2:深入掌握核心功能(3-4 周&#xf…

查出 product 表中所有 detail 字段包含 xxx 的完整记录

您可以使用以下 SQL 查询语句来查出 product 表中所有 detail 字段包含 oss.kxlist.com 的完整记录&#xff1a; SELECT * FROM product WHERE INSTR(detail, oss.kxlist.com) > 0;下面是detail字段包含的完整内容 <p><img style"max-width:100%;" src…

深度剖析责任链模式

一、责任链模式的本质&#xff1a;灵活可扩展的流水线处理 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是行为型设计模式的代表&#xff0c;其核心思想是将请求的发送者与接收者解耦&#xff0c;允许多个对象都有机会处理请求。这种模式完美解决了以下…

大数据项目7:基于大数据的天气数据分析和可视化系统

项目简介 本项目主要研究的内容是基于大数据分析和挖掘的技术&#xff0c;结合海量的天气数据&#xff0c;对异常灾害数据进行分析和预测&#xff0c;发现异常气象中的规律。当下大数据的技术正在高速发展&#xff0c;并且在教育&#xff0c;金融&#xff0c;农业&#xff0c…

PyQt学习记录01——加法计算器

0. 安装配置 0.1 安装相关库 首先打开你的PyCharm程序&#xff0c;然后新建一个目录用于学习&#xff0c;其次在terminal中输入 pip install pyqt5如果你不具有科学上网能力&#xff0c;请改为国内源 pip install pyqt5 -i https://pypi.douban.com/simple然后安装pyqt相关…

pytest测试专题 - 1.2 如何获得美观的测试报告

<< 返回目录 1 pytest测试专题 - 1.2 如何获得美观的测试报告 1.1 背景 虽然pytest命令的报文很详细&#xff0c;用例在执行调试时还算比较方便阅读和提取失败信息&#xff0c; 但对于大量测试用例运行时&#xff0c;可能会存在以下不足 报文被冲掉测试日志没法归档 …

嵌入式八股文面试题(二)C语言算法

相关概念请查看文章&#xff1a;C语言概念。 1. 如何实现一个简单的内存池&#xff1f; 简单实现&#xff1a; #include <stdio.h> #include <stdlib.h>//内存块 typedef struct MemoryBlock {void *data; // 内存块起始地址struct MemoryBlock *next; // 下一个内…

树莓派上 基于Opencv 实现人脸检测与人脸识别

一&#xff0c;需求 基于树莓派4b&#xff0c;usb1080p摄像头&#xff0c;实现人脸检测与人脸识别。尝试了海陵科的模组和百度的sdk。海陵科的模组无法录入人脸&#xff0c;浪费了100多块钱。百度的sdk 在树莓派上也无法录入人脸&#xff0c;官方解决不了。最后只能用opencv自…

机器学习10-卷积和卷积核3

机器学习10-卷积和卷积核3 纹理表示卷积神经网络全链接神经网络的瓶颈卷积网络中的卷积操作特征响应图组尺寸计算 池化操作示例 图像增强翻转随机缩放抠图色彩抖动其他方案1. 平移2. 旋转3. 拉伸4. 径向畸变5. 裁剪 纹理表示 如何去表示纹理&#xff1f; 基于卷积核组的纹理表…

Ollama部署DeepSeek(windows or ubuntu)

Ollama(官网是https://ollama.com/)是一个专为在本地机器上便捷部署和运行大型语言模型&#xff08;LLM&#xff09;而设计的开源框架。它简化了大型语言模型的部署过程&#xff0c;提供了轻量级与可扩展的架构&#xff0c;使得研究人员、开发人员和爱好者能够更加方便地在本地…

嵌入式知识点总结 操作系统 专题提升(五)-内存

针对于嵌入式软件杂乱的知识点总结起来&#xff0c;提供给读者学习复习对下述内容的强化。 目录 1.在1G内存的计算机能否malloc&#xff08;1.2G&#xff09;&#xff1f;为什么&#xff1f; 2.malloc能申请多大的空间&#xff1f; 3.内存管理有哪几种方式&#xff1f; 4.什…

Lucene 中的并发错误:如何修复乐观并发失败

作者&#xff1a;来着 Elastic Benjamin Trent 及 Ao Li 感谢 CMU PASTA 实验室开发的确定性并发测试框架 Fray&#xff0c;我们找到了一个棘手的 Lucene 漏洞并将其修复。 是的&#xff0c;另一个修复错误博客。但这个故事有一个转折&#xff0c;一位开源英雄突然出现并拯救了…

redis 缓存击穿问题与解决方案

前言1. 什么是缓存击穿?2. 如何解决缓存击穿?怎么做?方案1: 定时刷新方案2: 自动续期方案3: 定时续期 如何选? 前言 当我们使用redis做缓存的时候,查询流程一般是先查询redis,如果redis未命中,再查询MySQL,将MySQL查询的数据同步到redis(回源),最后返回数据 流程图 为什…

【分布式理论9】分布式协同:分布式系统进程互斥与互斥算法

文章目录 一、互斥问题及分布式系统的特性二、分布式互斥算法1. 集中互斥算法调用流程优缺点 2. 基于许可的互斥算法&#xff08;Lamport 算法&#xff09;调用流程优缺点 3. 令牌环互斥算法调用流程优缺点 三、三种算法对比 在分布式系统中&#xff0c;多个应用服务可能会同时…

【车载项目】 systemui下拉负一屏界面,通过语音输入:“中文模式/英文模式“,会闪现一下负一屏下层的画面

1、背景 【操作步骤】负一屏界面&#xff0c;语音输入&#xff1a;“中文模式/英文模式” 【预期结果】显示正常 【实际结果】 会闪现一下负一屏下层的文字 【发生概率】必现 systemui下拉负一屏界面&#xff0c;通过语音输入&#xff1a;“中文模式/英文模式”&#xff0c;会…

CSS 渐变效果详解——线性渐变与径向渐变

在现代前端开发中&#xff0c;CSS 渐变被广泛应用于网页背景、按钮、图形等元素的渲染。相较于使用图片&#xff0c;实现渐变可以减少资源请求&#xff0c;同时也更灵活。今天我们主要介绍两种常用的渐变类型&#xff1a;线性渐变&#xff08;Linear Gradient&#xff09;与径向…

【愚公系列】《Python网络爬虫从入门到精通》001-初识网络爬虫

标题详情作者简介愚公搬代码头衔华为云特约编辑&#xff0c;华为云云享专家&#xff0c;华为开发者专家&#xff0c;华为产品云测专家&#xff0c;CSDN博客专家&#xff0c;CSDN商业化专家&#xff0c;阿里云专家博主&#xff0c;阿里云签约作者&#xff0c;腾讯云优秀博主&…