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

Appium+python自动化(二十四) - 元素等待(超详解)

思考

  在自动化过程中,元素出现受网络环境,设备性能等多种因素影响。因此元素加载的时间可能不一致,从而会导致元素无法定位超时报错,但是实际上元素是正常加载了的,只是出现时间晚一点而已。那么如何解决这个问题呢?

实际测试过程中,比如点击一个控件需要启动一个新activiy界面,或需要加载弹框,或请求网络加载数据成功后刷新界面,此时需要等待一段时间,新界面出现了才能继续执行UI操作,否则还在加载中,程序已开始执行新界面操作的代码,脚本就会报错了。

元素等待作用

1.设置元素等待可以更加灵活的制定等待定位元素的时间,从而增强脚本的健壮性,提高执行效率。

2.元素等待是为了解决如下场景的问题:脚本执行时,脚本的执行速度和页面元素的加载速度未必一致,也就是说,可能出现脚本已经运行到某个元素,但该元素尚未加载到页面,此时脚本会因无法定位到该元素而导致执行失败。元素等待本质是为了解决时序上不匹配的问题。

元素等待类型

类型特点举例
强制等待

设置固定的等待时间

from time import sleep
#强制等待5秒
sleep(5)

隐式等待

针对全部元素设置的等待时间

driver.implicitly_wait(5)

显示等待

针对某个元素来设置的等待时间

from selenium.webdriver.support.ui import WebDriverWait

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

强制等待

设置固定的等待时间,使用sleep()方法即可实现

sleep(): 设置固定休眠时间。 python 的 time 包提供了休眠方法 sleep() , 导入 time包后就可以使用 sleep()进行脚本的执行过程进行休眠。

1 from time import sleep
2 
3 #强制等待5秒
4 
5 sleep(5)

隐式等待

隐式等待是针对全部元素设置的等待时间

 1 #implicitly_wait():是 webdirver 提供的一个超时等待。隐的等待一个元素被发现,或一个命令完成。如果超出了设置时间的则抛出异常。2 #implicitly_wait():隐式等待3 #当使用了隐士等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常4 #换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是05 #一旦设置了隐式等待,则它存在整个 WebDriver 对象实例的声明周期中,隐式的等到会让一个正常响应的应用的测试变慢,6 #它将会在寻找每个元素的时候都进行等待,这样会增加整个测试执行的时间。7 8 #implicitly_wait()方法比 sleep() 更加智能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待。9 
10 driver.implicitly_wait(20)

显式等待

显式等待是针对某个元素来设置的等待时间。

WebDriverWait():同样也是 webdirver 提供的方法。在设置时间内,默认每隔一段时间检测一次当前。页面元素是否存在,如果超过设置时间检测不到则抛出异常。

方法WebDriverWait格式参数如下:

 1 '''详细格式如下:2 WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)3 driver - WebDriver 的驱动程序(Ie, Firefox, Chrome 或远程)4 timeout - 最长超时时间,默认以秒为单位5 poll_frequency - 休眠时间的间隔(步长)时间,默认为 0.5 秒6 ignored_exceptions - 超时后的异常信息,默认情况下抛 NoSuchElementException 异常。7 WebDriverWai()一般由 until()或 until_not()方法配合使用,下面是 until()和 until_not()方法的说明。8 until(method, message=’’)9 调用该方法提供的驱动程序作为一个参数,直到返回值不为 False。
10 until_not(method, message=’’)
11 调用该方法提供的驱动程序作为一个参数,直到返回值为 False。
12 lambda
13 lambda 提供了一个运行时动态创建函数的方法。'''
14 
15 from selenium.webdriver.support.ui import WebDriverWait
16 
17 WebDriverWait(driver,10).until(lambda x:x.find_element_by_id("elementID"))

其中,三种等待方法的作用和区别,如下:

强制等待,也就是常说的死等待,使用time模块提供的sleep方法,脚本在等待sleep(x) x秒后才执行,此时脚本也许出现了无效等待,即元素已经出现,可以继续操作,但因指定的时间未到,脚本无法执行,因而,在实际Web UI开发中应杜绝sleep等待;

显式等待,WebDriver提供的针对元素级别的、灵活、智能的等待方法,通过配合until()、until_not()、ExpectedCondition等条件的使用,默认每500ms检查一次条件状态,可以及时将脚本从等待中唤醒,避免无效等待,在实际应用中推荐使用该方法。

该等待的调用方法如下:

WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息)

隐式等待,WebDriver提供的针对driver级别的适用整个生命周期的等待方法,该等待是全局设置,因而只需在实例化driver后设置一次即可。从等待作用上看,是可以满足需要的,但是考虑到实际应用场景,driver要等待的元素和脚本要操作的元素未必相同,也就是说,脚本要操作的元素已经出现,但因为设置了全局等待,driver也会继续等待页面上其他无关元素,直至整个页面加载完毕。因而,与显式等待相比,可能出现无效等待的情况。

等待方法实战举例

1.强制等待方法应用实例

 1 # coding=utf-82 # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行3 4 # 2.注释:包括记录创建时间,创建人,项目名称。5 '''6 Created on 2019-7-267 @author: 潇潇说测试8 Project:学习和使用appium自动化测试-元素等待9 '''
10 # 3.导入模块
11 from appium import webdriver
12 import time
13 desired_caps = {}
14 desired_caps['platformName'] = 'Android'   #android的apk还是IOS的ipa
15 desired_caps['platformVersion'] = '8.0'  #android系统的版本号
16 desired_caps['deviceName'] = '127.0.0.1:62001'    #手机设备名称,通过adb devices  查看
17 desired_caps['appPackage'] = 'com.taobao.taobao'  #apk的包名
18 desired_caps['appActivity'] = 'com.taobao.tao.welcome.Welcome'  #apk的launcherActivity
19 desired_caps['unicodeKeyboard'] = True   #使用unicodeKeyboard的编码方式来发送字符串
20 desired_caps['resetKeyboard'] = True   #将键盘给隐藏起来
21 driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) #启动服务器地址,后面跟的是手机信息
22 # 休眠五秒等待页面加载完成
23 time.sleep(5)   #强制等待5s,不管等待的元素是否出现,都要等5s
24 driver.find_element_by_id("com.taobao.taobao:id/home_searchedit").click()
25 time.sleep(3)  #演示效果
26 driver.find_element_by_id("com.taobao.taobao:id/searchEdit").click()
27 driver.find_element_by_id("com.taobao.taobao:id/searchEdit").send_keys(u"潇潇")
28 driver.quit()

2.显示等待方法应用实例

 1 # coding=utf-82 # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行3 4 # 2.注释:包括记录创建时间,创建人,项目名称。5 '''6 Created on 2019-7-267 @author: 潇潇说测试8 Project:学习和使用appium自动化测试-元素等待9 '''
10 # 3.导入模块
11 from appium import webdriver
12 from selenium.webdriver.support.ui import WebDriverWait
13 import time
14 desired_caps = {}
15 desired_caps['platformName'] = 'Android'   #android的apk还是IOS的ipa
16 desired_caps['platformVersion'] = '8.0'  #android系统的版本号
17 desired_caps['deviceName'] = '127.0.0.1:62001'    #手机设备名称,通过adb devices  查看
18 desired_caps['appPackage'] = 'com.taobao.taobao'  #apk的包名
19 desired_caps['appActivity'] = 'com.taobao.tao.welcome.Welcome'  #apk的launcherActivity
20 desired_caps['unicodeKeyboard'] = True   #使用unicodeKeyboard的编码方式来发送字符串
21 desired_caps['resetKeyboard'] = True   #将键盘给隐藏起来
22 driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) #启动服务器地址,后面跟的是手机信息
23 try:
24     # 显示等待(等待特定元素出现)
25     WebDriverWait(driver, 3).until(lambda x: x.find_element_by_id('com.taobao.taobao:id/home_searchedit'))
26     driver.find_element_by_id("com.taobao.taobao:id/home_searchedit").click()
27     time.sleep(3)  # 演示效果
28     driver.find_element_by_id("com.taobao.taobao:id/searchEdit").click()
29     driver.find_element_by_id("com.taobao.taobao:id/searchEdit").send_keys(u"潇潇")
30 finally:
31     driver.quit()

3.隐式等待方法应用实例

 1 # coding=utf-82 # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行3 4 # 2.注释:包括记录创建时间,创建人,项目名称。5 '''6 Created on 2019-7-267 @author: 潇潇说测试8 Project:学习和使用appium自动化测试-元素等待9 '''
10 # 3.导入模块
11 from appium import webdriver
12 from selenium.webdriver.support.ui import WebDriverWait
13 import time
14 desired_caps = {}
15 desired_caps['platformName'] = 'Android'   #android的apk还是IOS的ipa
16 desired_caps['platformVersion'] = '8.0'  #android系统的版本号
17 desired_caps['deviceName'] = '127.0.0.1:62001'    #手机设备名称,通过adb devices  查看
18 desired_caps['appPackage'] = 'com.taobao.taobao'  #apk的包名
19 desired_caps['appActivity'] = 'com.taobao.tao.welcome.Welcome'  #apk的launcherActivity
20 desired_caps['unicodeKeyboard'] = True   #使用unicodeKeyboard的编码方式来发送字符串
21 desired_caps['resetKeyboard'] = True   #将键盘给隐藏起来
22 driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) #启动服务器地址,后面跟的是手机信息
23 
24 # 隐式等待(等待所有元素)
25 driver.implicitly_wait(3)  #隐式等待,最长3s
26 driver.find_element_by_id("com.taobao.taobao:id/home_searchedit").click()
27 time.sleep(3)  #演示效果
28 driver.find_element_by_id("com.taobao.taobao:id/searchEdit").click()
29 driver.find_element_by_id("com.taobao.taobao:id/searchEdit").send_keys(u"潇潇")
30 driver.quit()

小结

1.本节主要介绍appium自动化中三种元素等待方法,并讲解了各自的优缺点,实际开发中推荐使用显示等待,最后,为了便于理解和应用,针对每种等待方法,编写了对应的脚本。

2.强制等待的方法,在debug时候很有用,不过建议慎用这种方法,因为太死板,严重影响程序执行速度!

3.以上三种等待方法,在具体的场景中需要根据情况选择合适的方法,灵活运用。。。

4.做过自动化的小伙伴们或者童鞋们,在启动app的时候,幸运的小伙伴和同学们都会中这个大奖:如果直接做下一步点击操作,经常会报错,于是我们便会自然而然的想到上边介绍的三种方法,会在启动完成的时候加sleep等方法。那么问题来了,问你这个sleep时间到底设置多少合适呢?你不知道我也不知道这个问题的答案,如果设置长了,就浪费时间,设置短了,就会找不到元素报错了。过长过短都是个让你头疼的事,那么有没有别的方法可以克服这个问题了。当然有,一般人都不告诉他,大家都是二般人,就分享给各位吧!但是这个只是针对安卓手机的哦,要记住了,iPhone不适合的。这个时候我们可以用wait_activity的语法,等到你想点击的页面activity出现了,再点击,可以有效的节省时间。

wait_activity

(1)查看源码

 1 def wait_activity(self, activity, timeout, interval=1):2     """Wait for an activity: block until target activity presents3     or time out.4     5     This is an Android-only method.6 7     :Agrs:8      - activity - target activity9      - timeout - max wait time, in seconds
10      - interval - sleep interval between retries, in seconds
11     """
12     try:
13         WebDriverWait(self, timeout, interval).until(
14             lambda d: d.current_activity == activity)
15         return True
16     except TimeoutException:
17         return False

(2)解释说明:

 1 def wait_activity(self, activity, timeout, interval=1):2     """Wait for an activity: block until target activity presents3     or time out.4     5     This is an Android-only method.6 7     :Agrs:8      - activity - target activity9      - timeout - max wait time, in seconds
10      - interval - sleep interval between retries, in seconds
11     """
12     try:
13         WebDriverWait(self, timeout, interval).until(
14             lambda d: d.current_activity == activity)
15         return True
16     except TimeoutException:
17         return False

获取current_activity

(1)打开app后,先sleep10秒,等app完全启动完成进入主页面,然后获取当前界面的activity

 1 # coding=utf-82 # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行3 4 # 2.注释:包括记录创建时间,创建人,项目名称。5 '''6 Created on 2019-7-267 @author: 潇潇说测试8 Project:学习和使用appium自动化测试-元素等待9 '''
10 # 3.导入模块
11 from appium import webdriver
12 from time import sleep
13 desired_caps = {
14                 'platformName': 'Android',
15                 'deviceName': '127.0.0.1:62001',
16                 'platformVersion': '4.4.2',
17                 'appPackage': 'com.baidu.yuedu',
18                 'appActivity': 'com.baidu.yuedu.splash.SplashActivity'
19                 }
20 driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
21 
22 sleep(10)
23 # 获取当前界面activity
24 ac = driver.current_activity
25 print(ac)

(2)运行结果:

等待activity

(1)用sleep太浪费时间了,并且不知道什么时候能启动完成,所以尽量不用sleep,不推荐使用。因为这个确实是太low了。

(2)上一步已经获取当主页面的activity了,那就可以用wait_activity等它出现了,再做下一步的点击操作

img_655261fd782532bb9276d67dac7b5e5b.png

(3)参考代码

 1 # coding=utf-82 # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行3 4 # 2.注释:包括记录创建时间,创建人,项目名称。5 '''6 Created on 2019-7-267 @author: 潇潇说测试8 Project:学习和使用appium自动化测试-元素等待9 '''
10 # 3.导入模块
11 from appium import webdriver
12 from time import sleep
13 desired_caps = {
14                 'platformName': 'Android',
15                 'deviceName': '127.0.0.1:62001',
16                 'platformVersion': '4.4.2',
17                 'appPackage': 'com.baidu.yuedu',
18                 'appActivity': 'com.baidu.yuedu.splash.SplashActivity'
19                 }
20 driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
21 
22 sleep(10)
23 # 获取当前界面activity
24 ac = driver.current_activity
25 print(ac)

5.  好了,关于元素等待目前就说这么多!!!


              【下面是我整理的2023年最全的软件测试工程师学习知识架构体系图】


一、Python编程入门到精通

二、接口自动化项目实战

三、Web自动化项目实战


四、App自动化项目实战

五、一线大厂简历


六、测试开发DevOps体系

七、常用自动化测试工具


八、JMeter性能测试

九、总结(尾部小惊喜)

生命不息,奋斗不止。每一份努力都不会被辜负,只要坚持不懈,终究会有回报。珍惜时间,追求梦想。不忘初心,砥砺前行。你的未来,由你掌握!

生命短暂,时间宝贵,我们无法预知未来会发生什么,但我们可以掌握当下。珍惜每一天,努力奋斗,让自己变得更加强大和优秀。坚定信念,执着追求,成功终将属于你!

只有不断地挑战自己,才能不断地超越自己。坚持追求梦想,勇敢前行,你就会发现奋斗的过程是如此美好而值得。相信自己,你一定可以做到!

相关文章:

Appium+python自动化(二十四) - 元素等待(超详解)

思考 在自动化过程中,元素出现受网络环境,设备性能等多种因素影响。因此元素加载的时间可能不一致,从而会导致元素无法定位超时报错,但是实际上元素是正常加载了的,只是出现时间晚一点而已。那么如何解决这个问题呢&am…...

NFT市场泡沫破裂了吗?投资NFT是否仍然安全?

近期,NFT市场的价格出现了明显的下跌趋势,许多人开始担心NFT市场是否已经进入了泡沫破裂的阶段。但是,我们需要认真分析这个问题,并且探讨投资NFT是否仍然安全。 NFT(Non-Fungible Token)是一种非同质化代币…...

k8s使用helm部署Harbor镜像仓库并启用SSL

1、部署nfs存储工具 参照:https://zhaoll.blog.csdn.net/article/details/128155767 2、部署helm 有多种安装方式,根据自己的k8s版本选择合适的helm版本 参考:https://blog.csdn.net/qq_30614345/article/details/131669319 3、部署Harbo…...

B/B+树算法

B树 基本概述 B树又称多路平衡搜索树。一棵m阶B树,要么是空树,要么满足以下特性: 每个节点最多有m棵子树根节点至少有两棵子树内部节点(除根和叶子节点以外的节点)至少有⌈m/2⌉棵子树关键字个数比子树个数少1终端节…...

vue3.2 + elementPlus + Windi CSS + ts创建一个好用的可兼容不同宽高的login页面

1.效果预览 2. 代码准备 导入windiCSS: npm i -D vite-plugin-windicss windicss windiCSS官网: https://cn.windicss.org/integrations/vite.html 使用vite创建好你的vue工程 sass版本为: 1.49.9 3.Windi CSS在页面中使用 apply 二次定义类名…...

Integer包装类详解加部分源码

【1】Java.lang直接使用&#xff0c;无需导包&#xff1a; 【2】类的继承关系&#xff1a; 【3】实现接口&#xff1a; Serializable&#xff0c;Comparable<Integer> 【4】这个类被final修饰&#xff0c;那么这个类不能有子类&#xff0c;不能被继承&#xff1a; 【5】…...

如何给侧边栏添加 Badge 计数标记

一、需求功能 给侧边菜单栏或及子菜单栏添加计数标记 el-badge 效果如下&#xff1a; 二、实现思路 结合 icon 图标渲染的思路&#xff0c;通过在layout 的 item.vue 中使用 vnodes.push 方法实现对 <el-badge /> 的渲染。在通过 Vuex 的状态管理将菜单栏需要的数据转…...

插槽slot复习

1.认识插槽 ◼ 在开发中&#xff0c;我们会经常封装一个个可复用的组件&#xff1a;  前面我们会通过props传递给组件一些数据&#xff0c;让组件来进行展示&#xff1b;  但是为了让这个组件具备更强的通用性&#xff0c;我们不能将组件中的内容限制为固定的div、span等等…...

【C++STL标准库】序列容器之deuqe与、orwa_list与list

基本概念这里就不再浪费时间去解释&#xff0c;这里给出deuqe与、orwa_list、list的基本使用方法&#xff1a; deque队列&#xff1a; #include <iostream> #include <deque>template <typename T> void print(T Begin, T End);int main() {std::deque<…...

RocketMQ教程-(5)-功能特性-消息发送重试和流控机制

本文为您介绍 Apache RocketMQ 的消息发送重试机制和消息流控机制。 背景信息​ 消息发送重试 Apache RocketM Q的消息发送重试机制主要为您解答如下问题&#xff1a; 部分节点异常是否影响消息发送&#xff1f; 请求重试是否会阻塞业务调用&#xff1f; 请求重试会带来什…...

OpenCV笔记

opencv读取视频操作 import cv2video cv2.VideoCapture("./1.mp4")if video.isOpened():# video.read() 一帧一帧地读取# open 得到的是一个布尔值&#xff0c;就是 True 或者 False# frame 得到当前这一帧的图像open, frame video.read() else:open Falsewhile …...

Mysql基础(下)之函数,约束,多表查询,事务

&#x1f442; 回到夏天&#xff08;我多想回到那个夏天&#xff09; - 傲七爷/小田音乐社 - 单曲 - 网易云音乐 截图自 劈里啪啦 -- 黑马Mysql&#xff0c;仅学习使用 &#x1f447;原地址 47. 基础-多表查询-表子查询_哔哩哔哩_bilibili 目录 &#x1f982;函数 &#x1f3…...

Android 屏幕适配各种宽高比的手机

由于android 手机的屏幕宽高比样式太多了&#xff0c;在设计UI时&#xff0c;很多时候&#xff0c;会因为宽高比&#xff0c;分辨率不同会有展示上的差异。 我是这样解决的 在activity的onCreate方法前&#xff0c;调用&#xff1a; fun screenFit(context: Context) {val me…...

云计算——云计算与虚拟化的关系

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 前言 一.虚拟化 1.什么是虚拟化 2.虚拟化技术作用 二.云计算与虚拟化的关系 三.虚…...

手机变局2023:一场瞄准产品和技术的“思维革命”

以折叠屏冲高端&#xff0c;已成为中国手机厂商们的共识。 在这个苹果未涉足的领域&#xff0c;国产手机厂商们加快脚步迭代推新&#xff0c;积极抢占机遇。但平心而论&#xff0c;虽然国产折叠屏机型众多&#xff0c;但市场上始终缺乏一款突破性的产品作为标杆&#xff0c;为…...

【Linux】自动化构建工具-make/Makefile详解

前言 大家好吖&#xff0c;欢迎来到 YY 滴 Linux系列 &#xff0c;热烈欢迎&#xff01;本章主要内容面向接触过Linux的老铁&#xff0c;主要内容含 欢迎订阅 YY 滴Linux专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 订阅专栏阅读&#xff1a;YY的《…...

1 js嵌入html使用

1.1 直接在html内部使用js代码 使用script标签&#xff0c;在前后标签内部写的代码即为js代码。 <body><p id"p1">初始段落</p> <!--id是为了定位需要更改内容的标签--><button type"button" onclick"showNum()">…...

总结RoctetMQ

RoctetMQ 定义优缺点场景使用方式消息顺序问题死信幂等性可视化面板 定义 优缺点 场景 使用方式 消息顺序问题 死信 幂等性 可视化面板...

命名约定~

1.变量的命名约定 JavaScript 变量名称是区分大小写的&#xff0c;大写和小写字母是不同的。比如&#xff1a; let DogName Scooby-Doo; let dogName Droopy; let DOGNAME Odie; console.log(DogName); // "Scooby-Doo" console.log(dogName); // "Dro…...

Python基础-列表(list)和元组(tuple)

Python包含6种内建的序列&#xff1a;列表&#xff0c;元组&#xff0c;字符串&#xff0c;Unicode字符串&#xff0c;buffer对象&#xff0c;xrange对象&#xff0c;本文讨论列表和元组。 1.列表可以修改&#xff0c;元组则不能修改。 2.几乎在所有的情况下&#xff0c;列表…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...