Playwright移动端自动化测试:模拟真实设备环境与实战技巧
1. 项目概述为什么我们需要模拟手机设备进行测试在移动互联网时代一个应用的用户体验好坏很大程度上取决于它在手机上的表现。作为开发者或测试工程师我们经常面临一个困境手头没有足够多的真机设备来覆盖所有需要测试的机型、操作系统和屏幕尺寸。即便有手动在每一台设备上重复执行测试用例也是一项耗时耗力、容易出错且成本高昂的工作。这就是自动化测试特别是移动端自动化测试的价值所在——它能让机器代替我们在模拟的或真实的环境中高效、稳定、可重复地执行测试。然而传统的移动端自动化测试框架如 Appium虽然功能强大但配置复杂、环境依赖多、执行速度有时不尽如人意。近年来一个名为 Playwright 的后起之秀以其跨浏览器、跨平台、速度快、API 设计优雅等特点迅速在 Web 自动化测试领域占据了重要地位。但很多人可能不知道Playwright 同样是一个强大的移动端 Web 应用包括响应式网站和 PWA自动化测试利器。它通过模拟真实的移动设备环境包括视口尺寸、用户代理、触摸事件、设备像素比、地理位置等让我们能够在桌面电脑上就对移动端 Web 应用进行高质量的自动化测试。这个项目的核心就是利用 Playwright 来“模拟手机设备”。这不仅仅是把浏览器窗口拖小那么简单而是创建一个高度仿真的移动设备上下文让我们的自动化脚本在一个“以假乱真”的移动环境中运行。这对于前端开发者在本地验证响应式设计、测试工程师进行移动端 Web 功能回归测试、以及进行移动端专项测试如触摸交互、横竖屏切换来说是一个效率倍增器。接下来我将带你从零开始深入拆解如何使用 Playwright 搭建一套高效、可靠的移动端自动化测试方案。2. Playwright 移动端测试能力深度解析2.1 Playwright 模拟设备的底层原理要玩转 Playwright 的移动端模拟首先得理解它到底做了什么。当你使用 Playwright 启动一个模拟了 iPhone 13 的浏览器上下文时它实际上进行了一系列的“伪装”视口Viewport设置这是最基础的一步。Playwright 会将浏览器窗口或无头浏览器标签页的尺寸设置为目标设备的屏幕分辨率例如 iPhone 13 的 390x844。这确保了页面布局和 CSS 媒体查询能够正确响应。用户代理User-Agent字符串替换服务器和网页 JavaScript 经常通过navigator.userAgent来识别客户端设备。Playwright 会将浏览器的 UA 字符串替换为目标设备如 iPhone 的 Safari的真实 UA。这使得服务器可以下发移动端专属的页面资源或进行重定向。设备像素比Device Pixel Ratio模拟现代手机屏幕像素密度很高。DPR 决定了 CSS 中的 1 个“像素”对应多少个物理像素。模拟正确的 DPR如 iPhone 13 的 3对于测试高分辨率图片适配、边框显示等细节至关重要。触摸事件Touch Events模拟这是移动端模拟的灵魂。桌面浏览器通常只有鼠标事件。Playwright 在模拟移动设备时会自动将脚本中的鼠标点击page.click()等操作转换为相应的触摸事件序列如touchstart,touchmove,touchend。同时它还会禁用非触摸类的事件确保测试环境更贴近真实设备。其他设备能力模拟Playwright 还可以模拟设备的地理位置、时区、语言偏好、是否支持 WebGL 等。这些对于测试依赖地理位置服务或国际化的应用非常重要。网络条件模拟Throttling虽然不是设备硬件属性但 Playwright 可以模拟 2G、3G、4G 等不同的网络速度这对于测试移动端在弱网环境下的表现如图片加载、超时处理极为有用。所有这些模拟都是通过创建一个特定的“设备描述符”Device Descriptor并将其应用于浏览器上下文Browser Context来实现的。一个上下文就像是一个独立的浏览器会话拥有独立的缓存、Cookie 和设置非常适合隔离不同的测试场景。2.2 Playwright 内置设备库与自定义设备Playwright 的一大便利之处在于它内置了一个丰富的设备库。你不需要自己去查每个手机的屏幕尺寸和 UA。通过playwright.devices这个对象你可以轻松获取到数十种主流设备的配置。const { chromium, devices } require(playwright); // 使用内置的 iPhone 13 配置 const iPhone13 devices[iPhone 13]; // 使用内置的 Samsung Galaxy S21 配置 const galaxyS21 devices[Samsung Galaxy S21]; (async () { const browser await chromium.launch({ headless: false }); // 创建模拟 iPhone 13 的上下文 const context await browser.newContext({ ...iPhone13, // 展开设备描述符包含了 viewport, userAgent, isMobile 等属性 }); const page await context.newPage(); await page.goto(https://m.example.com); // ... 你的测试操作 await browser.close(); })();内置设备库非常方便但有时我们需要测试一些特定型号或自定义分辨率的设备。这时我们可以完全手动定义设备描述符const customDevice { name: My Custom Phone, userAgent: Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36, viewport: { width: 412, height: 915, }, deviceScaleFactor: 2.625, // 设备像素比 isMobile: true, hasTouch: true, defaultBrowserType: chromium // 建议指定虽然上下文创建时会覆盖 }; // 使用时 const context await browser.newContext(customDevice);实操心得内置设备库的userAgent和viewport是经过验证的能很好地触发网站的移动端布局。在自定义设备时务必确保isMobile: true和hasTouch: true这两个属性被设置这是 Playwright 启用触摸事件模拟和移动端行为的关键开关。deviceScaleFactor如果不知道可以设为 1但为了更精确的模拟最好查询真实设备的参数。3. 从零搭建移动端自动化测试环境3.1 环境准备与 Playwright 安装Playwright 支持多种语言绑定包括 Node.js、Python、Java 和 .NET。这里我们以最流行的 Node.js 环境为例。首先确保你的系统已经安装了 Node.js建议版本 16 或以上。创建一个新的项目目录并初始化mkdir playwright-mobile-test cd playwright-mobile-test npm init -y接下来安装 Playwright。为了获得最佳体验我推荐安装playwright/test这个测试运行器它集成了 Playwright 库和一个类似 Jest/Mocha 的测试框架开箱即用。npm install --save-dev playwright/test # 同时安装 Playwright 支持的浏览器Chromium, Firefox, WebKit npx playwright installnpx playwright install这个命令会下载 Chromium、Firefox 和 WebKitSafari 内核三个浏览器的二进制文件。这一步可能需要一些时间因为下载的文件体积较大但这是必须的它保证了测试环境的可复现性和一致性。注意事项在某些网络环境下下载浏览器二进制文件可能会很慢或失败。你可以尝试设置镜像源或者使用npx playwright install --dry-run查看需要下载什么然后手动寻找解决方案。如果只测试移动端 Chrome基于 Chromium也可以只安装 Chromiumnpx playwright install chromium。3.2 编写你的第一个移动端测试脚本安装完成后我们来创建一个简单的测试文件。在项目根目录下创建tests/example.spec.js如果你使用 TypeScript可以是.spec.ts。// tests/example.spec.js const { test, expect } require(playwright/test); const { devices } require(playwright); // 使用内置的 iPhone 13 设备进行测试 test.use({ ...devices[iPhone 13], }); test(访问移动端百度首页并检查标题, async ({ page }) { // 导航到页面 await page.goto(https://m.baidu.com); // 断言页面标题包含“百度” await expect(page).toHaveTitle(/百度/); // 截图保存便于查看模拟效果 await page.screenshot({ path: screenshots/baidu-mobile.png, fullPage: true }); // 示例点击搜索框假设其placeholder是“百度一下” const searchBox page.locator(input[placeholder百度一下]); await expect(searchBox).toBeVisible(); await searchBox.click(); // 模拟输入 await page.keyboard.type(Playwright 自动化测试); // 这里可以继续模拟点击搜索按钮等操作 }); // 另一个测试用例模拟横屏模式 test(在横屏模式下测试页面布局, async ({ page }) { // 覆盖默认的 iPhone 13 视口改为横屏 await page.setViewportSize({ width: 844, height: 390 }); // 交换宽高 await page.goto(https://m.example.com); // 断言横屏下某个元素应该可见或不可见 const sideMenu page.locator(#side-menu); // 假设横屏时侧边菜单会隐藏 await expect(sideMenu).toBeHidden(); await page.screenshot({ path: screenshots/landscape.png }); });这个例子展示了两个关键点test.use在文件级别或describe块级别通过test.use可以为该作用域内的所有测试用例应用相同的设备模拟配置。这非常方便。page.setViewportSize你可以在测试过程中动态改变视口大小来测试响应式布局在不同屏幕尺寸下的表现或者模拟设备的横竖屏切换。运行这个测试npx playwright test tests/example.spec.js --headed # 有头模式运行方便观察 # 或者无头模式运行 npx playwright test tests/example.spec.js4. 核心测试场景与高级技巧实战4.1 模拟复杂的触摸手势操作移动端交互的核心是手势。Playwright 提供了底层的page.touchscreenAPI 来模拟精细的触摸操作这对于测试滑动组件、长按菜单、捏合缩放等功能至关重要。场景测试一个图片轮播组件的滑动切换。const { test, expect } require(playwright/test); test.use({ ...devices[Pixel 5], }); test(滑动图片轮播组件, async ({ page }) { await page.goto(https://your-mobile-site.com/gallery); // 定位轮播容器 const carousel page.locator(.carousel-container); await expect(carousel).toBeVisible(); // 获取轮播容器的边界框用于计算滑动坐标 const box await carousel.boundingBox(); // 模拟从右向左滑动查看下一张 // 起始点容器右侧中心 // 结束点容器左侧中心 await page.touchscreen.tap(box.x box.width * 0.8, box.y box.height / 2); // 先轻点激活视情况而定 await page.touchscreen.down(box.x box.width * 0.8, box.y box.height / 2); await page.touchscreen.move(box.x box.width * 0.2, box.y box.height / 2); await page.touchscreen.up(); // 断言滑动后当前激活的图片索引或指示器发生了变化 const activeDot page.locator(.carousel-dot.active); await expect(activeDot).toHaveAttribute(data-index, 1); // 假设切换到第二张 // 也可以使用更高级的 APIpage.dragAndDrop 在某些简单场景下更简便但它本质上是鼠标事件模拟。 });场景模拟双指捏合缩放例如地图或图片查看器。Playwright 没有直接提供pinchAPI但我们可以通过同时模拟两个触摸点来实现。test(模拟地图捏合缩放, async ({ page }) { await page.goto(https://m.map-site.com); const map page.locator(#map); const box await map.boundingBox(); const centerX box.x box.width / 2; const centerY box.y box.height / 2; const offset 50; // 初始两指距离 // 模拟双指张开放大 // 第一根手指从中心点向左上移动 // 第二根手指从中心点向右下移动 const touchPoints [ { x: centerX, y: centerY }, { x: centerX, y: centerY } ]; // Playwright 的 touchscreen API 一次只处理一个点。 // 更复杂的多点触控通常需要评估是否真的需要在自动化测试中覆盖 // 或者考虑使用更专业的工具或直接在真机上测试。 // 一个替代思路如果页面支持鼠标滚轮缩放在模拟移动设备时可能不适用。 // 对于必须测试的复杂手势可能需要与开发约定提供测试专用的编程接口。 });实操心得对于复杂的连续手势如涂鸦page.touchscreenAPI 可能显得有些繁琐。在实际测试中应优先测试业务逻辑的核心交互。如果某个手势有对应的简化交互方式如点击按钮代替长按可以优先采用。将测试重点放在功能正确性上而非完全复刻人类手指的每一个细微动作。4.2 网络与地理位置的模拟移动设备经常处于变化的网络环境中并且会使用地理位置服务。Playwright 可以很好地模拟这些条件。模拟弱网环境test(在慢速3G网络下测试页面加载, async ({ page }) { // 连接到模拟的“慢速3G”网络 const slow3G playwright.network.slow3G; // 注意这是 playwright 根对象下的常量 // 在 playwright/test 中更常用的方式是在配置中设置或在 context 中设置 // 方法1通过 context 设置推荐作用域清晰 const context await browser.newContext({ ...devices[iPhone 13], // 设置网络模拟 offline: false, // 使用预定义的网络配置文件 // 注意playwright.network.slow3G 需要在导入后使用 }); // 更简单的写法在创建 context 后使用 context.setOffline 和 context.setHTTPCredentials 等 // 但对于网络节流通常使用 page.route 或 browserContext.setGeolocation 不直接支持。 // 实际上Playwright Test 提供了 test.slow() 或全局配置来模拟但更直接的是使用 CDP (Chrome DevTools Protocol) const client await page.context().newCDPSession(page); await client.send(Network.emulateNetworkConditions, { offline: false, downloadThroughput: (500 * 1024) / 8, // 500 kbps 转换为 bytes per second uploadThroughput: (500 * 1024) / 8, latency: 400 // ms }); await page.goto(https://m.example.com); // 可以断言在弱网下骨架屏或加载提示是否出现 const loadingIndicator page.locator(.loading); await expect(loadingIndicator).toBeVisible({ timeout: 10000 }); await expect(loadingIndicator).toBeHidden({ timeout: 15000 }); });模拟地理位置test(测试基于地理位置的天气服务, async ({ page, context }) { // 在创建页面或上下文时设置地理位置 await context.setGeolocation({ longitude: 116.397128, latitude: 39.916527 }); // 北京 await page.goto(https://m.weather-service.com); // 页面可能会请求地理位置权限Playwright 可以自动授权 // 在创建 context 时授予权限 const contextWithPermissions await browser.newContext({ ...devices[iPhone 13], permissions: [geolocation], // 授予地理位置权限 geolocation: { longitude: 116.397128, latitude: 39.916527 }, }); const page await contextWithPermissions.newPage(); await page.goto(https://m.weather-service.com); // 断言页面显示的城市是“北京” await expect(page.locator(.current-city)).toHaveText(北京); });4.3 多设备并行测试与配置管理在实际项目中我们通常需要在多种设备上运行相同的测试套件。Playwright Test 可以轻松实现这一点。方法一在playwright.config.js配置文件中定义多个项目Projects。这是最推荐的方式它允许你为每种浏览器/设备组合定义独立的配置并可以并行执行。// playwright.config.js const { devices } require(playwright/test); /** type {import(playwright/test).PlaywrightTestConfig} */ const config { testDir: ./tests, timeout: 30 * 1000, expect: { timeout: 5000 }, fullyParallel: true, // 并行运行测试 forbidOnly: !!process.env.CI, retries: process.env.CI ? 2 : 0, workers: process.env.CI ? 1 : 3, // 并行 worker 数 reporter: html, use: { actionTimeout: 0, trace: on-first-retry, screenshot: only-on-failure, }, projects: [ { name: Mobile Chrome - Pixel 5, use: { browserName: chromium, ...devices[Pixel 5], viewport: { width: 393, height: 851 }, // 可以覆盖内置配置 }, }, { name: Mobile Safari - iPhone 13, use: { browserName: webkit, // Safari 使用 webkit ...devices[iPhone 13], }, }, { name: Mobile Firefox - Galaxy S21, use: { browserName: firefox, ...devices[Samsung Galaxy S21], }, }, // 还可以添加一个桌面端 Chrome 作为对照 { name: Desktop Chrome, use: { browserName: chromium, viewport: { width: 1920, height: 1080 }, }, }, ], }; module.exports config;配置好后运行npx playwright test将会自动并行地在 Pixel 5 (Chrome)、iPhone 13 (Safari)、Galaxy S21 (Firefox) 和桌面 Chrome 上运行所有测试。测试报告会清晰地按项目分开。方法二在测试文件中使用参数化测试。如果你只想在少数几个设备上运行某个特定的测试套件可以使用参数化。// tests/responsive.spec.js const { test, expect } require(playwright/test); const devicesToTest [ { name: iPhone SE, device: devices[iPhone SE] }, { name: Pixel 5, device: devices[Pixel 5] }, { name: iPad Pro 11, device: devices[iPad Pro 11] }, // 平板 ]; for (const device of devicesToTest) { test.describe(响应式测试 - ${device.name}, () { test.use({ ...device.device }); test(导航栏在小屏幕上应折叠, async ({ page }) { await page.goto(https://your-site.com); const navMenu page.locator(.desktop-nav); const hamburgerButton page.locator(.hamburger-btn); // 在移动设备上桌面导航栏应隐藏汉堡按钮应显示 await expect(navMenu).toBeHidden(); await expect(hamburgerButton).toBeVisible(); }); test(点击汉堡按钮应展开菜单, async ({ page }) { await page.goto(https://your-site.com); await page.locator(.hamburger-btn).click(); await expect(page.locator(.mobile-nav-menu)).toBeVisible(); }); }); }5. 常见问题、调试技巧与最佳实践5.1 问题排查实录即使准备充分在编写和运行移动端测试时也会遇到各种问题。下面是一些常见问题及其解决方案。问题现象可能原因排查步骤与解决方案页面没有加载移动端样式1. 设备模拟未生效isMobile或userAgent设置错误。2. 网站使用 JavaScript 进行设备检测而 Playwright 的模拟被其识别。1. 在脚本开头打印page.evaluate(() navigator.userAgent)和page.evaluate(() window.innerWidth)确认 UA 和视口已更改。2. 使用 Playwright 的page.route拦截并修改初始 HTML 或 JS 请求或尝试使用--user-agent启动参数。但更常见的是网站检测逻辑过于复杂可能需要与开发沟通简化测试环境的检测。触摸点击没有反应1. 元素定位不准点击到了别处。2. 元素是动态加载的点击时还未就绪。3. 页面有弹窗、遮罩层覆盖。1. 使用playwright inspector(npx playwright test --debug) 或page.pause()暂停页面检查定位器。2. 在点击前增加等待await element.waitFor({ state: attached })或使用await page.click(selector, { timeout: 5000 })。3. 使用page.locator(selector).click({ force: true })强制点击不推荐为首选。4. 检查是否有hasTouch: true。截图或录屏中浏览器不是移动设备样式测试在headed模式下运行操作系统窗口管理器显示了浏览器边框和工具栏。1. 这是正常的。模拟发生在浏览器内部外部窗口样式不变。要查看纯内容截图请使用page.screenshot()。2. 如果想在无头模式下获得更“干净”的视图确保使用headless: true默认。测试在 CI/CD 环境中失败本地却成功1. CI 环境缺少依赖或浏览器未正确安装。2. CI 机器性能差超时时间不足。3. 网络环境差异。1. 在 CI 配置中确保运行了npx playwright install --with-deps安装浏览器和系统依赖。2. 增加全局timeout和expect超时时间。3. 对网络请求使用更稳健的等待策略如await page.waitForLoadState(networkidle)。无法处理地理位置权限弹窗权限弹窗非网页内容属于浏览器 UIPlaywright 默认无法自动处理。在创建浏览器上下文时通过permissions参数预先授予权限如前文地理位置示例所示这样可以避免弹窗出现。5.2 调试技巧Playwright Inspector 与 Trace ViewerPlaywright Inspector是一个强大的 GUI 工具可以实时调试测试脚本。运行npx playwright test --debug会以调试模式运行测试并打开 Inspector。在 Inspector 中你可以逐步执行单步运行每一条 Playwright 命令。查看页面实时看到被测试页面的状态。拾取元素点击“Pick locator”按钮然后在页面中点击元素会自动生成定位器代码。查看动作日志所有执行过的操作都会记录。Trace Viewer用于查看测试运行的详细记录对于分析在 CI 上失败的测试尤其有用。首先在配置中启用 trace// playwright.config.js use: { trace: on-first-retry, // 仅在第一次重试时记录节省资源 // 或 on (始终记录), off, retain-on-failure (仅在失败时保留) }测试运行后会生成一个trace.zip文件。使用命令查看npx playwright show-trace trace.zip在 Trace Viewer 中你可以像看视频一样回放整个测试过程查看每个时刻的 DOM 快照、控制台日志、网络请求和 Playwright 操作是定位问题的终极利器。5.3 移动端自动化测试最佳实践优先选择稳定的定位器移动端 DOM 结构可能变化频繁。优先使用>

相关新闻

Python3数据类型转换全解析:从基础到高级技巧

Python3数据类型转换全解析:从基础到高级技巧

1. Python3数据类型转换基础概念 在Python编程中,数据类型转换是每个开发者必须掌握的核心技能。简单来说,数据类型转换就是将数据从一种类型转换为另一种类型的过程。Python作为动态类型语言,虽然不需要显式声明变量类型,但在实际…

2026/8/5 9:34:07 阅读更多 →
毕业答辩与论文降重实战指南:从技术准备到临场应对

毕业答辩与论文降重实战指南:从技术准备到临场应对

1. 项目概述:从“交作业”到“秀肌肉”的最后一公里 又到一年毕业季,对于绝大多数本科生和研究生来说,毕业设计(论文)答辩和查重降重,是学生时代最后、也是最关键的两道关卡。很多人把这两件事看作是“交作…

2026/8/5 9:34:07 阅读更多 →
天赐范式第125天:技术协议v0.1的自指验证——当框架分析“自己“时,τ等于多少?

天赐范式第125天:技术协议v0.1的自指验证——当框架分析“自己“时,τ等于多少?

天赐范式第125天(第二篇):技术协议v0.1的自指验证——当框架分析"自己"时,τ等于多少?副标题:一个能分析自指系统的框架,能不能分析自己?📌 本文是天赐范式系列…

2026/8/5 9:34:07 阅读更多 →

最新新闻

Bevy 0.14 窗口纯黑问题排查:Camera2d 只是标记组件,spawn(Camera2d) 不会创建相机

Bevy 0.14 窗口纯黑问题排查:Camera2d 只是标记组件,spawn(Camera2d) 不会创建相机

一、问题现象:窗口纯黑但程序正常运行在使用 Bevy 0.14.2 avian2d 0.1.2 开发 2D 物理演示时,你可能会遇到一个令人困惑的现象:窗口弹出后整个画面纯黑,连设置好的深灰背景 ClearColor(Color::srgb(0.10, 0.10, 0.12)) 都没有显示…

2026/8/5 10:06:18 阅读更多 →
2026年8月:Codex、Plus、Pro进入模型迁移期——为什么Agent系统不能把模型名写死?

2026年8月:Codex、Plus、Pro进入模型迁移期——为什么Agent系统不能把模型名写死?

2026年8月31日,使用ChatGPT账号登录Codex的用户,将无法继续选择GPT-5.4和GPT-5.4 mini。对应的推荐迁移关系是:GPT-5.4 → GPT-5.6 Terra GPT-5.4 mini → GPT-5.6 Luna表面看,这只是一次模型更新:打开设置&#…

2026/8/5 10:06:18 阅读更多 →
绝区零自动化终极方案:3步搞定游戏日常与战斗全自动

绝区零自动化终极方案:3步搞定游戏日常与战斗全自动

绝区零自动化终极方案:3步搞定游戏日常与战斗全自动 【免费下载链接】ZenlessZoneZero-OneDragon 绝区零 一条龙 | 全自动 | 自动闪避 | 自动每日 | 自动空洞 | 支持手柄 项目地址: https://gitcode.com/gh_mirrors/ze/ZenlessZoneZero-OneDragon 你是否每天…

2026/8/5 10:06:18 阅读更多 →
Vue+SpringBoot民宿管理系统开发实战与架构解析

Vue+SpringBoot民宿管理系统开发实战与架构解析

1. 项目概述:民宿旅游管理系统的技术架构与核心价值这个基于VueSpringBoot的民宿服务一体化系统,本质上是一个面向中小型民宿业主的智能化运营管理平台。我在实际开发这类系统时发现,传统民宿管理往往面临几个痛点:手工登记易出错…

2026/8/5 10:06:18 阅读更多 →
如何在Blender中无缝导入导出虚幻引擎PSK/PSA文件:游戏开发者的终极指南

如何在Blender中无缝导入导出虚幻引擎PSK/PSA文件:游戏开发者的终极指南

如何在Blender中无缝导入导出虚幻引擎PSK/PSA文件:游戏开发者的终极指南 【免费下载链接】io_scene_psk_psa A Blender extension for importing and exporting Unreal PSK and PSA files 项目地址: https://gitcode.com/gh_mirrors/io/io_scene_psk_psa 你是…

2026/8/5 10:06:18 阅读更多 →
3分钟掌握:免费本地视频字幕提取终极指南

3分钟掌握:免费本地视频字幕提取终极指南

3分钟掌握:免费本地视频字幕提取终极指南 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含字幕区域检测、字幕内容提取。A GUI…

2026/8/5 10:05:18 阅读更多 →

日新闻

Java缓存框架:JetCache

Java缓存框架:JetCache

TOC 一、简介 JetCache 是一个 Java 缓存抽象框架,为不同的缓存解决方案提供了统一的使用方式。 它提供的注解比 Spring Cache 更加强大。 JetCache 的注解支持原生 TTL、两级缓存以及在分布式环境中的自动刷新功能,同时你也可以通过代码直接操作 Cach…

2026/8/5 0:00:43 阅读更多 →
AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

需求:通孔焊盘 十字花;过孔 Via 实心直连;贴片焊盘按需设置 AD 测试版本AD24 很多工程师踩坑:全部统一十字,导致接地过孔阻抗高、大电流发热! 一、快捷键打开规则 PCB 界面按下:D R 展开…

2026/8/5 0:00:43 阅读更多 →
AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

更多请点击: https://kaifayun.com 第一章:AI生成素描效果 AI生成素描效果是计算机视觉与风格迁移技术融合的典型应用,其核心在于将彩色照片或RGB图像转换为具有手绘质感、明暗对比强烈、边缘清晰的单色素描图像。该过程通常依赖于深度学习模…

2026/8/5 0:00:43 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/4 13:24:41 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/4 11:41:39 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/4 13:38:24 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/4 11:09:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/4 13:38:40 阅读更多 →