当前位置: 首页 > news >正文

DrissionPage移动端自动化:从H5到原生App的跨界测试

一、移动端自动化测试的挑战与机遇

移动端测试面临多维度挑战:

  • 设备碎片化:Android/iOS版本、屏幕分辨率差异

  • 混合应用架构:H5页面与原生组件的深度耦合

  • 交互复杂性:多点触控、手势操作、传感器模拟

  • 性能监控:内存泄漏、CPU占用率、帧率稳定性


二、DrissionPage在移动端的核心能力

2.1 H5页面测试优势

  • 无驱化浏览器控制:无需额外WebDriver

  • 跨平台一致性:统一API处理iOS/Android的WebView

  • 混合模式支持:HTTP请求与浏览器操作无缝切换

2.2 原生App测试扩展

需结合Appium等工具实现完整移动端支持:

mermaid:

graph TD
A[DrissionPage] --> B{测试类型}
B -->|H5页面| C[直接操作WebView]
B -->|原生组件| D[集成Appium]
D --> E[设备控制]
D --> F[原生API调用]

三、H5页面自动化测试实战

3.1 基础配置

from DrissionPage import WebPage# 模拟移动端浏览器
mobile_emulation = {"deviceName": "iPhone 12 Pro"
}
page = WebPage(chromium_options={'mobile_emulation': mobile_emulation})# 设置视口大小
page.set.window_size(390, 844)  # iPhone 12 Pro分辨率

3.2 页面操作示例

# 访问H5页面
page.get('https://m.example.com')# 处理移动端下拉刷新
page.touch.scroll(direction='down', distance=200)# 点击元素(兼容触摸事件)
page.ele('#menu').touch.click()# 输入文本
search = page.ele('@placeholder=搜索')
search.touch.input('自动化测试')

3.3 高级手势支持

# 滑动操作
page.touch.swipe(start_x=100, start_y=500, end_x=100, end_y=100)# 双指缩放
page.touch.pinch(scale=0.5, x=200, y=300)# 长按操作
page.ele('.item').touch.long_press(duration=2000)

四、原生App测试集成方案

4.1 环境准备

组件配置要求
Appium2.0+
ADB ToolsAndroid SDK Platform-Tools
XcodeiOS测试需安装

4.2 跨工具协同架构

from appium import webdriver
from DrissionPage import SessionPage# 启动Appium会话
appium_driver = webdriver.Remote('http://localhost:4723/wd/hub',desired_capabilities={'platformName': 'Android','deviceName': 'emulator-5554','app': '/path/to/app.apk'}
)# 在原生App中打开WebView
appium_driver.switch_to.context('WEBVIEW_com.example')# 切换至DrissionPage操作H5
page = SessionPage(driver=appium_driver)
page.ele('#web_btn').click()

五、跨界测试策略

5.1 混合应用测试流程

mermaid:

sequenceDiagramparticipant T as 测试脚本participant A as Appiumparticipant D as DrissionPageT->>A: 启动原生AppA->>D: 进入WebView上下文D->>T: 操作H5页面T->>A: 切换回原生环境A->>T: 验证原生组件

5.2 数据共享示例

# 从原生App获取设备信息
device_info = appium_driver.get_device_info()# 在H5页面注入设备数据
js = f"localStorage.setItem('deviceId', '{device_info['id']}')"
page.run_js(js)# 回传H5数据到原生环境
h5_data = page.ele('#data').text
appium_driver.execute_script('mobile:setData', {'data': h5_data})

六、高级技巧与最佳实践

6.1 性能监控

# 获取WebView性能指标
metrics = page.get_performance_metrics()
print(f'JS内存占用: {metrics["jsHeapUsedSize"]} KB')# 原生App性能分析
appium_driver.get_performance_data('com.example', 'cpuinfo', 5)

6.2 异常处理

from selenium.common.exceptions import NoSuchElementExceptiontry:page.ele('@id=unstable_element').click()
except NoSuchElementException:page.refresh()page.wait.ele_loaded('@id=unstable_element', timeout=10).click()

6.3 云真机集成

# 使用Sauce Labs云平台
caps = {'platformName': 'iOS','app': 'storage:filename=app.zip','deviceName': 'iPhone 14 Simulator'
}driver = webdriver.Remote('https://ondemand.us-west-1.saucelabs.com/wd/hub',caps
)

七、企业级解决方案

7.1 设备集群管理

# docker-compose.yml片段
services:appium-server:image: appium/appiumports:- "4723:4723"volumes:- /dev/bus/usb:/dev/bus/usb  # Android真机连接drissionpage-worker:image: python:3.9command: python test_suite.pydepends_on:- appium-server

7.2 持续集成流水线

// Jenkins Pipeline示例
pipeline {agent anystages {stage('Parallel Tests') {parallel {stage('Android Test') {steps {sh 'python android_suite.py'}}stage('iOS Test') {steps {sh 'python ios_suite.py'}}}}}post {always {junit '**/test-reports/*.xml'}}
}

八、常见问题与解决方案

问题现象原因分析解决方案
WebView无法识别上下文切换失败使用driver.switch_to.context('WEBVIEW')
手势操作不生效触摸坐标计算错误使用元素中心点坐标进行定位
混合应用数据不同步原生与H5环境隔离通过LocalStorage或自定义协议同步数据
真机测试连接失败USB调试未开启执行adb devices确认设备授权
iOS WebView响应慢JavaScript执行限制禁用Safari的JIT限制:settings['jit']=False

九、总结与展望

通过DrissionPage与Appium的深度整合,我们实现了:

  • 无缝跨界测试:H5与原生组件的统一操作

  • 效率提升:减少工具切换带来的时间损耗

  • 成本优化:复用Web自动化技能到移动端

未来方向

  • 深度集成设备管理平台

  • 强化AI元素定位能力

  • 支持AR/VR场景测试

示例项目地址:https://github.com/drissionpage/mobile-demo
扩展阅读:《跨平台自动化测试架构设计》


下期预告:《智能测试:当AI遇上自动化脚本生成》

相关文章:

DrissionPage移动端自动化:从H5到原生App的跨界测试

一、移动端自动化测试的挑战与机遇 移动端测试面临多维度挑战: 设备碎片化:Android/iOS版本、屏幕分辨率差异 混合应用架构:H5页面与原生组件的深度耦合 交互复杂性:多点触控、手势操作、传感器模拟 性能监控:内存…...

ARM 汇编启动代码详解:从中断向量表到中断处理

ARM 汇编启动代码详解:从中断向量表到中断处理 引言 在嵌入式系统开发中,ARM 处理器(如 Cortex-A 系列)的启动代码是系统初始化和运行的基础。启动代码通常包括中断向量表的创建、初始化硬件状态(如关闭缓存和 MMU&a…...

笔试专题(七)

文章目录 乒乓球筐(哈希)题解代码 组队竞赛题解代码 删除相邻数字的最大分数(线性dp)题解代码 乒乓球筐(哈希) 题目链接 题解 1. 两个哈希表 先统计第一个字符串中的字符个数,再统计第二个字…...

React基础知识(一)

文章目录 概念特点React基本使用hello_react案例虚拟DOM的两种创建方式使用jsx创建使用js创建 虚拟DOM和真实DOM React jsxXMLjsx语法规则作用基本语法规则js语句和js代码babel.js作用 模块与组件模块组件 React面向组件编程函数式组件类组件 概念 react是一个将数据渲染为Htm…...

红黑树(Red-Black Tree)核心知识点与面试高频问题

红黑树(Red-Black Tree)核心知识点与面试高频问题 一、红黑树的核心性质 红黑树是一种自平衡的二叉搜索树,通过以下规则确保平衡性: 节点颜色:每个节点是红色或黑色。 根节点:根必须是黑色。 叶子节点&a…...

SpringBoot整合SSM

一、SpringBoot整合SSM SpringBoot整合SpringSpringBoot整合SpringMVCSpringBoot整合MyBatis&#xff08;主要&#xff09; 步骤一&#xff1a;创建SpringBoot工程&#xff0c;添加druid依赖 <!-- todo 1 添加druid连接池依赖--> <dependency><groupId>co…...

set/multiset容器

1.概念 所有元素会在插入时自动排序 set/multiset属于关联式容器&#xff0c;底层结构是用二叉树实现。 set不允许重复元素&#xff0c;multiset允许重复元素。 2. set构造和赋值 set<T> st; set(const set &st);// 拷贝构造函数 set& operator(const set &a…...

vim 编辑器 使用教程

Vim是一款强大的文本&#xff08;代码&#xff09;编辑器&#xff0c;它是由Bram Moolenaar于1991年开发完成。它的前身是Bill Joy开发的vi。名字的意义是Vi IMproved。 打开vim&#xff0c;直接在命令行输入vim即可&#xff0c;或者vim <filename>. Vim分为四种模式&a…...

去中心化固定利率协议

核心机制与分类 协议类型&#xff1a; 借贷协议&#xff08;如Yield、Notional&#xff09;&#xff1a;通过零息债券模型&#xff08;如fyDai、fCash&#xff09;锁定固定利率。 收益聚合器&#xff08;如Saffron、BarnBridge&#xff09;&#xff1a;通过风险分级或博弈论…...

Python高阶函数-filter

1. 基本概念 filter() 是Python内置的高阶函数&#xff0c;用于过滤序列中的元素。它接收一个函数和一个可迭代对象作为参数&#xff0c;返回一个迭代器&#xff0c;包含使函数返回True的所有元素。 filter(function, iterable)2. 工作原理 惰性计算&#xff1a;filter对象是…...

hive/doris查询表的创建和更新时间

hive查询表的创建和更新时间&#xff1a; SELECT d.NAME AS database_name, t.TBL_NAME AS table_name, FROM_UNIXTIME(t.CREATE_TIME) AS create_time, FROM_UNIXTIME(tp.PARAM_VALUE) AS last_ddl_time FROM metastore.TBLS t JOIN metastore.DBS d ON t.DB_ID d.DB_ID JOIN…...

40常用控件_WindowFrame的影响

window frame 的影响 如果 widget 作为一个窗口(带有标题栏,最小化,最大化,关闭按钮),那么在计算尺寸和坐标的 时候就有两种算法.包含 window frame 和 不包含 window frame. 其中x(),y0,frameGeometry(), pos(),move() 都是按照包含 window frame 的方式来计算 的. 其中 geome…...

PCB 赋能机器人技术革新:核心功能与前沿趋势

一、智能控制中枢的异构集成 采用 20 层刚挠结合板架构&#xff0c;搭载 NVIDIA Jetson AGX Orin SoC&#xff08;100TOPS 算力&#xff09;&#xff0c;集成 64 位 ARMv8 内核与 32GB 内存&#xff0c;实现多模态传感器数据融合与实时决策。板载 128MB DDR4 缓存支持 μs 级响…...

unity 环形UI菜单实现方法2

在项目中需要一个环形UI并且循环往复的效果&#xff0c;这个方法思路为提前预设好位置&#xff0c;让UI根据坐标预设的移动&#xff0c;然后使用mask遮罩达到循环往复效果的目的。 下图分别分为了三个列表 第一个列表poslist是提前预设的位置 第二个列表为背景暂时不用看 第三个…...

Redis进阶--主从复制

目录 一、引言 二、介绍 三、解决问题 四、配置主从复制 1.复制 全量复制&#xff1a; 部分复制&#xff1a; 实时复制&#xff1a; 五、总结 一、引言 本篇文章将继续介绍Redis中的主从复制机制 二、介绍 主从复制是在分布式系统中实现的&#xff0c;希望有多个服务器…...

Redisson分布式锁:原理、使用

1. Redisson简介 Redisson是一个基于Redis的Java客户端库&#xff0c;提供了丰富的分布式对象和服务&#xff08;如分布式锁、信号量、Map等&#xff09;。其核心优势在于​​简化分布式锁的实现​​&#xff0c;并解决了原生Redis分布式锁的常见问题&#xff08;如死锁、误删…...

Java设计模式之外观、享元、组合模式《三国争霸:模式风云录》

第一章&#xff1a;乱世起&#xff08;外观初现&#xff09; 黄巾余孽张角三兄弟操控"混沌子系统"&#xff0c;各地流民不堪996劳役。观国隐士诸葛孔明出山&#xff0c;在博望坡构建首个"军师智脑"&#xff1a; /​**​* 外观模式&#xff1a;军师智…...

设计模式之解释器模式:原理、实现与应用

引言 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一种语言的文法表示&#xff0c;并提供一个解释器来解释该语言中的句子。解释器模式适用于需要解析特定语法规则的场景&#xff0c;如正则表达式、SQL解析等。本文将深入…...

redis itheima

缓存问题 核心是如何避免大量请求到达数据库 缓存穿透 既不存在于 redis&#xff0c;也不存在于 mysql 的key&#xff0c;被重复请求 public Result queryById(Long id) {String key CACHE_SHOP_KEYid;// 1. redis & mysqlString shopJson stringRedisTemplate.opsFo…...

AF3 OpenFoldDataModule类setup方法解读

AlphaFold3 data_modules 模块的 OpenFoldDataLoader 类 setup 方法用于设置数据集的关键部分,负责根据不同的模式(训练、验证或预测)生成和初始化相应的数据集。 源代码: def setup(self, stage=None):# Most of the arguments are the same for the three datasets data…...

服务器报错:xxx/libc.so.6: version `GLIBC_2.32‘ not found

/lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.32 not found (required by ./aima-sim-app-main) 解决思路 根据错误信息&#xff0c;您的应用程序 aima-sim-app-main 和 libmujoco.so.3.1.6 库依赖于较新的 GNU C Library (glibc) 版本&#xff08;如 GLIBC_2.32, GLIBC…...

FPGA状态机设计:流水灯实现、Modelsim仿真、HDLBits练习

一、状态机思想 1.概念 状态机&#xff08;Finite State Machine, FSM&#xff09;是计算机科学和工程领域中的一种抽象模型&#xff0c;用于描述系统在不同状态之间的转换逻辑。其核心思想是将复杂的行为拆解为有限的状态&#xff0c;并通过事件触发状态间的转移。 2.状态机…...

机试题——最少乘坐公交次数

题目描述 春节将近&#xff0c;小明想在节日期间逛一逛城里的 ( N ) 个著名景点。所有景点都能通过坐公交到达。需要设计一种公交路线方案&#xff0c;让小明能最快地逛完所有景点。 输入描述 第一行&#xff1a;一个整数 ( N )&#xff0c;表示景点数量&#xff0c;满足 ( …...

防孤岛保护装置在分布式光伏并网中的应用

什么是光伏的“孤岛效应” 孤岛islanding 包含负荷和电源的部分电网&#xff0c;从主网脱离后继续孤立运行的状态。孤岛可分为非计划性孤岛和计划性孤岛。 孤岛效应的危害 当电网侧停电检修&#xff0c;若并网光伏电站的逆变器仍在继续供电&#xff0c;维修人员不一定…...

记一次gitlab服务器负载过高问题处理

服务器上进程 /var/opt/gitlab/gitlab-rails/etc/unicorn.rb /opt/gitlab/embedded/service/gitlab-rails/config.ru 进程服务器cpu占用过高应该怎么处理 tail -f /var/log/gitlab/gitlab-rails/production.log调整 Unicorn 配置&#xff1a;unicorn.rb 是 Unicorn 服务器的配…...

LiT and Lean: Distilling Listwise Rerankers intoEncoder-Decoder Models

文章&#xff1a;ECIR 2025会议 一、动机 背景&#xff1a;利用LLMs强大的能力&#xff0c;将一个查询&#xff08;query&#xff09;和一组候选段落作为输入&#xff0c;整体考虑这些段落的相关性&#xff0c;并对它们进行排序。 先前的研究基础上进行扩展 [14,15]&#xff0c…...

【项目日记】高并发服务器项目总结

生活总是让我们遍体鳞伤&#xff0c; 但到后来&#xff0c; 那些受伤的地方一定会变成我们最强壮的地方。 -- 《老人与海》-- 高并发服务器项目总结 模块关系图项目工具模块缓冲区模块通用类型模块套接字socket模块信道Channel模块多路转接Poller模块 Reactor模块时间轮Tim…...

P1332 血色先锋队(BFS)

题目背景 巫妖王的天灾军团终于卷土重来&#xff0c;血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团&#xff0c;以及一切沾有亡灵气息的生物。孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重包围&#xff0c;现在他们将主力只好聚集了起来&#xff0c;以抵…...

systemd 与 SysVinit

1. 什么是 systemd 和 SysVinit&#xff1f; systemd 和 SysVinit 都是 Linux 的初始化系统&#xff08;init system&#xff09;&#xff0c;用于管理系统启动、服务、进程和日志。 比较项SysVinitsystemd启动方式逐步启动&#xff08;串行&#xff09;并行启动&#xff08;…...

PythonWeb项目-Django+vue白酒数据推荐系统功能介绍

❥(^_-) 上千个精美定制模板,各类成品Java、Python、PHP、Android毕设项目,欢迎咨询。 ❥(^_-) 程序开发、技术解答、代码讲解、文档,💖文末获取源码+数据库+文档💖 💖软件下载 | 实战案例 💖文章底部二维码,可以联系获取软件下载链接,及项目演示视频。 本项目源…...

AWS Bedrock:开启企业级生成式AI的钥匙【深度解析】

引言&#xff1a;生成式AI的工业革命需要新基建 根据Gartner预测&#xff0c;到2026年超过80%的企业将在生产环境中部署生成式AI。而AWS Bedrock作为首个企业级生成式AI托管平台&#xff0c;正在重塑AI工业化落地的技术范式。本文将深入解构其技术架构与商业价值。 一、Bedroc…...

网络安全应急响应-文件痕迹排查

在Windows系统的网络安全应急响应中&#xff0c;文件痕迹排查是识别攻击行为的关键步骤。以下是针对敏感目录的详细排查指南及扩展建议&#xff1a; 1. 临时目录排查&#xff08;Temp/Tmp&#xff09; 路径示例&#xff1a; C:\Windows\TempC:\Users\<用户名>\AppData\L…...

【玩转全栈】—— Django 连接 vue3 保姆级教程,前后端分离式项目2025年4月最新!!!

本文基于之前的一个旅游网站&#xff0c;实现 Django 连接 vue3&#xff0c;使 vue3 能携带 CSRF Token 发送 axios 请求给后端&#xff0c;后端再响应数据给前端。想要源码直接滑倒底部。 目录 实现效果 解决跨域 获取 csrf-token 什么是 csrf-token &#xff1f; CSRF攻击的…...

网络安全·第一天·IP协议安全分析

本篇博客讲述的是网络安全中一些协议缺陷以及相应的理论知识&#xff0c;本博主尽可能讲明白其中的一些原理以及对应的防卫措施。 学习考研408的同学也能进来看看&#xff0c;或许对考研有些许帮助&#xff08;按照考研现在的趋势&#xff0c;年年都有新题目&#xff0c;本文当…...

TensorFlow深度学习实战——字符嵌入、子词嵌入、句子嵌入和段落嵌入

TensorFlow深度学习实战——字符嵌入、子词嵌入、句子嵌入和段落嵌入 0. 前言1. 字符嵌入2. 字词嵌入3. 句子嵌入和段落嵌入相关链接 0. 前言 在自然语言处理中&#xff0c;嵌入 (Embedding) 技术是将文本转化为数值向量的核心方法&#xff0c;使计算机能够理解和处理语言中的…...

剖析AI与5G:是夸大其词,还是时代变革的引擎?-优雅草卓伊凡

剖析AI与5G&#xff1a;是夸大其词&#xff0c;还是时代变革的引擎&#xff1f;-优雅草卓伊凡 在当今科技飞速发展的时代&#xff0c;AI与5G无疑是两大备受瞩目的焦点。近日&#xff0c;一个引人深思的问题浮出水面&#xff1a;“AI是不是被夸大了&#xff0c;就像当年的5G一样…...

Python Cookbook-5.7 在增加元素时保持序列的顺序

任务 你需要维护一个序列&#xff0c;这个序列不断地有新元素加入&#xff0c;但始终处于排序完毕的状态这样你可以在任何需要的时候检查或者删除当前序列中最小的元素。 解决方案 假设有一个未排序的列表&#xff0c;比如: the_list [903, 10, 35, 69, 933, 485, 519, 37…...

Ubuntu18系统安装

1、虚拟机安装 请参照之前的《虚拟机安装centos7-NAT网络模式安装》与《虚拟机安装centos7-桥接模式》 2、启动虚拟机进入系统的欢迎界面 选择English后并点击回车键(Enter) 3、进入安装页面 选择Countinue without updating并点击回车键(Enter) 4、键盘配置 选择Done并点击…...

【AIGC】零样本学习方法综述(TPAMI 2023 研究综述)

出版日期为2022年7月18日&#xff1b;工作由国家自然科学基金资助6217616年6061732011和61976141&#xff0c;部分由广东基础和应用基础研究基金资助2022A1515010791&#xff0c;部分由深圳大学自然科学基金会稳定支持计划资助号20200804193857002&#xff0c;部分由SZU的跨学科…...

Redis持久化之AOF

AOF&#xff08;Append Only File&#xff09;持久化&#xff1a;以独立日志的方式记录每次写命令&#xff0c;重启时再重新执行AOF文件中的命令达到恢复数据的目的。AOF的主要作用解决了数据持久化的实时性。 1.使用AOF 开启AOF需要设置配置文件&#xff1a; appendonly yes…...

QT6(12)3.3.1 Qt元对象系统概述:QObject 类与 QMetaObject 类,类型转换 qobject_cast<T>()。

&#xff08;33&#xff09;Qt元对象系统概述&#xff1a; QObject 类&#xff1a; 以及&#xff1a; 老师带咱们学生测试一下&#xff1a; 谢谢老师 &#xff08;34&#xff09;类型转换 qobject_cast( ) &#xff1a; 来自 一言的教导&#xff1a; &#xff08;35&#x…...

Electron使用WebAssembly实现CRC-32 STM32校验

Electron使用WebAssembly实现CRC-32 STM32校验 将C/C语言代码&#xff0c;经由WebAssembly编译为库函数&#xff0c;可以在JS语言环境进行调用。这里介绍在Electron工具环境使用WebAssembly调用CRC-32 STM32格式校验的方式。 CRC-32 STM32校验函数WebAssembly源文件 C语言实…...

C++11QT复习 (十五)

文章目录 Day10 标准模板库学习笔记&#xff08;2025.04.02&#xff09;一、函数和数组能否放入 STL 容器&#xff1f;1. 引用不能直接作为容器元素类型✅ 推荐做法&#xff1a;使用 std::reference_wrapper<T> 2. 函数不能直接作为容器元素类型✅ 推荐做法一&#xff1a…...

文件存储的路径简单分析

filename file_pic.filename pic /static/img/filename # 将文件的名称存储在数据库中&#xff0c;方便调取 p_file os.path.join(/home/enen/ee/static/img, filename) file_pic.save(p_file) # 保存文件到指定目录&#xff0c;具体项目是要根据项目的存储地址来看的…...

汽车与航空航天领域软件维护:深度剖析与未来展望

一、引言 在当今科技飞速发展的时代&#xff0c;汽车和航空航天领域的软件应用愈发广泛和深入&#xff0c;软件已成为这些行业系统的核心组成部分。从汽车的智能驾驶辅助系统到航空航天飞行器的飞行控制软件&#xff0c;软件的可靠性、安全性直接关系到整个系统的正常运行和人…...

吉利汽车采用 EMQX 与AutoMQ联合方案构建公私有云一体化的车联网核心架构

吉利汽车集团 数字化基础架构总工程师 洪旅杭 关于吉利汽车 吉利汽车集团在中国上海、宁波、以及海外等地建有造型设计和工程研发中心&#xff0c;研发实力雄厚。在中国、马来西亚建有世界一流的现代化整车和动力总成制造工厂&#xff0c;拥有各类销售网点超过 1400 多家&…...

深圳漫云科技户外公园实景儿童剧本杀小程序:开启亲子互动新纪元

在亲子娱乐需求日益增长的当下&#xff0c;深圳漫云科技推出的户外公园实景儿童剧本杀小程序&#xff0c;凭借其创新玩法与丰富功能&#xff0c;为亲子家庭带来全新体验。该小程序融合户外探险、角色扮演与逻辑推理&#xff0c;不仅满足孩子好奇心&#xff0c;更提升其思维能力…...

如何实现H5端对接钉钉登录并优雅扩展其他平台

如何实现H5端对接钉钉登录并优雅扩展其他平台 钉钉H5登录逻辑后端代码如何实现&#xff1f;本次采用策略模式工厂方式进行定义接口确定会使用的基本鉴权步骤具体逻辑类进行实现采用注册表模式&#xff08;Registry Pattern&#xff09;抽象工厂进行基本逻辑定义具体工厂进行对接…...

借助 AI 工具使用 Python 实现北京市店铺分布地理信息可视化教程

一、项目概述 本项目通过 Python 的pyecharts库&#xff0c;结合 AI 工具辅助代码编写与逻辑梳理&#xff0c;实现北京市店铺数量分布及区域连线的地理信息可视化&#xff0c;最终生成交互式地图图表。 二、准备工作 1. 环境与工具 Python 环境&#xff1a;确保已安装 Pyth…...

如何选择优质的安全工具柜:材质、结构与功能的考量

在工业生产和实验室环境中&#xff0c;安全工具柜是必不可少的设备。它不仅承担着工具的存储任务&#xff0c;还直接影响工作环境的安全和效率。那么&#xff0c;如何选择一个优质的安全工具柜呢&#xff1f;关键在于对材质、结构和功能的考量。 01材质&#xff1a;耐用与防腐 …...