六、UI自动化测试06--PO设计模式
目录
- 一、PO 设计模式
- 1. v1 版本
- 1.1 v1.1
- 1.2 v1.2
- 2. v2 版本
- 3. ⽅法封装套路
- 4. v3 版本
- 4.1 浏览器对象管理类的实现
- 4.2 浏览器对象管理类的优化
- 4.3 浏览器对象管理类的使⽤
- 4.4 获取弹窗信息⽅法的封装
- 5. PO 设计模式
- 6. v4 版本
- 6.1 PO⻚⾯元素封装步骤
- 6.2 测试⽤例的最终代码样式
- 7. v5 版本
- 7.1 PO ⽂件对象层代码优化
- 7.2 PO ⽂件操作层代码优化
一、PO 设计模式
1. v1 版本
说明: 通过测试执⾏框架 pytest, 可以整合所有的同⼀模块的测试⽤例脚本, 并且需要尽⼒符合⼿⼯测试的操作业务逻辑, 最终实现执⾏单个测试脚本, 执⾏同⼀模块的所有测试⽤例
1.1 v1.1
- 通过测试⽅法整合测试脚本
"""
整合多个脚本⾄同⼀个测试⽤例中
"""
import pytest
from time import sleep
from selenium import webdriverclass TestLogin(object):"""登录测试类"""def test_account_does_not_exist(self):"""账号不存在测试⽅法"""driver = webdriver.Chrome()driver.get('http://127.0.0.1/')driver.maximize_window() # 窗⼝最⼤化driver.implicitly_wait(10) # 隐式等待# 1. 点击⾸⻚的‘登录’链接,进⼊登录⻚⾯driver.find_element_by_link_text('登录').click()# 2. 输⼊⼀个不存在的⽤户名driver.find_element_by_id('username').send_keys('13811110001')# 3. 输⼊密码driver.find_element_by_id('password').send_keys('123456')# 4. 输⼊验证码driver.find_element_by_id('verify_code').send_keys('8888')# 5. 点击登录按钮driver.find_element_by_name('sbtbutton').click()# 6. 获取错误提示信息# 获取元素⽂本值: 元素对象.textmsg = driver.find_element_by_class_name('layui-layercontent').textprint('错误信息为:', msg)sleep(3)driver.quit()def test_wrong_password(self):"""密码错误测试⽅法"""driver = webdriver.Chrome()driver.get('http://127.0.0.1/')driver.maximize_window() # 窗⼝最⼤化driver.implicitly_wait(10) # 隐式等待# 1. 点击⾸⻚的‘登录’链接,进⼊登录⻚⾯driver.find_element_by_link_text('登录').click()# 2. 输⼊⽤户名driver.find_element_by_id('username').send_keys('13800001111')# 3. 输⼊错误密码driver.find_element_by_id('password').send_keys('error')# 4. 输⼊验证码driver.find_element_by_id('verify_code').send_keys('8888')# 5. 点击登录按钮driver.find_element_by_name('sbtbutton').click()# 6. 获取错误提示信息# 获取元素⽂本值: 元素对象.textmsg = driver.find_element_by_class_name('layui-layer-content').textprint('错误信息为:', msg)sleep(3)driver.quit()if __name__ == '__main__':pytest.main(['-s', 'tpshop_login_1.py'])
1.2 v1.2
- 通过 setup() 和 teardown() ⽅法优化多个脚本相同的前置后后置操作
"""
整合多个脚本⾄同⼀个测试⽤例中
"""
import pytest
from time import sleep
from selenium import webdriverclass TestLogin(object):"""登录测试类"""def setup(self):self.driver = webdriver.Chrome()self.driver.get('http://127.0.0.1/')self.driver.maximize_window() # 窗⼝最⼤化self.driver.implicitly_wait(10) # 隐式等待def teardown(self):sleep(3)self.driver.quit()def test_account_does_not_exist(self):"""账号不存在测试⽅法"""# driver = webdriver.Chrome()# driver.get('http://127.0.0.1/')# driver.maximize_window() # 窗⼝最⼤化# driver.implicitly_wait(10) # 隐式等待# 1. 点击⾸⻚的‘登录’链接,进⼊登录⻚⾯self.driver.find_element_by_link_text('登录').click()# 2. 输⼊⼀个不存在的⽤户名self.driver.find_element_by_id('username').send_keys('13811110001')# 3. 输⼊密码self.driver.find_element_by_id('password').send_keys('123456')# 4. 输⼊验证码self.driver.find_element_by_id('verify_code').send_keys('8888')# 5. 点击登录按钮self.driver.find_element_by_name('sbtbutton').click()# 6. 获取错误提示信息# 获取元素⽂本值: 元素对象.textsleep(2)msg = self.driver.find_element_by_class_name('layui-layer-content').textprint('错误信息为:', msg)# sleep(3)# driver.quit()def test_wrong_password(self):"""密码错误测试⽅法"""# driver = webdriver.Chrome()# driver.get('http://127.0.0.1/')# driver.maximize_window() # 窗⼝最⼤化# driver.implicitly_wait(10) # 隐式等待# 1. 点击⾸⻚的‘登录’链接,进⼊登录⻚⾯self.driver.find_element_by_link_text('登录').click()# 2. 输⼊⽤户名self.driver.find_element_by_id('username').send_keys('138000011
11')# 3. 输⼊错误密码self.driver.find_element_by_id('password').send_keys('error')# 4. 输⼊验证码self.driver.find_element_by_id('verify_code').send_keys('8888')# 5. 点击登录按钮self.driver.find_element_by_name('sbtbutton').click()# 6. 获取错误提示信息# 获取元素⽂本值: 元素对象.textsleep(2)msg = self.driver.find_element_by_class_name('layuilayer-content').textprint('错误信息为:', msg)# sleep(3)# driver.quit()if __name__ == '__main__':pytest.main(['-s', 'tpshop_login_2.py'])
2. v2 版本
- 通过 setup_class() 和 teardown_class() ⽅法使脚本的执⾏逻辑跟符合⼿⼯测试逻辑
"""
整合多个脚本⾄同⼀个测试⽤例中
"""
import pytest
from time import sleep
from selenium import webdriverclass TestLogin(object):"""登录测试类"""def setup_class(self):self.driver = webdriver.Chrome()self.driver.get('http://127.0.0.1/')self.driver.maximize_window() # 窗⼝最⼤化self.driver.implicitly_wait(10) # 隐式等待def teardown_class(self):sleep(3)self.driver.quit()def setup(self):# self.driver = webdriver.Chrome()# self.driver.get('http://127.0.0.1/')# self.driver.maximize_window() # 窗⼝最⼤化# self.driver.implicitly_wait(10) # 隐式等待# 打开⾸⻚self.driver.get('http://127.0.0.1/')# 点击登录self.driver.find_element_by_link_text('登录').click()def teardown(self):# sleep(3)# self.driver.quit()passdef test_account_does_not_exist(self):"""账号不存在测试⽅法"""# 1. 点击⾸⻚的‘登录’链接,进⼊登录⻚⾯# self.driver.find_element_by_link_text('登录').click()# 2. 输⼊⼀个不存在的⽤户名self.driver.find_element_by_id('username').send_keys('13811110001')# 3. 输⼊密码self.driver.find_element_by_id('password').send_keys('123456')# 4. 输⼊验证码self.driver.find_element_by_id('verify_code').send_keys('8888')# 5. 点击登录按钮self.driver.find_element_by_name('sbtbutton').click()# 6. 获取错误提示信息# 获取元素⽂本值: 元素对象.textsleep(2)msg = self.driver.find_element_by_class_name('layui-layer-content').textprint('错误信息为:', msg)def test_wrong_password(self):"""密码错误测试⽅法"""# 1. 点击⾸⻚的‘登录’链接,进⼊登录⻚⾯# self.driver.find_element_by_link_text('登录').click()# 2. 输⼊⽤户名self.driver.find_element_by_id('username').send_keys('13800001111')# 3. 输⼊错误密码self.driver.find_element_by_id('password').send_keys('error')# 4. 输⼊验证码self.driver.find_element_by_id('verify_code').send_keys('8888')# 5. 点击登录按钮self.driver.find_element_by_name('sbtbutton').click()# 6. 获取错误提示信息# 获取元素⽂本值: 元素对象.textsleep(2)msg = self.driver.find_element_by_class_name('layui-layer-content').textprint('错误信息为:', msg)if __name__ == '__main__':pytest.main(['-s', 'tpshop_login_3.py'])
3. ⽅法封装套路
-
- 确定⽅法的存放位置: 找位置
-
- 给⽅法起个合适名字: 起名字
-
- 放⼊要封装的代码内容: 放代码
-
- 确认是否需要参数和返回值: 确必要
-
- 调⽤封装好的⽅法使⽤: 做调⽤
4. v3 版本
4.1 浏览器对象管理类的实现
"""
公共⽅法模块: 习惯命名 utils
"""
from selenium import webdriver
from time import sleepclass DriverUtil(object):"""浏览器对象管理类"""driver = None # 浏览器对象变量初始化状态def get_driver(self):"""获取浏览器对象⽅法"""# 说明: 为了防⽌在同⼀次测试过程中, 调⽤获取浏览器对象⽅法时,# 都会创建⼀个新的浏览器对象, 因此有必要先判断对象是否存在,
不存在时在创建!if self.driver is None:self.driver = webdriver.Chrome()self.driver.get('http://127.0.0.1/')self.driver.maximize_window() # 窗⼝最⼤化self.driver.implicitly_wait(10) # 隐式等待return self.driverdef quit_driver(self):"""退出浏览器对象⽅法"""# 说明: 必须保证浏览器对象存在, 才能执⾏退出操作if self.driver: # 等价于: if self.driver is not None:sleep(3)self.driver.quit()self.driver = None # 保险⼿段: 移除对象后, 保留对象变量, 以备下⼀次使⽤if __name__ == '__main__':my_driver = DriverUtil()my_driver.get_driver()sleep(2)my_driver.quit_driver()
4.2 浏览器对象管理类的优化
"""
公共⽅法模块: 习惯命名 utils
"""
from selenium import webdriver
from time import sleepclass DriverUtil(object):"""浏览器对象管理类"""# 说明: 对象变量只需要在类定义内部使⽤, 因此定义为私有__driver = None # 浏览器对象变量初始化状态@classmethoddef get_driver(cls):"""获取浏览器对象⽅法"""# 说明: 为了防⽌在同⼀次测试过程中, 调⽤获取浏览器对象⽅法时,# 都会创建⼀个新的浏览器对象, 因此有必要先判断对象是否存在, 不存在时在创建!if cls.__driver is None:cls.__driver = webdriver.Chrome()cls.__driver.get('http://127.0.0.1/')cls.__driver.maximize_window() # 窗⼝最⼤化cls.__driver.implicitly_wait(10) # 隐式等待return cls.__driver@classmethoddef quit_driver(cls):"""退出浏览器对象⽅法"""# 说明: 必须保证浏览器对象存在, 才能执⾏退出操作if cls.__driver: # 等价于: if self.driver is not None:sleep(3)cls.__driver.quit()cls.__driver = None # 保险⼿段: 移除对象后, 保留对象变量, 以备下⼀次使⽤if __name__ == '__main__':# my_driver = DriverUtil()# my_driver.get_driver()# sleep(2)# my_driver.quit_driver()# 说明: 定义为类⽅法, 可以直接由类对象调⽤, 省略实例化对象步骤DriverUtil.get_driver() # 获取浏览器对象sleep(2)DriverUtil.quit_driver() # 退出浏览器对象
4.3 浏览器对象管理类的使⽤
"""
整合多个脚本⾄同⼀个测试⽤例中
"""
import pytest
from time import sleep
from selenium import webdriverfrom utils import DriverUtilclass TestLogin(object):"""登录测试类"""def setup_class(self):# self.driver = webdriver.Chrome()# self.driver.get('http://127.0.0.1/')# self.driver.maximize_window() # 窗⼝最⼤化# self.driver.implicitly_wait(10) # 隐式等待self.driver = DriverUtil.get_driver() # 获取浏览器对象def teardown_class(self):# sleep(3)# self.driver.quit()DriverUtil.quit_driver() # 退出浏览器对象def setup(self):# 打开⾸⻚self.driver.get('http://127.0.0.1/')# 点击登录self.driver.find_element_by_link_text('登录').click()def teardown(self):passdef test_account_does_not_exist(self):"""账号不存在测试⽅法"""# 2. 输⼊⼀个不存在的⽤户名self.driver.find_element_by_id('username').send_keys('13811110001')# 3. 输⼊密码self.driver.find_element_by_id('password').send_keys('123456')# 4. 输⼊验证码self.driver.find_element_by_id('verify_code').send_keys('8888')# 5. 点击登录按钮self.driver.find_element_by_name('sbtbutton').click()# 6. 获取错误提示信息# 获取元素⽂本值: 元素对象.textsleep(2)msg = self.driver.find_element_by_class_name('layui-layer-content').textprint('错误信息为:', msg)def test_wrong_password(self):"""密码错误测试⽅法"""# 2. 输⼊⽤户名self.driver.find_element_by_id('username').send_keys('13800001111')# 3. 输⼊错误密码self.driver.find_element_by_id('password').send_keys('error')# 4. 输⼊验证码self.driver.find_element_by_id('verify_code').send_keys('8888')# 5. 点击登录按钮self.driver.find_element_by_name('sbtbutton').click()# 6. 获取错误提示信息# 获取元素⽂本值: 元素对象.textsleep(2)msg = self.driver.find_element_by_class_name('layui-layer-content').textprint('错误信息为:', msg)if __name__ == '__main__':pytest.main(['-s', 'tpshop_login_3.py'])
4.4 获取弹窗信息⽅法的封装
from selenium import webdriver
from time import sleepdef get_alert_msg():"""获取弹窗信息⽅法"""sleep(2)# msg = self.driver.find_element_by_class_name('layui-layercontent').text# msg = driver.find_element_by_class_name('layui-layercontent').textmsg =
DriverUtil.get_driver().find_element_by_class_name('layui-layer-content').textreturn msgclass DriverUtil(object):"""浏览器对象管理类"""__driver = None # 浏览器对象变量初始化状态@classmethoddef get_driver(cls):"""获取浏览器对象⽅法"""if cls.__driver is None:cls.__driver = webdriver.Chrome() # 浏览器类型cls.__driver.get('http://127.0.0.1/') # 项⽬地址cls.__driver.maximize_window() # 窗⼝最⼤化cls.__driver.implicitly_wait(10) # 隐式等待return cls.__driver@classmethoddef quit_driver(cls):"""退出浏览器对象⽅法"""if cls.__driver:sleep(3)cls.__driver.quit()cls.__driver = Noneif __name__ == '__main__':DriverUtil.get_driver() # 获取浏览器对象sleep(2)DriverUtil.quit_driver() # 退出浏览器对象
5. PO 设计模式
-
说明: PO 模式⼜可以叫 POM(P:Page O:Object), 是 UI ⾃动化测试中⼀个⾮常流⾏的设计模式(代码套路)
-
核⼼: 将元素定位及操作和业务逻辑, 拆分三个层⾯(每个层⾯对应⼀个单独的类), 然后通过调⽤完成最终的测试执⾏⾏为的过程
-
三个层⾯: 对象库层/操作层/业务层
6. v4 版本
6.1 PO⻚⾯元素封装步骤
-
- 对应⻚⾯创建⻚⾯ PO 代码⽂件, 命名规则: ⻚⾯功能_page.py, 例如⾸⻚: index_page.py
-
- 定义三个类: 对象层(XxxPage)/操作层(XxxHandle)/业务层(XxxTask)
-
- 对象层:
- 1> init ⽅法中获取浏览器对象
- 2> ⾃定义⽅法: 封装元素定位⽅法
- 3> 封装元素定位⽅法需要添加返回值!
-
- 操作层:
- 1> init ⽅法获取对象层对象, 根据类名写对象变量名
- 2> ⾃定义⽅法: 封装元素操作⽅法
-
- 业务层:
- 1> init ⽅法获取操作层对象, 根据类名写对象变量名
- 2> ⾃定义⽅法: 封装测试业务逻辑
-
- 在测试⽤例⽂件中, 实例化业务层对象, 调⽤测试业务⽅法, 执⾏测试
代码示例: ⾸⻚⻚⾯
"""
⾸⻚⻚⾯
"""
from utils import DriverUtilclass IndexPage(object):"""⾸⻚对象层"""def __init__(self):self.driver = DriverUtil.get_driver() # 获取浏览器对象def find_login(self):"""定位登录⽅法"""# self.driver.find_element_by_link_text('登录')# self.driver = DriverUtil.get_driver() # 获取浏览器对象return self.driver.find_element_by_link_text('登录')class IndexHandle(object):"""⾸⻚操作层"""def __init__(self):self.index_page = IndexPage() # 获取对象层对象def click_login(self):"""点击登录⽅法"""# element = IndexPage()# element.find_login().click()self.index_page.find_login().click()class IndexTask(object):"""⾸⻚业务层"""def __init__(self):self.index_handle = IndexHandle() # 获取操作层对象def go_to_login(self):"""跳转登录⻚⾯⽅法"""self.index_handle.click_login()
代码示例: 登录⻚⾯
"""
登录⻚⾯
"""
from utils import DriverUtilclass LoginPage(object):"""登录对象层"""def __init__(self):self.driver = DriverUtil.get_driver() # 获取浏览器对象def find_username(self):"""定位⽤户名⽅法"""return self.driver.find_element_by_id('username')def find_password(self):"""定位密码⽅法"""return self.driver.find_element_by_id('password')def find_verify_code(self):"""定位验证码⽅法"""return self.driver.find_element_by_id('verify_code')def find_login_btn(self):"""定位登录按钮⽅法"""return self.driver.find_element_by_name('sbtbutton')class LoginHandle(object):"""登录操作层"""def __init__(self):self.login_page = LoginPage() # 获取对象层对象def input_username(self, name):"""输⼊⽤户名⽅法"""self.login_page.find_username().send_keys(name)def input_password(self, pwd):"""输⼊密码⽅法"""self.login_page.find_password().send_keys(pwd)def input_verify_code(self, code):"""输⼊验证码⽅法"""self.login_page.find_verify_code().send_keys(code)def click_login_btn(self):"""点击登录按钮⽅法"""self.login_page.find_login_btn().click()class LoginTask(object):"""登录业务层"""def __init__(self):self.login_handle = LoginHandle() # 获取操作层对象def login_method(self, name, pwd, code):"""登录⽅法"""self.login_handle.input_username(name) # 输⼊⽤户名self.login_handle.input_password(pwd) # 输⼊密码self.login_handle.input_verify_code(code) # 输⼊验证码self.login_handle.click_login_btn() # 点击登录按钮
6.2 测试⽤例的最终代码样式
"""
整合多个脚本⾄同⼀个测试⽤例中
"""
import pytest
from utils import DriverUtil, get_alert_msg
from v4.index_page import IndexTask
from v4.login_page import LoginTaskclass TestLogin(object):"""登录测试类"""def setup_class(self):self.driver = DriverUtil.get_driver() # 获取浏览器对象self.index_task = IndexTask() # 实例化⾸⻚业务层对象self.login_task = LoginTask() # 实例化登录⻚⾯业务层对象def teardown_class(self):DriverUtil.quit_driver() # 退出浏览器对象def setup(self):# 打开⾸⻚self.driver.get('http://127.0.0.1/')# 点击登录# self.driver.find_element_by_link_text('登录').click()self.index_task.go_to_login() # 跳转登录def teardown(self):passdef test_account_does_not_exist(self):"""账号不存在测试⽅法"""# # 2. 输⼊⼀个不存在的⽤户名#
self.driver.find_element_by_id('username').send_keys('13811110001')# # 3. 输⼊密码#
self.driver.find_element_by_id('password').send_keys('123456')# # 4. 输⼊验证码#
self.driver.find_element_by_id('verify_code').send_keys('8888')# # 5. 点击登录按钮# self.driver.find_element_by_name('sbtbutton').click()self.login_task.login_method('13811110001', '123456', '8888')# 6. 获取错误提示信息msg = get_alert_msg() # 获取弹窗信息print('错误信息为:', msg)def test_wrong_password(self):"""密码错误测试⽅法"""# # 2. 输⼊⽤户名#
self.driver.find_element_by_id('username').send_keys('13800001111')# # 3. 输⼊错误密码#self.driver.find_element_by_id('password').send_keys('error')# # 4. 输⼊验证码#
self.driver.find_element_by_id('verify_code').send_keys('8888')# # 5. 点击登录按钮# self.driver.find_element_by_name('sbtbutton').click()self.login_task.login_method('13800001111', 'error', '8888')# 6. 获取错误提示信息msg = get_alert_msg() # 获取弹窗信息print('错误信息为:', msg)if __name__ == '__main__':pytest.main(['-s', 'tpshop_login.py'])
7. v5 版本
7.1 PO ⽂件对象层代码优化
class LoginPage(object):"""登录对象层"""def __init__(self):self.driver = DriverUtil.get_driver() # 获取浏览器对象# 说明: 将元素的定位⽅法及特征值封装成属性, 能够实现集中管理⽬标元素的定位⽅法及特征值self.name = (By.ID, 'username') # ⽤户名self.pwd = (By.ID, 'password') # 密码self.code = (By.ID, 'verify_code') # 验证码self.btn = (By.NAME, 'sbtbutton') # 登录按钮def find_username(self):"""定位⽤户名⽅法"""# return self.driver.find_element_by_id('username')# return self.driver.find_element(By.ID, 'username')return self.driver.find_element(self.name[0], self.name[1])def find_password(self):"""定位密码⽅法"""# return self.driver.find_element_by_id('password')return self.driver.find_element(self.pwd[0], self.pwd[1])def find_verify_code(self):"""定位验证码⽅法"""# return self.driver.find_element_by_id('verify_code')return self.driver.find_element(self.code[0], self.code[1])def find_login_btn(self):"""定位登录按钮⽅法"""# return self.driver.find_element_by_name('sbtbutton')return self.driver.find_element(self.btn[0], self.btn[1])
7.2 PO ⽂件操作层代码优化
class LoginHandle(object):"""登录操作层"""def __init__(self):self.login_page = LoginPage() # 获取对象层对象def input_username(self, name):"""输⼊⽤户名⽅法"""# 说明: 在执⾏输⼊操作前, 应该先执⾏清空操作self.login_page.find_username().clear()self.login_page.find_username().send_keys(name)def input_password(self, pwd):"""输⼊密码⽅法"""self.login_page.find_password().clear()self.login_page.find_password().send_keys(pwd)def input_verify_code(self, code):"""输⼊验证码⽅法"""self.login_page.find_verify_code().clear()self.login_page.find_verify_code().send_keys(code)def click_login_btn(self):"""点击登录按钮⽅法"""self.login_page.find_login_btn().click()
相关文章:
六、UI自动化测试06--PO设计模式
目录 一、PO 设计模式1. v1 版本1.1 v1.11.2 v1.2 2. v2 版本3. ⽅法封装套路4. v3 版本4.1 浏览器对象管理类的实现4.2 浏览器对象管理类的优化4.3 浏览器对象管理类的使⽤4.4 获取弹窗信息⽅法的封装 5. PO 设计模式6. v4 版本6.1 PO⻚⾯元素封装步骤6.2 测试⽤例的最终代码样…...
电子病历高质量语料库构建方法与架构项目(智能数据目录篇)
电子病历高质量语料库的构建是医疗人工智能发展的基础性工作,而智能数据目录作为数据治理的核心组件,能够有效管理这些语料资源。本文将系统阐述电子病历高质量语料库的构建方法与架构,特别聚焦于智能数据目录的设计与实现,包括数据目录的功能定位、元数据管理、构建步骤以…...
DeepSeek最新大模型发布-DeepSeek-Prover-V2-671B
2025 年 4 月 30 日,DeepSeek 开源了新模型 DeepSeek-Prover-V2-671B,该模型聚焦数学定理证明任务,基于混合专家架构,使用 Lean 4 框架进行形式化推理训练,参数规模达 6710 亿,结合强化学习与大规模合成数据…...
论文公式根据章节自动编号教程
目录 一、操作前提二、具体操作步骤 插入公式编号添加括号(如需) 问答 摘要: 在撰写论文等文档时,让公式根据章节自动编号能大幅提升排版效率。 一、操作前提 先将每一章标题设置为多级标题。可点击Word“多级列表” - “定义…...
「Mac畅玩AIGC与多模态10」开发篇06 - 使用自定义翻译插件开发智能体应用
一、概述 本篇介绍如何在 macOS 环境下,通过编写自定义 OpenAPI Schema,将无需认证的翻译服务接入 Dify 平台,并开发基于实时翻译的智能体应用。本案例培养单提参数 API 调用技巧,实现智能体的实时转换能力。 二、环境准备 1. 确认本地开发环境 macOS 系统Dify 平台已成…...
大连理工大学选修课——机器学习笔记(8):Boosting及提升树
Boosting及提升树 Boosting概述 Bootstrap强调的是抽样方法 不同的数据集彼此独立,可并行操作 Boosting注重数据集改造 数据集之间存在强依赖关系,只能串行实现 处理的结果都是带来了训练集改变,从而得到不同的学习模型 Boosting基本思…...
OpenHarmony - 小型系统内核(LiteOS-A)(十七)标准库
OpenHarmony - 小型系统内核(LiteOS-A)(十七) 二十一、标准库 OpenHarmony内核使用musl libc库,支持标准POSIX接口,开发者可基于POSIX标准接口开发内核之上的组件及应用。 标准库接口框架 图1 POSIX接口…...
vscode详细配置Go语言相关插件
文章目录 vscode详细配置Go语言1.插件介绍1.1 BetterCommments1.2GitGraph1.3Go1.4GoComment1.5goctl1.6Lowlight Go Errors1.7Markdown1.8Material Icon Theme1.9Preetier2.0Project Manager其它插件 2.settings.json文件 vscode详细配置Go语言 1.插件介绍 1.1 BetterCommme…...
如何解决服务器文件丢失或损坏的问题
当服务器文件丢失或损坏时,需采取系统化的恢复和预防措施。以下是分步骤解决方案: --- ### **一、紧急恢复措施** #### 1. **检查文件系统完整性** bash # 对未挂载的分区进行检查(需先umount) fsck -y /dev/sdX # 针对ext4文…...
【C++11】包装器:function 和 bind
📝前言: 这篇文章我们来讲讲C11——包装器:function和bind,对于每个包装器主要讲解: 原型基本语法使用示例 🎬个人简介:努力学习ing 📋个人专栏:C学习笔记 🎀…...
芯知识|小体积语音芯片方案WTV/WT2003H声音播放ic应用解析
在智能硬件设备趋向微型化的背景下,语音芯片方案厂家针对小体积设备开发了多款超小型语音芯片方案,其中WTV系列和WT2003H系列凭借其QFN封装设计、高性能与高集成度,成为微型设备语音方案的理想选择。以下从封装特性、功能优势及典型应用场景三…...
第三部分:特征提取与目标检测
像边缘、角点、特定的纹理模式等都是图像的特征。提取这些特征是许多计算机视觉任务的关键第一步,例如图像匹配、对象识别、图像拼接等。目标检测则是在图像中找到特定对象(如人脸、汽车等)的位置。 本部分将涵盖以下关键主题: …...
MySQL bin目录下的可执行文件
文章目录 MySQL bin目录下的可执行文件1.mysqldump2.mysqladmin3.mysqlcheck4.mysqlimport5.mysqlshow6.mysqlbinlog7.常用可执行文件 MySQL bin目录下的可执行文件 1.mysqldump mysqldump 是 MySQL 的数据库备份工具。对数据备份、迁移或恢复非常重要。 备份整个数据库&…...
第四部分:赋予网页健壮的灵魂 —— TypeScript(中)
目录 4 类与面向对象:构建复杂的组件4.1 类的定义与成员4.2 继承 (Inheritance)4.3 接口实现 (Implements)4.4 抽象类 (Abstract Class)4.5 静态成员 (Static Members) 5 更高级的类型:让类型系统更灵活5.1 联合类型 (|)5.2 交叉类型 (&)5.3 字面量类…...
Learning vtkjs之ImageMarchingCubes
体积 等值面处理 介绍 vtkImageMarchingCubes - 对体积进行等值面处理 给定一个指定的等值,使用Marching Cubes算法生成一个等值面。 效果 新建了一个球,对比一下原始的(透明的)和ISO的效果 核心代码 参数部分 const updat…...
【“星睿O6”AI PC开发套件评测】+ tensorflow 初探
因为本次我的项目计划使用 tensorflow,所以这篇文章主要想做一个引子,介绍如何在“星睿O6”上搭建 tensorflow 的开发环境和验证测试。本文主要分为几个部分: 在“星睿O6”上编译安装 tensorflow基于 MNIST 数据集的模型训练和评估 tensorf…...
通义灵码全面接入Qwen3:AI编程进入智能体时代,PAI云上部署实战解析
引言:AI编程的范式革命 2025年4月30日,阿里云通义灵码宣布全面支持新一代大模型Qwen3,并同步推出编程智能体功能,标志着AI辅助开发从“工具助手”向“自主决策智能体”的跃迁。与此同时,阿里云PAI平台上线Qwen3全系列…...
如何禁止AutoCAD这类软件联网
推荐二、三方法,对其他软件影响最小 一、修改Hosts文件 Hosts文件是一个存储域名与IP地址映射关系的文本文件,通过修改Hosts文件可以将AutoCAD的域名指向本地回环地址(127.0.0.1),从而实现禁止联网的目的。具体步骤如…...
音视频项目在微服务领域的趋势场景题深度解析
音视频项目在微服务领域的趋势场景题深度解析 在互联网大厂Java求职者的面试中,经常会被问到关于音视频项目在微服务领域的应用场景的相关问题。本文通过一个故事场景来展示这些问题的实际解决方案。 第一轮提问 面试官:马架构,欢迎来到我…...
100 个 NumPy 练习
本文翻译整理自:https://github.com/rougier/numpy-100 文章目录 关于 100 个 NumPy 练习相关链接资源关键功能特性 100 个 NumPy 练习题1、导入 NumPy 包并命名为 np (★☆☆)2、打印 NumPy 版本和配置信息 (★☆☆)3、创建一个大小为 10 的空向量 (★☆☆)4、如何…...
在Carla中构建自动驾驶:使用PID控制和ROS2进行路径跟踪
机器人软件开发什么是 P、PI 和 PID 控制器?比例 (P) 控制器比例积分 (PI) 控制器比例-积分-微分 (PID) 控制器横向控制简介CARLA ROS2 集成纵向控制横向控制关键要点结论引用 机器人软件开发 …...
Windows和 macOS 上安装 `nvm` 和 Node.js 16.16.0 的详细教程。
Windows和 macOS 上安装 nvm 和 Node.js 16.16.0 的详细教程。 --- ### 1. 安装 nvm(Node Version Manager) nvm 是一个 Node.js 版本管理工具,可以轻松安装和切换不同版本的 Node.js。 #### Windows 安装 nvm 1. **下载 nvm 安装包**&#x…...
day11 python超参数调整
模型组成:模型 算法 实例化设置的外参(超参数) 训练得到的内参调参评估:调参通常需要进行两次评估。若不使用交叉验证,需手动划分验证集和测试集;但许多调参方法自带交叉验证功能,实际中可省略…...
Linux C++ xercesc xml 怎么判断路径下有没有对应的节点
在Linux环境下使用Xerces-C库处理XML文件时,判断路径下是否存在对应的节点可以通过以下几个步骤实现: 加载XML文档 首先,你需要加载XML文档。这可以通过创建一个xercesc::DOMParser对象并使用它的parse方法来实现。 #include <xercesc/…...
罗技K580蓝牙键盘连接mac pro
罗技K580蓝牙键盘,满足了我们的使用需求。最棒的是,它能够同时连接两个设备,通过按F11和F12键进行切换,简直不要太方便! 连接电脑 💻 USB连接 1、打开键盘:双手按住凹槽两边向前推࿰…...
Socket-UDP
Socket(套接字 )是计算机网络中用于实现进程间通信的重要编程接口,是对 TCP/IP 协议的封装 ,可看作是不同主机上应用进程之间双向通信端点的抽象。以下是详细介绍: 作用与地位 作为应用层与传输层、网络层协议间的中…...
【游戏ai】从强化学习开始自学游戏ai-2 使用IPPO自博弈对抗pongv3环境
文章目录 前言一、环境设计二、动作设计三、状态设计四、神经网路设计五、效果展示其他问题总结 前言 本学期的大作业,要求完成多智能体PPO的乒乓球对抗环境,这里我使用IPPO的方法来实现。 正好之前做过这个单个PPO与pong环境内置的ai对抗的训练&#…...
LeRobot 项目部署运行逻辑(三)——机器人及舵机配置
Lerobot 目前的机器人硬件以舵机类型为主,并未配置机器人正逆运动学及运动学,遥操作映射以舵机关节角度为主 因此,需要在使用前需要对舵机各项参数及初始位置进行配置 目录 1 Mobile ALOHA 配置 2 Dynamixel 配置 2.1 配置软件 2.2 SDK …...
Ubuntu20.04安装NVIDIA Warp
Ubuntu20.04安装NVIDIA Warp 安装测试 Warp的gitee网址 Warp的github网址 写在前面:建议安装前先参考readme文件自检系统驱动和cuda是否支持,个人实测建议是python3.9,但python3.8.20也可以使用。 写在前面:后续本人可能会使用这…...
电子病历高质量语料库构建方法与架构项目(临床情景理解模块篇)
引言 随着人工智能技术在医疗健康领域的广泛应用,电子病历(Electronic Medical Records,EMR)作为临床医疗数据的重要载体,已成为医学研究和临床决策支持的关键资源。电子病历高质量语料库的构建为医疗人工智能模型的训练和应用提供了基础支撑,其中临床情境理解模块是连接…...
WPF性能优化举例
WPF性能优化集锦 一、UI渲染性能优化 1. 虚拟化技术 ListView/GridView虚拟化: <ListView VirtualizingStackPanel.IsVirtualizing="True"VirtualizingStackPanel.VirtualizationMode="Recycling"ScrollViewer.IsDeferredScrollingEnabled=…...
【CUDA pytorch】
ev win10 3050ti 联想笔记本 nvcc --version 得到 PS C:\Users\25515> nvcc --version nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2022 NVIDIA Corporation Built on Tue_May__3_19:00:59_Pacific_Daylight_Time_2022 Cuda compilation tools, release …...
mac下载homebrew 安装和使用git
mac下载homebrew 安装和使用git 本人最近从windows换成mac,记录一下用homebrew安装git的过程 打开终端 command 空格,搜索终端 安装homebrew 在终端中输入下面命令,来安装homebrew /bin/bash -c "$(curl -fsSL https://raw.githu…...
Elasticsearch入门速通01:核心概念与选型指南
一、Elasticsearch 是什么? 一句话定义: 开源分布式搜索引擎,擅长处理海量数据的实时存储、搜索与分析,是ELK技术栈(ElasticsearchKibanaBeatsLogstash)的核心组件。 核心能力: 近实时搜索&…...
应对过度处方挑战:为药物推荐任务微调大语言模型(Xiangnan He)
Abstract 药物推荐系统因其有潜力根据患者的临床数据提供个性化且有效的药物组合,在医疗保健领域备受关注。然而,现有方法在适应不同的电子健康记录(EHR)系统以及有效利用非结构化数据方面面临挑战,导致其泛化能力有限…...
41 python http之requests 库
Python 的requests库就像你的 "接口助手",用几行代码就能发送 HTTP 请求,自动处理复杂的网络交互,让你告别手动拼接 URL 和解析响应的痛苦! 一、快速入门:3 步搞定基本请求 1.1 安装库:一键开启助手功能 pip install requests 1.2 发送 GET 请求 import r…...
百度网盘golang实习面经
goroutine内存泄漏的情况?如何避免? goroutine内存泄漏基本上是因为异常导致阻塞, 可以导致阻塞的情况 1 死锁, goroutine 等待的锁发生了死锁情况 2 chan没有正常被关闭,导致读取读chan的goroutine阻塞 如何避免 1 避免死锁 2 正常关闭 3 使用context管…...
super_small_toy_tpu
super_small_toy_tpu 小狼http://blog.csdn.net/xiaolangyangyang 1、基础框图 2、源码下载: GitHub - dldldlfma/super_small_toy_tpu 3、安装iverilog、vvp、gtkwave windows安装:https://bleyer.org/icarus/ ubuntu安装:sudo ap…...
Redis缓存穿透、缓存击穿与缓存雪崩:如何在.NET Core中解决
在高并发的互联网系统中,缓存技术作为优化系统性能的重要手段,已被广泛应用。然而,缓存系统本身也存在一些常见的问题,尤其是 缓存穿透、缓存击穿 和 缓存雪崩。这些问题如果处理不当,可能导致系统性能严重下降&#x…...
驱动车辆诊断测试创新 | 支持诊断测试的模拟器及数据文件转换生成
一 背景和挑战 | 背景: 随着汽车功能的日益丰富,ECU和域控制器的复杂性大大增加,导致测试需求大幅上升,尤其是在ECU的故障诊断和性能验证方面。然而,传统的实车测试方法难以满足高频率迭代和验证需求,不仅…...
VS Code技巧2:识别FreeCAD对象
在使用VS Code阅读FreeCAD代码或者FreeCAD的工作台代码时,VS Code无法识别FreeCAD对象,会提示Import “FreeCAD” could not be resolved: 问题解决如下几步即可。 第一步:确认 FreeCAD 的 Python 环境路径 在FreeCAD的Python控制…...
泰迪杯特等奖案例学习资料:基于多模态融合与边缘计算的智能温室环境调控系统
(第十二届泰迪杯数据挖掘挑战赛特等奖案例解析) 一、案例背景与核心挑战 1.1 应用场景与行业痛点 在现代设施农业中,温室环境调控直接影响作物产量与品质。传统温室管理存在以下问题: 环境参数耦合性高:温度、湿度、光照、CO₂浓度等参数相互影响,人工调控易顾此失彼。…...
猿人学web端爬虫攻防大赛赛题第13题——入门级cookie
1. F12开发者模式 刷新第一页,仔细研究发现里面有三次请求名为13的请求,根据题目提示cookie关键字,所以主要留意请求和响应的cookie值。 三次请求都带了sessionid,说明存在session(后面写代码要用session来写&#x…...
机器指标监控技术方案
文章目录 机器指标监控技术方案架构图组件简介Prometheus 简介核心特性适用场景 Grafana 简介核心特性适用场景 Alertmanager 简介核心特性适用场景 数据采集机器Node ExporterMySQL ExporterRedis ExporterES ExporterRocketMQ ExporterSpringcloud ExporterNacos 数据存储短期…...
数据库设计理论:从需求分析到实现的全流程解析
引言 在当今信息爆炸的时代,数据已成为企业和组织最宝贵的资产之一。如何有效地组织、存储和管理这些数据,是数据库设计需要解决的核心问题。一个优秀的数据库设计能够提高系统性能,确保数据一致性,降低维护成本,而糟…...
一文详解 Linux下的开源打印系统CUPS(Common UNIX Printing System)
文章目录 前言一、CUPS 简介二、CUPS 常用指令解析2.1 安装 CUPS2.2 启动/重启服务2.3 添加打印机(核心操作)2.4 设置默认打印机2.5 打印文件2.6 查看打印任务2.7 取消打印任务2.8 查看、移除已添加的打印机 三、调试与常见问题3.1 日志查看3.2 驱动问题…...
uniapp打包apk详细教程
目录 1.打apk包前提条件 2.获取uni-app标识 3.进入dcloud开发者后台 4.开始打包 1.打apk包前提条件 1.在HBuilderX.exe软化中,登录自己的账号 2.在dcloud官网,同样登录自己的账号。没有可以免费注册。 2.获取uni-app标识 获取方法:点…...
C++初阶-string类2
目录 1.迭代器 1.1普通迭代器的使用 1.2string::begin 1.3string::end 1.4const迭代器的使用 1.5泛型迭代器和const反向迭代器 1.6string::rbegin 1.6string::rend 1.7string::cbegin、string::cend、string::crbegin、string::crend 与begin/end、rbegin/rend的区别 …...
Qt QComboBox 下拉复选多选(multicombobox)
Qt QComboBox 下拉复选多选(multicombobox),备忘,待更多测试 【免费】QtQComboBox下拉复选多选(multicombobox)资源-CSDN文库...
逻辑回归之参数选择:从理论到实践
在机器学习的广阔领域中,逻辑回归作为一种经典的有监督学习算法,常用于解决分类问题。它以其简单易懂的原理和高效的计算性能,在实际应用中备受青睐。然而,要充分发挥逻辑回归的优势,参数选择是关键环节。本文将结合信…...