软件测试 —— Selenium(等待)
软件测试 —— Selenium(等待)
- 一个例子
- 强制等待
- 使用示例:
- 为什么不推荐使用强制等待?
- 更好的选择
- 隐式等待 implicitly_wait()
- 隐式等待和强制等待的区别
- 隐式等待(Implicit Wait)
- 强制等待(Hardcoded Wait 或 Forced Wait)
- 显示等待 WebDriverWait(driver,sec).until(functions)
- 优点
- 缺点
- 显示等待和隐式等待的区别
- 显示等待(Explicit Wait)
- 隐式等待(Implicit Wait)
- 总结
- 隐式等待和显示等待混用
自动化测试的时候,我们代码的速度是比网页渲染的速度要快的多,如果我们代码都执行完了,网页还没有渲染好的话,就会出现一些问题,这个时候我们就得等待,等待网页渲染完毕之后才能进行交互:
一个例子
我们在百度搜索“老番茄”,然后点击他的百度百科:
import timefrom selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.service import Service
from webdriver_manager.firefox import GeckoDriverManagerFireFoxIns = GeckoDriverManager().install()driver = webdriver.Firefox(service=Service(FireFoxIns))driver.get("https://www.baidu.com/")
time.sleep(3)driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("老番茄")
driver.find_element(By.CSS_SELECTOR,"#su").click()driver.find_element(By.CSS_SELECTOR,".pc-tag_2Nde8")driver.quit()
然后代码会报错:
这是因为,我们代码执行的速度太快了网页还没有渲染完,这个时候自然也找不到百度百科的词条。
此时,我们可以在点击之后休眠3秒:
这个时候就没问题,因为网页已经渲染完了,这个时候百度百科的词条自然也就可以找得到了。这次成功的原因是,我么在点击之后等待了3秒,这个时候网页已经渲染好了。所以,适当的等待可以让网页有充分的时间去渲染,接下来我们要学习三种等待方式:
强制等待
强制等待或硬编码等待的方式。这种方式通过使用编程语言提供的睡眠函数来实现,比如 Python 的 time.sleep() 函数。强制等待会暂停脚本执行一个指定的时间长度,不论在这段时间内元素是否变得可用
强制等待是最简单但也可能是最不推荐的一种等待方式,因为它并不智能,也不考虑实际的页面加载状态或元素就绪情况。它只是简单地暂停测试脚本一段固定的时间,这可能会导致测试时间不必要的延长,并且在不同的网络环境或设备上表现不稳定。
使用示例:
import time# 打开浏览器并导航到目标网页
driver.get('http://example.com')# 强制等待5秒
time.sleep(5)# 继续执行后续操作...
为什么不推荐使用强制等待?
- 效率低下:即使元素在很短的时间内就已经可用,强制等待也会按照设定的时间长度进行等待,浪费时间。
- 不可靠性:如果等待的时间不够长,可能导致元素还没准备好就被尝试访问;如果太长,则会无谓地增加测试时间。
- 维护成本高:每当页面加载时间变化时,都需要调整这些硬编码的等待时间。
更好的选择
通常情况下,应该优先使用显式等待或 Fluent Wait 来处理动态内容,因为它们可以根据具体的条件来决定何时继续执行测试脚本,从而提供更可靠和高效的解决方案。
如果你确实需要在一个特定的位置添加短暂的停顿,比如为了让人眼观察某个动作的效果,可以考虑使用较短的强制等待。但在自动化测试中,应尽量避免使用强制等待,转而采用更加智能的等待策略。
隐式等待 implicitly_wait()
在 Selenium WebDriver 中,主要提供了三种类型的等待机制来同步测试脚本与网页加载行为:
- 隐式等待(Implicit Wait):
隐式等待是全局设置的,它告诉 WebDriver 在尝试查找元素时,如果元素没有立即出现,则等待一段时间再抛出NoSuchElementException
。一旦设置了隐式等待,它将应用于所有后续的元素定位调用。
from selenium import webdriverdriver = webdriver.Chrome()driver.implicitly_wait(10) # 等待最长10秒
隐式等待和强制等待的区别
隐式等待(Implicit Wait)和强制等待(Hardcoded Wait 或 Forced Wait)是两种不同的等待机制,它们在 Selenium WebDriver 中用于处理元素加载的时间问题。以下是两者的主要区别:
隐式等待(Implicit Wait)
- 智能等待:隐式等待是一种全局设置,它告诉 WebDriver 在查找元素时,如果元素没有立即出现,则等待一段时间再抛出
NoSuchElementException
。在这段时间内,WebDriver 会定期轮询 DOM 查找元素。
- 适用范围:一旦设置了隐式等待,它将应用于所有后续的元素定位调用。这意味着对于每个找不到的元素,WebDriver 都会等待设定的时间。
- 灵活性:隐式等待可以根据页面的实际加载情况自动调整,而不需要为每个元素单独编写等待逻辑。
- 代码简洁性:只需要一行代码就可以为整个测试脚本设置隐式等待,简化了代码结构。
- 性能影响:虽然隐式等待可以提高测试的稳定性,但在某些情况下可能会导致测试执行时间延长,特别是当页面上的许多元素都需要等待的时候。
- 实现方式:
driver.implicitly_wait(10) # 等待最长10秒
强制等待(Hardcoded Wait 或 Forced Wait)
- 固定等待:强制等待使用编程语言提供的睡眠函数(如 Python 的
time.sleep()
),来暂停脚本执行一个指定的时间长度,不论在这段时间内元素是否变得可用。
- 非智能:强制等待不会根据元素的状态或页面加载情况作出反应,它只是简单地暂停测试脚本一段固定的时间。
- 适用范围:每次需要暂停时都必须显式地调用睡眠函数,并且只对当前行代码生效。
- 缺乏灵活性:由于它是基于固定时间的,因此不能适应不同环境下的页面加载速度变化。
- 代码冗余:如果多个地方需要等待,那么就需要在每一处都插入相应的睡眠语句,增加了代码的冗余度。
- 性能影响:即使元素已经准备好,强制等待也会按照设定的时间长度进行等待,这可能导致不必要的延迟,尤其是在快速网络环境下。
- 实现方式:
import timetime.sleep(5) # 暂停5秒
- 推荐使用隐式等待,因为它更智能、更灵活,能够根据实际情况自动调整,避免了硬编码等待带来的低效率和不可预测性。
- 尽量避免使用强制等待,除非你确实需要在特定的位置添加短暂的停顿,比如为了让人眼观察某个动作的效果。但在自动化测试中,应优先考虑使用隐式等待或显式等待等更智能的等待策略。
显示等待 WebDriverWait(driver,sec).until(functions)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.firefox import GeckoDriverManagerFireFoxIns = GeckoDriverManager().install()driver = webdriver.Firefox(service=Service(FireFoxIns))try:# 打开百度首页driver.get("https://www.baidu.com/")# 创建一个 WebDriverWait 实例,设置最大等待时间为10秒wait = WebDriverWait(driver, 10)# 等待搜索框出现并输入搜索关键词search_box = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#kw")))search_box.send_keys("老番茄")# 等待搜索按钮出现并点击它search_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#su")))search_button.click()# 等待搜索结果中的特定元素出现result_element = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".pc-tag_2Nde8")))finally:# 完成后关闭浏览器driver.quit()
下面是一些方法
方法 | 说明 |
---|---|
title_is(title) | 检查页面标题是否等于指定的期望值。 |
title_contains(partial_title) | 检查页面标题是否包含指定的区分大小写的子字符串。 |
visibility_of_element_located(locator) | 检查元素是否存在于页面的DOM中并且是可见的。定位器用于指定要查找的元素。 |
presence_of_element_located(locator) | 检查元素是否存在于页面的DOM中。定位器用于指定要查找的元素。 |
visibility_of(element) | 检查已知存在于页面DOM上的元素是否可见。需要传入一个已经找到的元素对象。 |
alert_is_present() | 检查是否有警告框(Alert)出现。 |
优点
- 智能等待:可以根据页面加载和元素状态动态调整等待时间。
- 灵活性:可以自定义显示等待的条件,操作更加灵活。
缺点
- 写法复杂:相较于隐式等待和强制等待,代码编写较为复杂,需要为每个特定条件设置等待逻辑。
显示等待和隐式等待的区别
显示等待(Explicit Wait)和隐式等待(Implicit Wait)是 Selenium WebDriver 中用于处理元素加载时间的两种不同机制。它们在实现方式、应用范围以及对测试稳定性的影响上都有显著的区别。以下是两者的主要区别:
显示等待(Explicit Wait)
- 智能且灵活:
- 显示等待允许你为每个元素或条件设置单独的等待时间,并且只在特定条件满足时继续执行脚本。
- 它们可以更精确地控制等待逻辑,从而提高测试的稳定性和效率。
- 自定义等待条件:
- 使用
WebDriverWait
和expected_conditions
,你可以定义非常具体的等待条件,如元素是否可见、可点击等。
- 局部应用:
- 显示等待仅应用于指定的元素查找操作,不会影响整个 WebDriver 实例的行为。
- 代码复杂度较高:
- 由于需要为每个等待条件编写相应的逻辑,因此代码会相对复杂一些。
- 性能优化:
- 显示等待可以在找到目标元素后立即结束等待,避免不必要的长时间等待,提高了测试速度。
- 实现示例:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as ECwait = WebDriverWait(driver, 10) element = wait.until(EC.presence_of_element_located((By.ID, 'myDynamicElement')))
隐式等待(Implicit Wait)
- 全局设置:
- 隐式等待是一次性设置给 WebDriver 实例的,它会影响所有后续的元素查找操作。
- 简单直接:
- 设置隐式等待只需要一行代码,易于理解和使用。
- 固定等待时间:
- 如果在设定的时间内没有找到元素,才会抛出异常;即使元素已经出现也会等到设定的时间结束,这可能导致不必要的延迟。
- 适用于所有元素查找:
- 隐式等待对所有元素查找都生效,无法针对单个元素进行定制化等待。
- 可能降低测试效率:
- 当页面上的许多元素都需要等待时,可能会导致测试执行时间延长。
- 实现示例:
driver.implicitly_wait(10) # 等待最长10秒
总结
- 推荐使用显示等待,因为它可以根据实际情况自动调整,提供更高的灵活性和更精准的控制,有助于创建更加稳定和高效的自动化测试。
- 尽量避免混合使用显式等待和隐式等待,因为它们的组合可能会导致不可预测的行为。通常建议选择一种等待策略并坚持使用,以保持测试的一致性和可靠性。
隐式等待和显示等待混用
我们这里混用隐式等待和显示等待,看看最后等待的时间是不是20s:
try:# 打开百度首页driver.get("https://www.baidu.com/")# 设置隐式等待时间为10秒driver.implicitly_wait(10)# 创建一个 WebDriverWait 实例,设置最大等待时间为10秒wait = WebDriverWait(driver,10)start = time.time()# 输入搜索关键词并点击搜索按钮search_box = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,"#kw")))search_box.send_keys("老番茄")# driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("老番茄")search_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#su")))# driver.find_element(By.CSS_SELECTOR, "#su").click()search_button.click()# 尝试查找特定的元素(这里假设是搜索结果中的某个元素)result_element = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".pc-tag_2Nde81"))) # 故意写错,看时间driver.quit()except:print("no such element")end = time.time()driver.quit()print(end-start)
所以我们才说,不要混合隐式和显式等待,可能会导致不可预测的等待时间。
相关文章:
软件测试 —— Selenium(等待)
软件测试 —— Selenium(等待) 一个例子强制等待使用示例:为什么不推荐使用强制等待?更好的选择 隐式等待 implicitly_wait()隐式等待和强制等待的区别隐式等待(Implicit Wait)强制等…...
图像模糊度(清晰度)检测 EsFFT 算法详细分析
图像模糊度检测算法 基于频域的算法 傅里叶变换法:先将图像进行傅里叶变换得到频谱图,频谱图中心为低频,向外扩展为高频。通过屏蔽频谱图中心区域实现高通滤波,保留图像边缘等高频信息,再求频谱图的均值即平均高频幅值,该值越小,图像越模糊。但传统FFT方法存在不足,如…...
快速上手 HarmonyOS 应用开发
一、DevEco Studio 安装与配置 1. DevEco Studio 简介 DevEco Studio 是 HarmonyOS 的一站式集成开发环境(IDE),提供了丰富的工具和功能,支持 HarmonyOS 应用开发的全流程。 2. DevEco Studio 下载与安装 下载地址:…...
金融项目实战 06|Python实现接口自动化——日志、实名认证和开户接口
目录 一、日志封装及应用(理解) 二、认证开户接口脚本编写 1、代码编写 1️⃣api目录 2️⃣script目录 2、BeautifulSoup库 1️⃣简介及例子 2️⃣提取html数据工具封装 3、认证开户参数化 一、日志封装及应用(理解) &…...
Lianwei 安全周报|2025.1.13
新的一周又开始了,以下是本周「Lianwei周报」,我们总结推荐了本周的政策/标准/指南最新动态、热点资讯和安全事件,保证大家不错过本周的每一个重点! 政策/标准/指南最新动态 01 美国国土安全部发布《公共部门生成式人工智能部署手…...
【C#深度学习之路】如何使用C#实现Yolo8/11 Segment 全尺寸模型的训练和推理
【C#深度学习之路】如何使用C#实现Yolo8/11 Segment 全尺寸模型的训练和推理 项目背景项目实现推理过程训练过程 项目展望写在最后项目下载链接 本文为原创文章,若需要转载,请注明出处。 原文地址:https://blog.csdn.net/qq_30270773/article…...
【Compose multiplatform教程】05 IOS环境编译
了解如何使现有的 Android 应用程序跨平台,以便它在 Android 和 iOS 上都能运行。您将能够在一个位置编写代码并针对 Android 和 iOS 进行测试一次。 本教程使用一个示例 Android 应用程序,其中包含用于输入用户名和密码的单个屏幕。凭证经过验证并保存…...
【声音场景分类--论文阅读】
1.基于小波时频图特征在声音场景分类 基于小波时频图特征在声音场景分类任务中的表现 2.增强增强高效音频分类网络 https://arxiv.org/pdf/2204.11479v5 https://github.com/Alibaba-MIIL/AudioClassfication 音频分类网络如图4所示。在此阶段,主要重点是建立一…...
浅谈云计算02 | 云计算模式的演进
云计算计算模式的演进 一、云计算计算模式的起源追溯1.2 个人计算机与桌面计算 二、云计算计算模式的发展阶段2.1 效用计算的出现2.2 客户机/服务器模式2.3 集群计算2.4 服务计算2.5 分布式计算2.6 网格计算 三、云计算计算模式的成熟与多元化3.1 主流云计算服务模式的确立3.1.…...
【专题】2025年节日营销趋势洞察报告汇总PDF洞察(附原数据表)
原文链接: https://tecdat.cn/?p38813 在当今复杂多变且竞争激烈的消费市场环境下,节日营销已成为企业获取市场份额、提升品牌影响力的关键战略时机。我们深知深入洞察节日营销趋势对于企业决策的重要性。 本报告汇总基于对 2024 年多个关键消费节点及…...
AR 在高校实验室安全教育中的应用
AR应用APP可以内置实验室安全功能介绍,学习并考试(为满足教育部关于实验室人员准入条件),AR主模块。其中AR主模块应该包括图形标识码的扫描,生成相应模型,或者火灾、逃生等应急处置的路线及动画演示。考试采…...
PHP智慧小区物业管理小程序
🌟智慧小区物业管理小程序:重塑社区生活,开启便捷高效新篇章 🌟 智慧小区物业管理小程序是一款基于PHPUniApp精心雕琢的智慧小区物业管理小程序,它犹如一股清新的科技之风,吹进了现代智慧小区的每一个角落…...
使用防抖与节流优化 Vue 中的异步函数调用
使用防抖与节流优化 Vue 中的异步函数调用 在 Vue 项目中,我们经常需要处理用户交互事件,例如点击、输入、切换复选框等。这些事件可能频繁触发,尤其在用户快速操作的情况下,如果每次触发都执行复杂的逻辑(如异步网络…...
【大厂面试AI算法题中的知识点】方向涉及:ML/DL/CV/NLP/大数据...本篇介绍自动驾驶检测模型如何针对corner case 优化?
【大厂面试AI算法题中的知识点】方向涉及:ML/DL/CV/NLP/大数据…本篇介绍自动驾驶检测模型如何针对corner case 优化? 【大厂面试AI算法题中的知识点】方向涉及:ML/DL/CV/NLP/大数据…本篇介绍自动驾驶检测模型如何针对corner case 优化&…...
Android CustomTextField
在 Compose 中开发用户界面时,需要处理输入框和键盘的交互,例如在键盘弹出时调整布局位置,避免遮挡重要内容。本篇博客将通过一个完整的示例展示如何实现这一功能。 功能概述 本例实现了一个简单的输入框。当输入框获得焦点或输入文字时&…...
源码编译安装httpd 2.4,提供系统服务管理脚本并测试(两种方法实现)
一、源码编译安装httpd 2.4 # 从官网下载httpd源代码 [rootopenEuler-2 ~]# wget https://downloads.apache.org/httpd/httpd-2.4.62.tar.gz# 解压并进入到该目录中 [rootopenEuler-2 ~]# tar -zxvf httpd-2.4.62.tar.gz [rootopenEuler-2 ~]# cd httpd-2.4.62/# 安装httpd编译…...
ubuntu24.04安装docker显卡工具包nvidia-container-toolkit
问题描述 docker 容器启动时如果需要访问 gpu ,需要安装 nvidia-container-toolkit 才行,否则会提示如下错误 sudo docker run --rm -it --gpus all ubuntu:latest docker: Error response from daemon: could not select device driver "" …...
mac intel芯片下载安卓模拟器
一、调研 目前主流两个模拟器: 雷神模拟器 不支持macosmumu模拟器pro版 不支持macos intel芯片 搜索到mumu的Q&A中有 “Intel芯片Mac如何安装MuMu?” q&a🔗:https://mumu.163.com/mac/faq/install-on-intel-mac.html 提…...
4 原型(Protoytpe)模式
原型模式 1.1 分类 (对象)创建型 1.2 提出问题 希望复制一个状态完全相同的对象。首先,新建一个相同类的对象。 然后,复制所有成员变量。 但是,有时候不知道具体类型,而且成员变量可能是私有的。&#…...
kafka的listeners和advertised.listeners,配置内外网分流
总结: listeners 指明 kafka 当前节点监听本机的哪个网卡 advertised.listeners 指明客户端通过哪个 ip 可以访问到当前节点 内网和外网并不必须是是我们通常说的公司内部网络和公网,只要是两块网卡都可以,不管是这两块网卡是公网、内网、甚至…...
Mac——Docker desktop安装与使用教程
摘要 本文是一篇关于Mac系统下Docker Desktop安装与使用教程的博文。首先介绍连接WiFi网络,然后详细阐述了如何在Mac上安装Docker,包括下载地址以及不同芯片版本的选择。接着讲解了如何下载基础镜像和指定版本镜像,旨在帮助用户在Mac上高效使…...
Redis十大数据类型详解
Redis(一) 十大数据类型 redis字符串(String) string是redis最基本的类型,一个key对应一个value string类型是二进制安全的,意思是redis的string可以包含任何数据。例如说是jpg图片或者序列化对象 一个re…...
.net core 中使用AsyncLocal传递变量
官网 https://github.com/dotnet/runtime/blob/16b6369b7509e58c35431f05681a9f9e5d10afaa/src/libraries/System.Private.CoreLib/src/System/Threading/AsyncLocal.cs#L45 AsyncLocal是一个在.NET中用来在同步任务和异步任务中保持全局变量的工具类。它允许你在不同线程的同…...
C#Halcon视觉流程框架个人封装流程心得
一,实现效果 1,初始界面 2,加载流程 3,点击流程列表“加载2D图像" 4,设置图像预处理参数与画线找线 5,执行流程 6,折叠工具箱 7,折叠操作区域 二,实现流程 1&…...
web第一次作业
系统登录代码: <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>第一次作业</title…...
Kylin Linux V10 替换安装源,并在服务器上启用 EPEL 仓库
查看系统版本: cat /etc/os-releaseNAME"Kylin Linux Advanced Server" VERSION"V10 (Lance)" ID"kylin" VERSION_ID"V10" PRETTY_NAME"Kylin Linux Advanced Server V10 (Lance)" ANSI_COLOR"0;31"u…...
备战蓝桥杯:树的存储与遍历(dfs和bfs)
树的概念 树的逻辑结构是树形结构,和我们之前的线性结构又不太一样了,是一种一对多的关系 树的结点分为根节点,叶子结点(没有分支的结点) 以及分支结点 从上往下看,每个结点都有0个或多个后继 从下往上…...
[Deep Learning] Anaconda+CUDA+CuDNN+Pytorch(GPU)环境配置-2025
文章目录 [Deep Learning] AnacondaCUDACuDNNPytorch(GPU)环境配置-20250. 引子1. 安装Anaconda1.1 安装包下载:1.2 启用安装包安装1.3 配置(系统)环境变量1.4 验证Anaconda是否安装完毕1.5 Anaconda换源 2. 安装CUDACuDNN2.1 判断本机的CUDA版本2.2 下载适合自己CU…...
计算机的错误计算(二百一十二)
摘要 利用两个大模型计算 实验表明,两个大模型均进行了中肯的分析。另外,其中一个大模型给出了 Python代码,运行后,结果中有7位错误数字;而一个大模型进行加减运算时出错。 例1. 计算 下面是与一个大模型的对话…...
Inxpect毫米波安全雷达:精准检测与动态保护,工业自动化可靠选择
Inxpect毫米波安全雷达具备“精准检测、动态区域保护、环境适应性”三大核心功能。在工业自动化和机器人系统里,这些功能发挥着重要作用,有助于提升安全性与效率。Inxpect雷达运用毫米波技术,在诸如存在灰尘、烟雾或碎屑等复杂环境中,也能保持…...
springboot房屋租赁管理系统
Spring Boot房屋租赁管理系统是一种基于Spring Boot框架构建的,旨在解决传统租房市场中房源信息更新不及时、虚假信息泛滥、交易流程繁琐等问题的信息化解决方案。 一、系统背景与目的 随着城市化进程的加快和人口流动性的增强,租房市场需求急剧增长。…...
如何使用wireshark 解密TLS-SSL报文
目录 前言 原理 操作 前言 现在网站都是https 或者 很多站点都支持 http2。这些站点为了保证数据的安全都通过TLS/SSL 加密过,用wireshark 并不能很好的去解析报文,我们就需要用wireshark去解密这些报文。我主要讲解下mac 在 chrome 怎么配置的&…...
Gensim字典和语料库
自然语言处理(NLP)是计算机科学中涉及语言数据处理的核心领域之一,应用广泛,包括文本分类、情感分析、机器翻译、主题建模等任务。在处理海量文本时,如何将非结构化的语言数据转化为机器能够理解的结构化数据,是解决这些任务的关键。 Gensim 是一个用于处理和分析文本数…...
RK3588-NPU pytorch-image-models 模型编译测试
RK3588-NPU pytorch-image-models 模型编译测试 一.背景二.操作步骤1.下载依赖2.创建容器3.安装依赖4.创建脚本A.生成模型名列表B.生成ONNX模型C.生成RKNN模型D.批量测试脚本 一.背景 测试RK3588-NPU对https://github.com/huggingface/pytorch-image-models.git中模型的支持程…...
Doris 导入慢该如何排查及优化?
在使用 Apache Doris 进行数据导入时,经常会遇到导入性能不理想的情况。今天我们就来深入分析这些问题的原因及其解决方案! Stream Load 导入慢 Stream Load 支持通过 HTTP 协议将本地文件或数据流导入到 Doris 中的一种方式,其速度还是相当…...
iOS - 关联对象的实现
根据源码总结一下关联对象(Associated Objects)的实现: 1. 关联对象的基本结构 // 对象的 isa 结构中包含关联对象标记 union isa_t {struct {uintptr_t nonpointer : 1; // 是否使用优化的 isauintptr_t has_assoc : 1; // 是否有关联对象// ...其他位…...
AudioGPT全新的 音频内容理解与生成系统
AudioGPT全新的 音频内容理解与生成系统 ChatGPT、GPT-4等大型语言模型 (LLM) 在语言理解、生成、交互和推理方面表现出的非凡能力,引起了学界和业界的极大关注,也让人们看到了LLM在构建通用人工智能 (AGI) 系统方面的潜力。 现有的GPT模型具有极高的语言生成能力,是目前最…...
【maptalks】加载SVG和GIF
加载SVG和GIF 一、加载SVG方法一:直接载入SVG文件,类似载入图片方法二:载入SVG路径 二、加载GIFVUEmaptalks实现GIF可拖拽点VUEmaptalks实现GIF跟随线条动画 一、加载SVG 方法一:直接载入SVG文件,类似载入图片 缺点&…...
【HarmonyOS NEXT】鸿蒙跳转华为应用市场目标APP下载页
【HarmonyOS NEXT】鸿蒙跳转华为应用市场目标APP下载页 一、问题背景: 如今,大家都离不开各种手机应用。随着鸿蒙系统用户越来越多,大家都希望能在鸿蒙设备上快速找到想用的 APP。华为应用市场里有海量的 APP,但之前从鸿蒙设备进…...
《leetcode-runner》【图解】如何手搓一个debug调试器——调试程序【JDI开发】【万字详解】
前文: 《leetcode-runner》如何手搓一个debug调试器——引言 《leetcode-runner》如何手搓一个debug调试器——架构 《leetcode-runner》如何手搓一个debug调试器——指令系统 本文主要聚焦于如何编写调试程序 背景 在leetcode算法背景下,用户只编写了…...
【高阶数据结构】线段树加乘(维护序列)详细解释乘与加懒标记
文章目录 1.题目[AHOI2009] 维护序列 2.懒标记处理先加后乘的形式1. 先加后乘的操作 先乘后加的形式2. 先乘后加的操作**乘法操作****加法操作** 懒标记的下传 3.代码 1.题目 题目来源:https://www.luogu.com.cn/problem/P2023 [AHOI2009] 维护序列 题目背景 老师交给小可可…...
ElasticSearch常见知识点
1、什么是ElasticSearch? Elasticsearch 是基于 Lucene 的 Restful 的分布式实时全文搜索引擎,每个字段都被索引并可被搜索,可以快速存储、搜索、分析海量的数据。 2、什么是倒排索引? 正常的索引是比如二叉树。倒排索引是用内容…...
ARM与x86:架构对比及其应用
典型的服务器架构的x86采用模块化方法,基于带有可更换组件的主板。CPU和其他组件(如显卡和GPU、内存控制器、存储或处理核心)针对特定功能进行了优化,可以轻松更换或扩展。然而,这种便利是有代价的;这些硬件…...
macos 搭建 ragflow 开发环境
ragflow 是一个很方便的本地 RAG 库。本文主要记录一下在本机的部署过程 1、总体架构说明 开发环境:macbook pro(m1),16G内存 512G固态 因本机的内存和硬盘比较可怜,所以在服务器上部署基础 docker 包,…...
CVPR 2024 人体姿态估计总汇(3D人体、手语翻译和人体网格恢复/重建等)
1、Human Pose Estimation(人体姿态估计) CLOAF: CoLlisiOn-Aware Human FlowMeta-Point Learning and Refining for Category-Agnostic Pose EstimationSurMo: Surface-based 4D Motion Modeling for Dynamic Human Rendering ⭐codeGALA: Generating Animatable Layered Ass…...
docker 安装mongodb
1、先获取mongodb镜像 docker pull mongo:4.2 2、镜像拉取完成后,运行mongodb容器 docker run \ -d \ --name mongo \ --restartalways \ --privilegedtrue \ -p 27017:27017 \ -v /home//mongodb/data:/data/db \ mongo:4.2 --auth 3、mongodb服务配置 如上图&…...
82_Redis缓存雪崩击穿穿透问题
在实际业务应用中,Redis常常与诸如MySQL这类关系型数据库协同工作,旨在缓解后端数据库的负担。它扮演了一个高效缓存的角色,特别是针对那些频繁被访问的热点数据。当用户发起查询时,系统首先尝试从Redis中获取这些数据。由于Redis提供了极快的访问速度,如果数据存在于Redi…...
统计学习算法——逻辑斯谛回归
内容来自B站Up主:动画讲编程https://www.bilibili.com/video/BV1CR4y1L7RC、风中摇曳的小萝卜https://www.bilibili.com/video/BV17r4y137bW,仅为个人学习所用。 极大似然估计 几率、概率与似然 几率是指某个事件发生的可能性与不发生的可能性之比&am…...
设计模式03:行为型设计模式之策略模式的使用情景及其基础Demo
1.策略模式 好处:动态切换算法或行为场景:实现同一功能用到不同的算法时和简单工厂对比:简单工厂是通过参数创建对象,调用同一个方法(实现细节不同);策略模式是上下文切换对象,调用…...
C51交通控制系统的设计与实现
实验要求: 本题目拟设计一个工作在十字路口的交通信号灯控制系统,设东西方向为主干道A,南北方向为辅助干道B。要求:(1)用发光二极管模拟交通灯信号;(2)灵活控制主、辅干…...