加速 Selenium 测试执行最佳实践
Selenium测试自动化的主要目的是加快测试过程。在大多数情况下,使用 Selenium 的自动化测试比手动测试执行得特别好。在实际自动化测试实践中,我们有很多方式可以加速Selenium用例的执行。
我们可以选择使用不同类型的等待、不同类型的 Web 定位器、不同的浏览器首选项,做出最明智的选择可以帮助加快 Selenium 测试的速度。在寻求加速 Selenium 测试时,还应该考虑优化 Selenium 测试基础架构,因为这可以显着提高测试执行速度。
在本文中,我主要从速度和性能的角度介绍 Selenium Web 测试最佳实践,帮助你能够更好地加速 Selenium 测试以获得更快的测试结果。
加速 Selenium 测试的最佳实践
随着产品的重大更新,维护和升级Selenium测试的过程开始变得过于复杂。与其限制 Selenium 测试性能,还不如从一开始就加速 Selenium 测试。
无论测试中的场景如何,以下是 Selenium 测试应该执行的操作:
- 使用本地Selenium WebDriver或远程 Selenium WebDriver打开被测 URL。
- 使用最合适的 Web Selenium 定位器(即 XPath、CssSelector、Linktext 等)定位所需的
WebElement 。 - 对定位的 WebElement 执行必要的操作。在被测页面上进行断言。
- 释放 WebDriver 使用的资源。
下面将介绍一些加速 Selenium 测试用例执行的 Selenium Web 测试最佳实践:
选择合适的网络定位器
Selenium 中的 Web 定位器被认为是任何测试场景的基本构建块。为了自动化与任何 Web 元素的交互,首先,我们使用合适的 Web 定位器定位 WebElement,然后对元素执行适当的操作。
以下是 Selenium 中一些广泛使用的 Web 定位器(排名不分先后):
- XPath
- CSS Selector
- Name
- LinkText
- Partial LinkText
- TagName
- ClassName
问题是“哪个网络定位器在 Selenium 中定位元素最快?”。
就定位 WebElements 的速度而言,ID 是最快的 Web 定位器,因为Selenium WebDriver 中的ID 定位器对于页面上的每个元素都是唯一的。ID 定位器返回与指定值(或字符串)匹配的 WebElement。如果页面上存在多个具有相同 ID 的元素,则document.getElementById() 返回第一个匹配的元素。主流的 Web 浏览器优化了document.getElementById()方法,从而帮助以更快的速度从 DOM 提供 WebElement。
如果 WebElement 没有 ID 属性,建议使用 name 属性。如果 WebElement 既没有 ID 也没有 name 属性,应该使用CSS Selector Web Locator。CSS 引擎在所有主要浏览器中都是一致的,并且它们的性能经过调整,以通过 Selenium 中的 CSS 选择器获得更好的性能。
这也意味着您在使用此特定 Web 定位器时会遇到较少的浏览器兼容性问题。CSS Selector 提供更快的元素识别和减少的测试执行时间。此外,CSS Selector 最适合像 Internet Explorer 这样的退役浏览器,并且与 XPath 相比还提供更好的可读性。
XPath是最慢的 Web 定位器,从一个浏览器移动到另一个浏览器时,您可能会遇到 XPath 一致性问题。仅当您无法选择在 Selenium WebDriver 中使用其他可靠的Web 定位器时,才使用 XPath 来定位 Web 元素。
下面列出了按执行速度升序排列的 Web 定位器:
- ID
- Name
- CSS Selector
- XPath
使用更少的网络定位器
如果你已经选择了最适合加速 Selenium 测试的 Web 定位器,下一步应该是将定位器的数量保持在最低限度。
每次使用 find_element(By) 或 find_elements(By) 方法来定位所需的 Web 元素时,都会执行对 DOM 树的访问。访问 DOM 树的次数越多,Selenium 脚本的执行时间就越长。使用较少的 Web 定位器是 Selenium Web 测试的最佳实践之一,尤其是把 Selenium 脚本的最佳执行速度为目标时。这种做法还提高了测试脚本的可读性,从而最大限度地减少了维护脚本的时间。
避免 Thread.sleep()
网站或 Web 应用程序可以包含本质上是静态或动态的内容。现代网站使用 AJAX(异步 JavaScript 和 XML)在网页上动态加载内容。因此,页面上的 WebElements 可能会以不同的时间间隔加载,从而在对尚未在 DOM 中的元素执行操作时造成困难。
建议通过监控 document.readyState 的状态来检查 DOM 状态。当 document.readyState 完成时,意味着页面上的所有资源都已加载。现在可以对页面上的WebElements进行相关操作。测试代码中的等待(几秒钟)还增加了加载页面资源所需的必要延迟。
尽管在 Selenium 中有多种添加等待的方法,但必须不惜一切代价避免使用 Thread.sleep(sleep_in_miliseconds)。Selenium 中的 Thread.sleep() 方法将代码执行暂停指定的时间。
Thread.sleep(5000);
- 1
在上面的代码片段中,我们添加了 5 秒的等待。如果页面元素在指定的持续时间(例如,2 秒)内加载良好怎么办?在这种情况下,等待 3 秒会不必要地增加测试执行时间。由于页面加载时间取决于各种外部参数(即服务器负载、页面设计、缓存、网络带宽等),因此无法预测页面的加载时间。在执行自动化浏览器测试时,在 Selenium 中测量页面加载时间是一个很好的做法。
建议避免使用 Thread.sleep() 来加速 Selenium 测试,因为无论网页状态如何,该方法都会执行睡眠(持续固定的时间)。
复用浏览器实例
所有可与 Selenium 一起使用的测试自动化框架都提供了用于加速测试开发和执行的注解。注释还有助于使用不同的输入值执行测试。但是,根据测试要求使用正确的注释集可以加快 Selenium 测试的速度。
以下是流行的测试自动化框架的一些广泛使用的注释:
在某些情况下,你可能希望在同一浏览器和操作系统组合上运行单个测试(或一组测试)。在这种情况下,在每个测试开始时创建 Selenium WebDriver 的新实例会增加测试执行的额外开销。
用于 Selenium 的 JUnit
以下是JUnit for Selenium中注解的执行顺序:
Junit执行顺序
在使用 JUnit 框架的 Selenium 自动化测试中,Selenium WebDriver 实例是在 @Before 注释下实现的 SetUp 方法中创建的。创建的实例在@After 注解下实现的TearDown 方法中销毁。
Selenium的TestNG
下面是TestNG for Selenium中注解的执行顺序:
TestNG执行顺序
同理,对于Selenium中的TestNG测试,SetUp方法在@BeforeMethod注解下实现,TearDown方法在@AfterMethod注解下实现。
使用显式等待
Selenium 中的隐式等待应用于测试脚本中的所有 Web 元素。Selenium 中的显式等待允许对页面上存在的 WebElements 执行条件等待。例如,如果指定的 WebElement 在显式等待中提到的持续时间内可见,则抛出 ElementNotVisibleException。如果定位的元素是可点击的,则 elementToBeClickable 方法返回一个 WebElement。
WebDriverWait 和 ExpectedConditions 类的组合用于对 WebElements 执行显式等待。Explicit Wait 的好处是运行在代码上,而不是远程 Selenium 部分。显式等待不会等到持续时间结束,而是等待指定条件一满足就退出。如果条件找到 WebElement,则返回该元素作为结果。如果 WebElement 不存在于 DOM 中,即使条件中指定的持续时间已过,也会引发 TimeoutException。
在下面显示的代码段中,对visibilityOfElementLocated 条件执行了5 秒的显式等待。如果 ID = ‘element’ 的 WebElement 在 5 秒内找到,则显式等待退出,并返回所需的 WebElement。
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("element"));
显式等待的测试脚本性能更好,因为一旦找到元素就可以访问 WebElement。显式等待加速 Selenium 测试,因为等待并非“总是”在整个等待持续时间内执行。
创建原子和自主测试脚本
这是编写高效 Selenium 测试的最基本要求。无论测试场景的复杂程度如何,都必须将复杂场景分解为多个“独立且原子”的测试用例。
像 TestNG 这样的测试自动化框架支持通过诸如dependsOnMethods(对于方法)和dependsOnGroups(对于组)之类的注释来声明测试方法之间的显式依赖关系。如果你希望在测试方法之间共享数据和状态时,应只在 Selenium 测试脚本中使用测试依赖项。
另一方面,原子测试可用于检测故障。保持测试的简短和原子性还有助于减少用于维护测试的工作量。
在 Selenium 测试中具有原子性可以最大程度地减少测试依赖性,有助于隔离测试实施中的问题,减少维护工作并加快 Selenium 测试的速度。
并行测试
Selenium 中的并行测试允许您在不同的测试环境中同时运行相同的测试。如果您计划使用内部 Selenium Grid 进行分布式测试,建议利用Selenium Grid 4提供的功能来加速测试场景的执行。
Selenium并行测试在软件测试中有许多好处,以下是其中的一些主要优势:
提高测试效率:通过并行测试,可以同时运行多个测试用例,充分利用多核处理器和资源,显著提高测试的执行速度。相比串行测试,可以更快地获得测试结果,加快反馈周期,提高团队的工作效率。
加速持续集成:在持续集成和持续交付流程中,测试是关键环节。通过并行测试,可以快速运行大量的测试用例,及时发现和解决问题,确保软件的质量和稳定性,加快交付速度。
提高测试覆盖率:并行测试能够更快地执行大量的测试用例,从而提高测试覆盖率。测试覆盖率越高,发现问题的可能性就越大,软件的质量也会得到提升。
更好地模拟真实环境:并行测试可以模拟真实的多用户、高负载场景,更真实地反映系统在生产环境中的表现。这有助于发现潜在的性能问题和瓶颈,提前做出优化和调整。
发现潜在问题:并行测试能够同时运行多个测试用例,从而发现一些在串行测试中不容易暴露的问题。例如,可能会发现在特定并发条件下的竞争条件和资源冲突问题。
提高自动化测试的价值:并行测试尤其适用于自动化测试。通过并行执行自动化测试用例,可以快速运行大量测试,为团队提供实时反馈,帮助团队快速发现和解决问题。
优化硬件资源利用率:在并行测试中,可以将测试用例分布到多台测试机或浏览器上,充分利用硬件资源,提高测试执行的效率。
快速发现问题:通过并行测试,可以同时运行多个测试用例,从而快速发现潜在的问题和缺陷。这样可以及早解决问题,避免问题扩散和影响其他测试用例的执行。
综上所述,Selenium并行测试在软件测试中具有重要的优势,可以提高测试效率,加速持续集成,提高测试覆盖率,发现潜在问题,优化硬件资源利用率等。因此,在进行Selenium自动化测试时,考虑并实现并行测试是非常值得推荐的做法。
禁用图像
一旦创建了 Selenium WebDriver 的实例,Selenium 中的 driver.get() 方法用于打开被测页面。网页的加载很大程度上取决于页面的组成。如果页面上有大量图像,页面加载时间会增加。
根据测试需求,您可以禁用图片加载,从而加快网页加载速度。使用特定于浏览器的设置,您可以禁止在相应的 Web 浏览器中加载图像。
这是在 Chrome 中禁用图像加载以加快 Selenium 测试的实现:
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.testng.annotations.AfterTest;
import org.testng.annotations.Test;
import java.util.HashMap;public class test_disable_image_demo
{String test_url = "https://www.abc.com";WebDriver driver = null;@Test(enabled=true, priority = 1)public void test_disable_images_chrome() throws InterruptedException{ChromeOptions options =new ChromeOptions();HashMap<String, Object> prefs = new HashMap<String, Object>();prefs.put("profile.managed_default_content_settings.images", 2);options.setExperimentalOption("prefs", prefs);driver = new ChromeDriver(options);driver.get(test_url);driver.manage().window().maximize();Thread.sleep(5000);}@AfterTestpublic void tearDown(){if (driver != null){driver.quit();}}
}
从上面的实现中可以看出,我们禁用了图片加载,这大大缩短了该电子商务网站的页面加载时间。
这是在 Firefox 中禁用图像加载以加快 Selenium 测试的实现:
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.testng.annotations.AfterTest;
import org.testng.annotations.Test;
import java.util.HashMap;public class test_disable_image_demo
{String test_url = "https://www.abc.com";WebDriver driver = null;@Test(enabled=true, priority = 1)public void test_disable_images_firefox() throws InterruptedException{FirefoxProfile profile = new FirefoxProfile();profile.setPreference("permissions.default.image", 2);FirefoxOptions options = new FirefoxOptions();options.setProfile(profile);driver = new FirefoxDriver(options);driver.get(test_url);driver.manage().window().maximize();Thread.sleep(5000);}@AfterTestpublic void tearDown(){if (driver != null){driver.quit();}}
}
在上面的实现中,我们通过将 Firefox 首选项 permissions.default.image 设置为 2 来禁用加载图像。禁用图像加载是应该使用的被破坏的 Selenium Web 测试最佳实践之一,尤其是当被测页面上有许多图像。
使用Headless
运行 Selenium 自动化测试的目的是检查以验证与底层 UI 元素的交互。在这种情况下,您可能希望通过在非无头模式下调用浏览器驱动程序来验证交互。
无头浏览器允许您在没有浏览器 GUI 或任何其他 GUI 的情况下运行浏览器 UI 测试。由于跨浏览器测试在后端运行,无头测试增强了跨浏览器测试的性能。流行的浏览器,如 Chrome、Firefox 等,可以在无头模式下运行。基于云的实践中,设置为在无头模式下运行所需的浏览器功能如下所示。
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("build", "FunTester");
capabilities.setCapability("name", "FunTester");
capabilities.setCapability("platform", "Mac 13");
capabilities.setCapability("browserName", "Chrome");
capabilities.setCapability("version","112.0");
capabilities.setCapability("headless",true);
Headless 浏览器测试是 Selenium Web 测试最佳实践之一,当您不打算检查通过测试脚本和相应的浏览器驱动程序实现的 UI 交互时,应该使用它。没有浏览器 UI 和无头浏览器的各种 UI 可以加速 Selenium 测试。
一些流行的无头浏览器(或驱动程序)形式是:
- HtmlUnit
- Splash
- PhantomJS
- TrifleJS
- ZombieJS
- SimpleBrowser
具体实践这里不一一赘述,感兴趣的同学可以自行去官方查看Demo。
总结:
感谢每一个认真阅读我文章的人!!!
作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。
相关文章:

加速 Selenium 测试执行最佳实践
Selenium测试自动化的主要目的是加快测试过程。在大多数情况下,使用 Selenium 的自动化测试比手动测试执行得特别好。在实际自动化测试实践中,我们有很多方式可以加速Selenium用例的执行。 我们可以选择使用不同类型的等待、不同类型的 Web 定位器、不同…...

c语言野指针
系列文章目录 c语言野指针 c语言野指针 系列文章目录c语言野指针 c语言野指针 野指针可以用于破坏修改别人的内存空间,比如游戏外挂 野指针 野指针:野指针是指向一个未知的内存空间,在读写的时候出现错误。 0-255都是系统保留的 不可以读&am…...

【MySQL】where和having的区别
🍎个人博客:个人主页 🏆个人专栏:数据库 ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 用途: 使用位置: 操作对象: 聚合函数: 示例: 结语 我的其他博客 前言 数据库中的 WHERE 和 HAVING 子句在 SQL 查…...

npm pnpm yarn 报错或常见问题处理集锦
各种卡死,报错问题处理汇总 1. npm 安装 卡死了怎么办,npm # 切换源 npm config set registry https://registry.npmmirror.com # 查看源 npm config get registry2. pnpm安装 卡死了怎么办 方法1:切换源 npx pnpm config set registry h…...

【Git】常用的Git操作集合
常用的Git操作集合 1. 分支操作1.1 查看本地所有分支git branch 1.2 查看所有分支(包含本地远程仓库)git branch -a 1.3 切换分支git checkout test 2. 常用基本操作2.1 查看 git 各存储区内(文件)状态git status 2.2 查看工作区与暂存区文件差异git dif…...

JavaScript库jquery的使用方法
"写更少,做更多"是jquery的设计理念,jquery是一个兼容多浏览器的JavaScript库,利用jquery的语法设计能使开发更便捷。 网页添加jquery的方法:1.从jquery.com下载库;2.从CDN中载入库(示例使用)&a…...

Vue (v-bind指令、el与data的两种写法、理解MVVM、数据代理、V-no事件处理、双向数据绑定V-model、登陆页面实现
V-bind指令 el与data两种写法 MVVM 数据代理 V-no事件处理 V-no用于监听DOM对象 双向数据绑定V-model v-model 指令用来在 input、select、textarea、checkbox、radio 等表单控件元素上创建双向数据绑定,根据表单上的值,自动更新绑定的元素的值。 按钮的…...

SpringBoot - SpringBoot手写模拟SpringBoot启动过程
依赖 建一个工程,两个Module: 1. springboot模块,表示springboot框架的源码实现 2. user包,表示用户业务系统,用来写业务代码来测试我们所模拟出来的SpringBoot 首先,SpringBoot是基于的Spring,所以我…...

40. 组合总和 II - 力扣(LeetCode)
题目描述 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含重复的组合。 输入示例 candidates [10,1,2,7,…...

第15届蓝桥杯嵌入式省赛准备第二天总结笔记(使用STM32cubeMX创建hal库工程+按键输入)
一.查看电路图 按键是使用的PB0,PB1,PB2,PA0四个引脚,然后使用CubeMX配置引脚,4个脚都配置为输入模式和上拉。 程序生成之后把不用的删掉,需要的留下,这里我把函数名改了。 然后写按键扫描读取程序,这里参考的正点原子…...

【论文阅读】One For All: Toward Training One Graph Model for All Classification Tasks
目录 0、基本信息1、研究动机2、创新点——One For All :unique features3、准备4、具体实现4.1、用TAGs统一来自不同领域的图数据4.2、用NOI(NODES-OF-INTEREST)统一不同图任务4.2.1、NOI子图4.2.2、NOI提示结点 4.3、用于图的上下文学习&am…...

Python多线程爬虫——数据分析项目实现详解
前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:https://www.captainbed.cn/z 「个人网站」:雪碧的个人网站 ChatGPT体验地址 文章目录 前言爬虫获取cookie网站爬取与启动CS…...

unity全局音量管理/全局音量设置与音量设置界面(含静音功能)
前言 本文将会介绍如何使用audiomixer实现全局音量控制,并且会介绍如何实现游戏内的含静音功能的音量设置界面。 本人也是个初学者,在看过一些关于音量管理的教程后,发现使用audiomixer实现全局音量控制可能是最方便、功能最完备、强大的&a…...

C++ vector 数组转换、查找、最大最小值、排序、排行的几种用法
C vector中常用到排序、取最值,一些场景可能还会要计算某个元素的排行,以下就是一些实际例子,精简、有效。 【1】会涉及到数组转vector: vector<int> v(arr, arr N); // N为数组size,可用sizeof(arr)/sizeof(i…...

vmware 安装Rocky-9.3系统
安装系统截图 安装完成,启动 查看版本和内核 开启远程登陆授权 1、编辑配置文件 #提升权限,输入su,并输入密码 su #编辑ssh文件开启root远程登陆 vi /etc/ssh/sshd_config找到以下内容:#PermitRootLogin prohibit-password 添加:…...

C++提高编程——模板
本专栏记录C学习过程包括C基础以及数据结构和算法,其中第一部分计划时间一个月,主要跟着黑马视频教程,学习路线如下,不定时更新,欢迎关注。 当前章节处于: ---------第1阶段-C基础入门 ---------第2阶段实战…...

单线程、同步、异步、预解析、作用域、隐式全局变量、对象创建、new
单线程 进程 cpu 资源分配的最小单位一个进程可以有多个线程 线程 cpu调度的最小单位线程建立在进程的建立基础上的一次程序的运行单位 线程分为:单线程 多线程 单线程:js是单线程 (同一个时间只能完成一个任务)多线程&…...

《设计模式的艺术》笔记 - 外观模式
介绍 外观模式中外部与一个子系统的通信通过一个统一的外观角色进行,为子系统中的一组接口提供一个一致的入口。外观模式定义了一个高层接口,这个接口使得子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。 实现 myclas…...

sql 查询时间范围内的数据
要查询特定时间范围内的数据,您可以使用 SQL 中的 BETWEEN 运算符。以下是一个示例查询,它从名为 your_table 的表中检索在 start_date 和 end_date 之间创建的所有记录: SELECT * FROM your_table WHERE created_date BETWEEN start_date AN…...

TestNG中的@BeforeSuite注释
目录 什么是BeforeSuite注解? BeforeSuite带注释的方法何时执行? BeforeSuite annotation有什么用? 所以,是时候集思广益了 我们可以在一个类中使用多个BeforeSuite注释方法吗? BeforeSuite放在超类上时如何工作…...

[学习笔记]刘知远团队大模型技术与交叉应用L3-Transformer_and_PLMs
RNN存在信息瓶颈的问题。 注意力机制的核心就是在decoder的每一步,都把encoder的所有向量提供给decoder模型。 具体的例子 先获得encoder隐向量的一个注意力分数。 注意力机制的各种变体 一:直接点积 二:中间乘以一个矩阵 三:…...

图像处理工具包Pillow的使用分享
Pillow 是 Python 中一个流行的图像处理库,它是 PIL(Python Imaging Library)的一个友好的分支版本。Pillow 提供了许多功能,使得图像处理变得容易和方便。下面是一些基本用法和示例: 安装 Pillow 首先,你…...

python进程间通信——命名管道(Named Pipe、FIFO)
文章目录 Python中的命名管道:深入理解进程间通信1. 命名管道简介2. 创建和删除命名管道3. 写入命名管道4. 读取命名管道5. 示例:进程间通信write_to_pipe.pyread_from_pipe.py测试运行 6. 注意事项和限制命名管道的半双工机制命名管道读写任意一方未打开…...

03 OSPF 学习大纲
参考文章 1 初步认识OSPF的大致内容(第三课)-CSDN博客 2...

HJ7 取近似值【C语言】
【华为机试题 HJ7】取近似值 描述输入描述:输出描述:示例1示例2参考代码1参考代码2参考代码3描述 写出一个程序,接受一个正浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于 0.5 ,向上取整;小于 0.5 ,则向下取整。 数据范围:保证输入的数字在 32 位浮点数范…...

php基础学习之常量
php常量的基本概念 常量是在程序运行中的一种不可改变的量(数据),常量一旦定义,通常不可改变(用户级别)。 php常量的定义形式 使用define函数:define("常量名字", 常量值);使用cons…...

2024最新面试经验分享
目录 重点掌握的知识点JavaMySQLRedis 微服务分布式系统项目亮点场景题/设计题短链抢红包多租户 开放性问题自我介绍为什么跳槽团队规模如何带团队如何看待加班职业规划 主要针对Java程序员,当然也包含一些通用的内容。 重点掌握的知识点 需要重点掌握的知识点必须…...

《WebKit 技术内幕》之八(1):硬件加速机制
《WebKit 技术内幕》之八(1):硬件加速机制 1 硬件加速基础 1.1 概念 这里说的硬件加速技术是指使用GPU的硬件能力来帮助渲染网页,因为GPU的作用主要是用来绘制3D图形并且性能特别好,这是它的专长所在,它…...

子表单扫码录入,显著节省填写时间
01/17 主要更新模块概览 扫 码 识 别 新 增 字 号 登 录 配 置 匹 配 搜 素 扫码识别 路径:表单设计 >> 字段属性 功能简介 之前对子表单扫码录入,是单独在组件内设置扫码,操作需重新点击扫码功能,手工新增子表数据&a…...

【Redis】Ubuntu安装配置
目录 一、安装Redis 1.1 从APT仓库安装Redis 二、启动&关闭&重启 三、Redis核心配置 3.1 CONFIG命令 3.2 redis.conf文件说明 一、安装Redis 1.1 从APT仓库安装Redis 从APT仓库可以安装最新的Redis稳定版,步骤如下: 【1】安装需要用到的…...