三、UI自动化测试03--操作方法API
目录
- 一、元素操作⽅法
- 二、浏览器操作⽅法
- 1. Part1: 设置最⼤化/⼤⼩/位置
- 扩展: Web/APP 项⽬⻚⾯布局坐标系示意
- 2. Part2: 后退/前进/刷新
- 3. Part3: 关闭/退出/获取⻚⾯标题和 URL 地址
- 三、获取元素信息⽅法
- 1. Part1: 获取⼤⼩/⽂本/属性值
- 2. Part2: 判断元素是否可⻅/可⽤/可选中
- 四、鼠标操作
- 1. 右键单击[了解]
- 2. 左键双击[了解]
- 3. 拖拽操作[了解]
- 4. 悬停操作[重点]
- 五、键盘操作
- 1. 案例实现
- 六、元素等待
- 1. 隐式等待
- 案例实现
- 2. 显式等待
- 案例实现
- 3. 隐式等待和显示等待的对⽐
一、元素操作⽅法
- 需求:打开注册A⻚⾯,完成以下操作
- 1).通过脚本执⾏输⼊⽤户名:admin;密码:123456;电话号码:18611111111;电⼦邮件:123@qq.com
- 2).间隔3秒,修改电话号码为:18600000000
# 1. 导⼊模块
from time import sleepfrom selenium import webdriver# 2. 实例化浏览器对象
driver = webdriver.Chrome()
# 3. 打开⻚⾯
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 需求:打开注册A⻚⾯,完成以下操作
# 1).通过脚本执⾏输⼊⽤户名:admin;密码:123456;电话号码:18611111111;电⼦邮件:123@qq.com
driver.find_element_by_id('userA').send_keys('admin')
driver.find_element_by_id('passwordA').send_keys('123456')
tel = driver.find_element_by_id('telA')
tel.send_keys('18611111111')
driver.find_element_by_name('emailA').send_keys('123@qq.com')# 2).间隔3秒,修改电话号码为:18600000000
# 注意: 在使⽤操作中, ⼀般对于输⼊框元素, 都要先执⾏清空, 再执⾏输⼊, 避免操作错误
# 清空操作: 元素对象.clear()
sleep(3)
tel.clear()
tel.send_keys('18600000000')# 3).间隔3秒,点击‘注册’按钮
sleep(3)
driver.find_element_by_css_selector('button').click()# 4).间隔3秒,关闭浏览器
# 5).元素定位⽅法不限# 4. 展示效果
sleep(3)
# 5. 退出浏览器
driver.quit()
二、浏览器操作⽅法
1. Part1: 设置最⼤化/⼤⼩/位置
from time import sleepfrom selenium import webdriver# 2. 实例化浏览器对象
driver = webdriver.Chrome()
# 3. 打开⻚⾯
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 1. maximize_window() [重点]最⼤化浏览器窗⼝ --> 模拟浏览器最⼤化按
钮
# 说明: 如果能够在打开⻚⾯时, 全屏显示⻚⾯, 就能尽最⼤可能加载更多的⻚⾯元素, 提⾼可定位性
driver.maximize_window()# 2. set_window_size(width, height) [了解]设置浏览器窗⼝⼤⼩ --> 设置浏览器宽、⾼(像素点)
# 场景: 查看⻚⾯是否可以⾃适应(Web 和 APP 端切换)时使⽤
driver.set_window_size(300, 300)# 3. set_window_position(x, y) [了解]设置浏览器窗⼝位置 --> 设置浏
览器位置
driver.set_window_position(300, 300)# 4. 展示效果
sleep(3)
# 5. 退出浏览器
driver.quit()
扩展: Web/APP 项⽬⻚⾯布局坐标系示意
2. Part2: 后退/前进/刷新
# 1. 导⼊模块
from time import sleepfrom selenium import webdriver# 2. 实例化浏览器对象
driver = webdriver.Chrome()
# 3. 打开⻚⾯
driver.get('http://www.baidu.com')# 定位搜索框输⼊内容
driver.find_element_by_id('kw').send_keys('⿊⻢⻢')
# 点击搜索按钮
driver.find_element_by_id('su').click()
sleep(2)# 后退: 浏览器对象.back()
driver.back()
sleep(2)# 前进: 浏览器对象.forward()
driver.forward()
sleep(2)# 刷新[重点]: refresh()
# 说明: 刷新动作是重新向服务器发起当前⻚⾯的请求!
driver.refresh()# 4. 展示效果
sleep(3)
# 5. 退出浏览器
driver.quit()
3. Part3: 关闭/退出/获取⻚⾯标题和 URL 地址
# 1. 导⼊模块
from time import sleep
from selenium import webdriver# 2. 实例化浏览器对象
driver = webdriver.Chrome()
# 3. 打开⻚⾯
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 点击新开新浪⽹⻚
driver.find_element_by_partial_link_text('访问').click()
sleep(2)# 7. close() 关闭当前窗⼝ --> 模拟点击浏览器关闭按钮
# 8. quit() 关闭浏览器驱动对象 --> 关闭所有程序启动的窗⼝
# 9. title 获取⻚⾯title
# 10. current_url 获取当前⻚⾯URL# 场景: 浏览器的标题和 URL 地址属性, 可以⽤来做断⾔使⽤
print('关闭前⻚⾯标题:', driver.title)
print('关闭前⻚⾯地址:', driver.current_url)# 说明: 在没有实现浏览器⻚⾯切换操作前, close() ⽅法关闭的是原始⻚⾯!
# 场景: 关闭单个⻚⾯时使⽤
driver.close()# 4. 展示效果
sleep(3)
# 5. 退出浏览器
# 说明: 关闭所有⻚⾯
driver.quit()
三、获取元素信息⽅法
1. Part1: 获取⼤⼩/⽂本/属性值
# 1. 导⼊模块
from time import sleepfrom selenium import webdriver# 2. 实例化浏览器对象
driver = webdriver.Chrome()
# 3. 打开⻚⾯
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 1. size 返回元素⼤⼩
# 场景: ⽤于判断⻚⾯元素布局尺⼨是否合理时使⽤
username = driver.find_element_by_id('userA')
print('⽬标元素的尺⼨为:', username.size)# 2. text 获取元素的⽂本
# 场景: ⽤于切换⻚⾯后, 对⻚⾯内容特定元素的⽂本信息的获取(⽤作断⾔使
⽤)
btn = driver.find_element_by_tag_name('button')
print('⽬标元素的⽂本为:', btn.text)# 3. get_attribute("xxx") 获取属性值,传递的参数为元素的属性名
# 场景: 有些情况下, 需要获取⽬标元素的特定属性值作为判断依据或数据
# 语法: 元素对象.get_attribute("属性名")
link = driver.find_element_by_link_text('浪')
print('⽬标元素的地址为:', link.get_attribute('href'))# 4. 展示效果
sleep(3)
# 5. 退出浏览器
driver.quit()
2. Part2: 判断元素是否可⻅/可⽤/可选中
# 1. 导⼊模块
from time import sleepfrom selenium import webdriver# 2. 实例化浏览器对象
driver = webdriver.Chrome()
# 3. 打开⻚⾯
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 4. is_displayed() 判断元素是否可⻅
# 说明: 该⽅法多⽤于对元素在⻚⾯内显示效果的判断时使⽤(元素不显示不意味着⼀定⽆法定位)
span = driver.find_element_by_name('sp1')
print('⽬标元素是否显示:', span.is_displayed())# 5. is_enabled() 判断元素是否可⽤
# 说明: 该⽅法多⽤于判断⽬标元素是否可以进⾏交互时使⽤
can_btn = driver.find_element_by_id('cancelA')
print('⽬标元素是否可⽤:', can_btn.is_enabled())# 6. is_selected() 判断元素是否选中,⽤来检查复选框或单选按钮是否被选
中
# 场景: 如购物⻋⻚⾯, 不全选商品, 不让结算
check = driver.find_element_by_id('lyA')
print('⽬标元素是否被选中:', check.is_selected())# 扩展: 判断条件
if check.is_selected(): # 选中的判断pass
if not check.is_selected(): # 未选中的判断pass# 4. 展示效果
sleep(3)
# 5. 退出浏览器
driver.quit()
四、鼠标操作
1. 右键单击[了解]
# 1. 导⼊模块
from time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChains# 2. 实例化浏览器对象
driver = webdriver.Chrome()
# 3. 打开⻚⾯
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 需求:打开注册⻚⾯A,在⽤户名⽂本框上点击⿏标右键
# 0> 定位⽬标元素
username = driver.find_element_by_id('userA')
# 1> 实例化⿏标对象(关联浏览器对象)
action = ActionChains(driver)
# 2> 调⽤⿏标⽅法
# 说明: ⿏标右键只能展示右键菜单内容, ⽽菜单中的元素⽆法操作!
action.context_click(username)
# 3> 执⾏⽅法: 该⽅法必须调⽤, 否则上述代码⽆效!!!!!!
action.perform()# 4. 展示效果
sleep(3)
# 5. 退出浏览器
driver.quit()
2. 左键双击[了解]
from time import sleepfrom selenium import webdriver
from selenium.webdriver import ActionChains# 2. 实例化浏览器对象
driver = webdriver.Chrome()
# 3. 打开⻚⾯
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 需求:打开注册⻚⾯A,输⼊⽤户名admin,暂停3秒钟后,双击⿏标左键,选中admin
username = driver.find_element_by_id('userA')
username.send_keys('admin')
sleep(3)# 说明: 使⽤键盘快捷键 Ctrl + A, 也能实现全选
# 1> 实例化⿏标对象(关联浏览器对象)
action = ActionChains(driver)
# 2> 调⽤⿏标动作(传⼊⽬标元素)
action.double_click(username)
# 3> 执⾏⽅法
action.perform()# 4. 展示效果
sleep(3)
# 5. 退出浏览器
driver.quit()
3. 拖拽操作[了解]
from time import sleepfrom selenium import webdriver
from selenium.webdriver import ActionChains# 2. 实例化浏览器对象
driver = webdriver.Chrome()
# 3. 打开⻚⾯
driver.get('file:///Users/comesoon/Desktop/page/drag.html')# 需求:打开‘drag.html’⻚⾯,把红⾊⽅框拖拽到蓝⾊⽅框上
red = driver.find_element_by_id('div1')
blue = driver.find_element_by_id('div2')# 1> 实例化⿏标对象(关联浏览器对象)
action = ActionChains(driver)
# 2> 调⽤⽅法(传⼊⽬标元素)
action.drag_and_drop(red, blue)
# 3> 执⾏⽅法
action.perform()# 4. 展示效果
sleep(3)
# 5. 退出浏览器
driver.quit()
4. 悬停操作[重点]
from time import sleepfrom selenium import webdriver
from selenium.webdriver import ActionChains# 2. 实例化浏览器对象
driver = webdriver.Chrome()
# 3. 打开⻚⾯
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 定位⽬标元素
btn = driver.find_element_by_tag_name('button')# 实例化⿏标对象
action = ActionChains(driver)
# 调⽤⿏标⽅法
# 说明: 该⽅法在实际应⽤中, 处理悬停⿏标才会出现的菜单时使⽤
# 注意: 该⽅法执⾏时, 不要动⿏标!!!!!!
action.move_to_element(btn)
# 执⾏⽅法
action.perform()# 另⼀种⿏标操作的写法:(在其他编程语⾔中称为链式编程)
# ActionChains(driver).move_to_element(btn).perform()# 4. 展示效果
sleep(3)
# 5. 退出浏览器
driver.quit()
五、键盘操作
1. 案例实现
# 1. 导⼊模块
from time import sleepfrom selenium import webdriver
from selenium.webdriver.common.keys import Keys# 2. 实例化浏览器对象
driver = webdriver.Chrome()
# 3. 打开⻚⾯
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 需求:打开注册A⻚⾯,完成以下操作
# 1). 输⼊⽤户名:admin1,暂停2秒,删除1
username = driver.find_element_by_id('userA')
username.send_keys('admin1')
sleep(2)
# 删除: BACK_SPACE 等价于 BACKSPACE
username.send_keys(Keys.BACK_SPACE)# 2). 全选⽤户名:admin,暂停2秒
# 说明: macOS 系统需要使⽤ Command + a
username.send_keys(Keys.CONTROL, 'a') # Windows 系统
# username.send_keys(Keys.COMMAND, 'a') # macOS 系统
sleep(2)# 3). 复制⽤户名:admin,暂停2秒
username.send_keys(Keys.CONTROL, 'c') # Windows 系统
# username.send_keys(Keys.COMMAND, 'c') # macOS 系统
sleep(2)# 4). 粘贴到密码框
# 说明: 之所以能够复制完内容后, 在任意位置处可以进⾏粘贴, 是通过系统的剪切板实现的
password = driver.find_element_by_id('passwordA')
password.send_keys(Keys.CONTROL, 'v') # Windows 系统
# password.send_keys(Keys.COMMAND, 'v') # macOS 系统# 4. 展示效果
sleep(3)
# 5. 退出浏览器
driver.quit()
六、元素等待
1. 隐式等待
说明:
定位元素时,如果能定位到元素则直接返回该元素,不触发等待;
如果不能定位到该元素,则间隔⼀段时间[不可控制]后再去定位元素;
如果在达到最⼤时⻓时还没有找到指定元素,则抛出元素不存在的异常 NoSuchElementException 。
- 注意:
-
- 隐式等待是全局有效, 只需要设置⼀次即可
-
- 当隐式等待被激活时, 虽然⽬标元素已经出现了,
- 但是还是会由于当前⻚⾯内的其他元素的未加载完成, ⽽继续等待, 进⽽增加代码的执⾏时⻓
案例实现
# 1. 导⼊模块
from time import sleepfrom selenium import webdriver# 2. 实例化浏览器对象
driver = webdriver.Chrome()
# 3. 打开⻚⾯
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%
8CA%E7%AD%89%E5%BE%85.html')# 设置隐式等待
driver.implicitly_wait(10)# 定位元素并输⼊
driver.find_element_by_id('userA').send_keys('admin')# 4. 展示效果
sleep(3)
# 5. 退出浏览器
driver.quit()
2. 显式等待
说明:
定位指定元素时,如果能定位到元素则直接返回该元素,不触发等待;
如果不能定位到该元素,则间隔⼀段时间[可以控制]后再去定位元素;
如果在达到最⼤时⻓时还没有找到指定元素,则抛出超时异常 TimeoutException
案例实现
-
需求:打开注册A⻚⾯,完成以下操作
-
1).使⽤显式等待定位⽤户名输⼊框,如果元素存在,就输⼊admin
-
driver.find_element_by_id(‘userA’).send_keys(‘admin’)
-
设置显式等待: 按住 Ctrl, ⿏标左键点击类名, 拷⻉示例代码, 根据实际需求修改对应参数即可
# 1. 导⼊模块
from time import sleepfrom selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait# 2. 实例化浏览器对象
driver = webdriver.Chrome()
# 3. 打开⻚⾯
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA%E7%AD%89%E5%BE%85.html')"""
driver: 浏览器对象
timeout: 超时时⻓
poll_frequency: 定位⽅法执⾏间隔时⻓(默认 0.5 秒)
"""
element = WebDriverWait(driver, 10, 1).until(lambda x:
x.find_element_by_id('userA'))
# 说明: 元素操作⽅法没有代码提示, 需要⼿写
element.send_keys('admin')# 4. 展示效果
sleep(3)
# 5. 退出浏览器
driver.quit()
3. 隐式等待和显示等待的对⽐
对⽐ | 元素个数 | 调⽤⽅式 | 异常类型 |
---|---|---|---|
隐式等待 | 全局 | 浏览器对象调⽤ | NoSuchElementException |
显式等待 | 单个 | 实例化对象调⽅法 | TimeoutException |
扩展: 强制等待(sleep) | 全局 | ⽅法 | NoSuchElementException |
相关文章:
三、UI自动化测试03--操作方法API
目录 一、元素操作⽅法二、浏览器操作⽅法1. Part1: 设置最⼤化/⼤⼩/位置扩展: Web/APP 项⽬⻚⾯布局坐标系示意2. Part2: 后退/前进/刷新3. Part3: 关闭/退出/获取⻚⾯标题和 URL 地址 三、获取元素信息⽅法1. Part1: 获取⼤⼩/⽂本/属性值2. Part2: 判断元素是否可⻅/可⽤/可…...
人工智能—— K-means 聚类算法
目录 摘要 16 K-means 聚类算法 16.1 本章工作任务 16.2 本章技能目标 16.3 本章简介 16.4 编程实战 16.5 本章总结 16.6 本章作业 本章已完结!!! 摘要 本章实现的工作是:首先采用Python语言读取样本数据(学生的语文、数…...
使用XMLSpy校验xml是否合法
# 背景说明 近期大部分地区都在做或将要做数据迁移,基本所有产品的迁移工具底层都依赖了XSD文件对迁移的结构化数据对应XML文件进行初步校验,但有些XSD的问题提示不太容易理解,正好N年前我做XX数据上报时用过XMLSpy可以直接校验每个xml是否合…...
游戏引擎学习第248天:清理数据块显示
启动代码,构建游戏,回顾并为今天的工作做好准备 今天还需要做一些额外的调整。具体来说,我们希望能编辑一些调试值,而这个结构在当前的调试系统中已经有了,所以今天主要是清理一些无关的部分,并进行一些连…...
基于Pytest接口自动化的requests模块项目实战以及接口关联方法详解
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 1、基于pytest单元测试框架的规则 1.1 模块名(即文件名)必须以test_开头或者_test结尾 1.2 类名必须以Test开头且不能有init方法 1.3 用…...
腾讯 Kuikly 正式开源,了解一下这个基于 Kotlin 的全平台框架
在 3月的时候通过 《腾讯 TDF 即将开源 Kuikly 跨端框架,Kotlin 支持全平台》 我们大致知道了 Kuikly 的基本情况,Kuikly 是一个面向终端技术栈的跨端开发框架,完全基于kotlin语言开发,提供原生的性能和体验。 按照官方的说法&…...
【c++】AVL树模拟实现
简介 AVL树是最先被发明出来的自平衡二叉查找树,在1962由前苏联科学家G. M. Adelson-Velsky和E. M. Landis在论文中发表。AVL树中引入了平衡因子,每一个节点都有一个平衡因子(一般是右子树高度 - 左子树高度);AVL树要…...
具身智能模型开发训练技法之仿真平台动捕数据重定向
具身智能大模型的开发与训练高度依赖大量的数据输入,形象地说,如同需要持续的“数据喂养”。只有经过不断地进行数据积累和模型训练,具身智能大模型才能够实现自主感知、自主决策以及自主执行的完整进程。在多样化的数据形态中,真…...
手撕——贪吃蛇小游戏(下)
引言 上一章介绍了实现贪吃蛇小游戏必备的知识点。 这章,让我们一起开启手搓核弹之旅吧。 先附上贪吃蛇代码的git:贪吃蛇小游戏_4_23 Shown_shuai/learn_c - 码云 - 开源中国 (gitee.com) 上一章的窗口: 手撕——贪吃蛇小游戏࿰…...
C++ 类与对象(中)—— 默认成员函数与运算符重载的深度解析:构造函数,析构函数,拷贝构造函数,赋值运算符重载,普通取地址重载,const取地址重载
在 C 中,类的默认成员函数是编译器自动生成的重要机制,合理利用这些函数可以简化代码编写,同时避免资源管理错误。本文将从构造函数、析构函数、拷贝构造函数、赋值运算符重载等核心内容展开,结合具体案例深入解析。 一、默认成员…...
【Jupyter 启动时如何指定目录】
你在 Windows 系统下运行 jupyter notebook 时,遇到了 Jupyter Notebook 打开的目录不是你想要的 E:\desktop\yolo-study,而是其他路径。这可能是由于 Jupyter 的默认配置问题 或 启动路径问题 导致的。 🔍 原因分析 Jupyter 默认根目录设置错…...
PostSwigger Web 安全学习:CSRF漏洞2
CSRF 漏洞学习网站:What is CSRF (Cross-site request forgery)? Tutorial & Examples | Web Security Academy CSRF 漏洞:SameSite相关绕过 当浏览器访问服务器时,服务器会在 Cookie 中添加 SameSite 属性来告诉浏览器是否在来自其他…...
openharmony—4.1 softbus_tool 工具编译使用测试笔记(持续更新)
相关资料: 1.communication_dsoftbus: 暂无描述 - Gitee.com 2.dsoftbus_tool: OpenHarmony 分布式软总线样例 3.OpenAtom OpenHarmony 4.OpenAtom OpenHarmony 编译该demo之前需要大家搭建拉取openharmony源码,搭建开发环境,同时全…...
关于 Web 服务器的五个案例
一、案例题目: 1.多 IP 访问多网站(在 RHCE 练习二中的实验二) 2.多端口访问多网站 3.多域名访问多网站 4.虚拟目录和用户控制 5.https/443 二、案例实验 2.多端口访问多网站 ① 开始还是先关闭我们的防火墙以及 selinux [rootserve…...
第十二章-PHP文件上传
第十二章-PHP文件上传 一,文件上传原理 一、HTTP协议与文件上传 1. 请求体结构 当表单设置enctype"multipart/form-data"时,浏览器会将表单数据编码为多部分(multipart)格式。 Boundary分隔符:随机生成的…...
shell脚本部署disu博客
#!/bin/bash #关闭防火墙 systemctl status firewalld &>/dev/null if [ $? -ne 0 ];then systemctl stop firewalld &>/dev/null else echo “firewalld is disabled” fi #关闭selinux filegetenforce if [ “$fine” “Disabled” ];then echo “firewalld…...
NdrpPointerUnmarshallInternal函数分析之pFormatPointee指针的确定
第一部分: 0: kd> p RPCRT4!NdrPointerUnmarshall0x29: 001b:77c46ce4 e8b6f6ffff call RPCRT4!NdrpPointerUnmarshall (77c4639f) 0: kd> t Breakpoint 4 hit RPCRT4!NdrpPointerUnmarshall: 001b:77c4639f 55 push ebp 0: kd> …...
STM32(M4)入门:定时器延时与系统滴答(价值 3w + 的嵌入式开发指南)
第 1 章 延时:嵌入式系统的时间控制基石 1.1 延时基础:从概念到硬件实现 1.1.1 什么是延时? 定义:延时是通过软件或硬件手段,使程序执行过程中暂停指定时间,再继续后续操作的技术。本质是对时间的精确或…...
2025 FIC wp
这次比赛计算机和手机大部分题目都比较常规 第一和第四部分有点让人摸不着头脑 比赛的时候第一部分有四个题没出 第四部分基本都没怎么出 现在复盘一下 把我当时做题的心得和获取的新知识记录一下 互联网取证的部分就先学习一下别的师傅 检材 链接:https://pan.bai…...
STM32标准库和HAL库SPI发送数据的区别-即SPI_I2S_SendData()和HAL_SPI_Transmit()互换
1、标准库SPI初始化 这是标准库的SPI初始化配置 2、HAL库SPI初始化 这是HAL库函数的SPI初始化配置 可以看出,基本一直,除了 基本的io口配置区别,其他主要的读写函数不用动的。 3、SPI发送函数_替换对比 /* SPI写入一个字节 */ void SP…...
Cesium 三维场景中通过自定义着色器实现多种特效(纹理、光带、点光源、反射)
整体功能概述 构建一个基于 Cesium 的三维场景,加载三维瓦片集模型,同时提供多种特效,像夜景纹理、上下扫光、点光源以及反射纹理等,利用 dat.gui 库创建交互界面。 代码详解 白膜特效 nightFs.glsl void fragmentMain(Fragm…...
Java学习--HashMap
HaspMap是Java集合框架中最重要、最常用的数据结构之一。其基于哈希表实现了Map接口,在Java1.8的版本中,其采用了“数组链表红黑树”的混合结构,底层代码如下: transient Node<K,V>[] table; // 哈希桶数组 static class N…...
Monorepo、Lerna、Yarn Workspaces、pnpm Workspaces 用法
Monorepo 介绍 Monorepo是一种方案,而非具体的工具。 Monorepo指的是将多个相关的项目或模块放在同一个代码仓库中进行管理的方式。这种方案有以下优点: 方便代码共享:不同项目或模块之间可以方便地共享代码、组件、工具函数等,…...
JVM指令手册:深入理解字节码执行机制
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 引言 Java虚拟机(JVM)作为Java生态的核心执行引擎,其指令系统是理解程序底层运行机制的关键。本手册将系统解析JVM指令集…...
springboot logback 默认加载配置文件顺序
在 Spring Boot 应用中,Logback 默认加载配置文件的顺序遵循特定的规则。以下是详细的加载顺序和优先级说明: 1. 默认配置文件加载顺序 Logback 在 Spring Boot 中会按以下顺序查找并加载配置文件(优先级从高到低): l…...
用 Nodemon 解决 npm run serve 频繁重启服务
Nodemon 是一个基于 Node.js 构建的开发工具,专为帮助开发者自动监控项目文件的更改而设计。每当文件发生变更时,Nodemon 会自动重启 Node.js 服务器,无需手动停止并重启。这对于提升开发速度、减少人工操作非常有帮助,尤其适用于…...
WEB安全--社会工程--SET钓鱼网站
1、选择要钓鱼的网站 2、打开kali中的set 3、启动后依次选择: 4、输入钓鱼主机的地址(kali)和要伪装的网站域名: 5、投放钓鱼网页(服务器域名:80) 6、获取账号密码...
系统架构师---基于规则的系统架构
引言 在业务规则高度动态且需快速响应的系统中,基于规则的系统架构风格(Rule-Based System Architecture Style)提供了一种将业务逻辑与代码解耦的标准化范式。从保险理赔的自动化审核到金融风控的实时拦截,规则引擎已成为企…...
嵌入式软件--stm32 DAY 4 中断系统
1.课后练习 学了这么长时间,现在让我们第一次做练习。 1.1往返流水灯 1.1.1 LED1-LED2-LED3-LED2-LED1循环 (1)工程准备 复制上一个寄存器实现的工程文档,删减修改我们正要实现的工程。为了区别练习和学习工程,我们…...
android开发制作aosp系统签名文件给普通apk签名使用
platform.pk8和platform.x509.pem复制出来放在同一目录下 将AOSP源码路径下build\target\product\security\platform.pk8和platform.x509.pem复制出来放在同一目录下 新开一个ternimal窗口执行下面命令,生成platform.pem文件 openssl pkcs8 -in platform.pk8 -info…...
AVL树的介绍与学习
目录 1.前言 2.AVL树 3.AVL树的插入 平衡因子的更新 更新停止的条件 旋转 1.前言 在学习了二叉搜索树,set和map之后,我们接下来趁热打铁,继续学习AVL树。 2.AVL树 1.AVL树具有二叉搜索树的性质,但是它的左右子树的高度差不…...
docker部署Mysql8一直密码错误记录
正常流程是这样得: 第一步 #拉镜像 docker pull mysql:8.0 第二步 #运行名为 mysql8 得容器 ,MYSQL_ROOT_PASSWORD123456 设置密码 docker run -p 3307:3306 \ --name mysql8 \ -e MYSQL_ROOT_PASSWORD123456 \ -v /docker/mysql8/data:/var/lib/m…...
智慧水库与AI深度融合的实现方案及典型应用场景
以下是智慧水库与AI深度融合的实现方案及典型应用场景,结合行业前沿案例与技术架构展开: 一、智慧水库AI实现方案 1. 技术架构与核心工具 感知层: 多模态传感器网络:部署毫米波雷达水位计(精度3mm)、光纤光栅渗压计(分辨率0.01%FS)、高清智能球机(支持800万像素+AI分…...
大语言模型架构基础与挑战
大语言模型(Large Language Model, LLM)在近几年引领了自然语言处理领域的革命性进展。这类模型通常拥有极其庞大的参数规模(往往达到数十亿乃至数千亿级别),通过对海量文本数据进行自监督训练,展现出卓越的语言理解和生成能力。自2018年前后第一批大语言模型问世以来,基…...
KAG:通过知识增强生成提升专业领域的大型语言模型(二)
目录 摘要 Abstract 1 实验 1.1 实验设置 1.2 总体结果 1.3 消融研究 1.3.1 知识图谱索引消融 1.3.2 推理与检索消融 1.3.3 实验结果与讨论 2 KAG服务部署 2.1 安装Docker 2.2 安装Doker Compose 2.3 启动服务 2.4 查看状态 2.5 产品访问 3 KAG 0.6使用&#x…...
【Luogu】动态规划六
P1586 四方定理 - 洛谷 思路: 这题其实就是完全背包问题,但是有限制,最多数量只能是 4 所以我们可以定义 dp[i][j] 为 i 用 j 个数拼凑的总方案数 那么转移方程也很明显了,dp[i][j] dp[i - k*k][j - 1] 具体的,我…...
Postman接口测试: postman设置接口关联,实现参数化
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 postman设置接口关联 在实际的接口测试中,后一个接口经常需要用到前一个接口返回的结果, 从而让后一个接口能正常执行,这个…...
docker打开滚动日志
在 Docker 中启用滚动日志(log rotation)可以帮助你管理容器日志的大小,避免日志文件占用过多磁盘空间。以下是具体的操作步骤: 1. 修改 Docker 守护进程配置 Docker 的日志配置是通过 daemon.json 文件管理的。你需要修改此文件…...
单片机-89C51部分:5、点亮LED
飞书文档https://x509p6c8to.feishu.cn/wiki/SlB5wYD1QiPRzWkfijEcIvv8nyc 一、应用场景 二、点灯原理 插件led灯珠长引脚为正极,短引脚为负极。 LED(发光二极管)两端存在电压差,有一定的电流流过时会亮起。电流可以理解为水流,…...
Lua 第10部分 模式匹配
10.1 模式匹配的相关函数 字符串标准库提供了基于模式的 4 个函数。 我们已经初步了解过函数 find 和 gsub,其余两个函数分别是 match 和 gmatch (Global Match 的缩写)。 函数 string.find 用于在指定的目标字符串中搜索指定的模式。最简单的模式就是一…...
Maven 4.0.0 模式-pom.xml配置详解
Maven 4.0.0 模式-pom.xml配置详解 此 pom.xml 文件涵盖了 Maven 4.0.0 模式支持的所有主要标签,包括项目元数据、依赖管理、构建配置、发布管理等。每个标签都配有详细注释,说明其作用、常见用法和可能的值。 此文件旨在展示标签的完整性&#…...
IDEA 连接 Oracle 数据库
IDEA 连接 Oracle 数据库...
机器人快速启动
机器人快速启动 ES机器人开机操作流程 方法一(一体化底座启动) 接通48V电源点击底座“Power”按钮观察电源指示灯亮起,蜂鸣器发出“嘀”声,代表底座启动完成 方法二(控制手柄启动) 长按手柄开关机键2秒后松…...
使用 MediaPipe 和 OpenCV 快速生成人脸掩膜(Face Mask)
在实际项目中,尤其是涉及人脸识别、换脸、图像修复等任务时,我们经常需要生成人脸区域的掩膜(mask)。这篇文章分享一个简单易用的小工具,利用 MediaPipe 和 OpenCV,快速提取人脸轮廓并生成二值掩膜图像。 …...
《全球反空间能力》报告翻译——部分1
全球反空间能力 已进行过破坏性反卫星测试的国家 美国 美国目前拥有世界上最先进的军事太空能力,尽管与中国的相对差距正在缩小。在冷战期间,美国开创了许多现今使用的国家安全太空应用,并在几乎所有类别中保持技术领先地位。美国军方在将…...
云原生课程-Docker
一次镜像,到处运行。 1. Docker详解: 1.1 Docker简介: Docker是一个开源的容器化平台,可以帮助开发者将应用程序和其依赖的环境打包成一个可移植的,可部署的容器。 docker daemon:是一个运行在宿主机(DO…...
组件的基本知识
组件 组件的基本知识 组件概念组成步骤好处全局注册生命周期scoped原理 父子通信步骤子传父 概念 就是将要复用的标签,抽离放在一个独立的vue文件中,以供主vue文件使用 组成 三部分构成 template:HTML 结构 script: JS 逻辑 style: CSS 样…...
空间矩阵的思考
今天又看了些线性代数,引发了许多思考。 矩阵是以长和宽存储数据,那有没有一种新型的矩阵,以长宽高的形式存储数据呢?我不知道有没有,所以暂且称其为空间矩阵。 它肯定是存在的,可以这样抽象&#…...
【数据挖掘】时间序列预测-常用序列预测模型
常用序列预测模型 (1)AR(自回归)模型(2)ARIMA模型(3)Prophet模型(4)LSTM模型(5)Transformer模型(6)模型评估6.…...
将你的本地项目发布到 GitHub (新手指南)
目录 第 1 步:在 GitHub 上创建新的仓库 (Repository)第 2 步:将本地仓库连接到 GitHub 远程仓库第 3 步:(可能需要) 重命名你的默认分支第 4 步:将本地代码推送到 GitHub第 5 步:在 GitHub 上检查结果后续工作流程 你…...