selenium学习笔记(一)
文章目录
- 前言
- 一、selenium的简介
- java使用selenium
- Python使用selenium
- 常用的浏览器
- selenium的功能
- 二、chromeDriver的安装
- 查看本机的chrome版本?
- 匹配对应的chromedriver并下载
- 在服务器上例如Centos如何安装Chrome
- 三、selenium内容详解
- chrome启动
- chrome启动参数
- 元素的定位方式
- 等待机制
- 三种等待
- 总结
- 等待超时处理方法
- 浏览器及窗口操作
- 键盘和鼠标操作
- 键盘事件
- 鼠标事件
- 浏览器关闭
前言
1、该文是为了做个笔记,在需要的时候可以方便查找,侵权可删
2、文中的代码均为java
3、selenium学习笔记(二)
一、selenium的简介
java使用selenium
- 需要
(1)java环境 和 idea;
(2)引入依赖;
(3)下载对应的浏览器的webdriver - 常用依赖
<!-- 添加 Selenium WebDriver 依赖 --> <dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.10.0</version> </dependency><!-- 如果需要使用特定的浏览器引擎,还需添加对应的驱动依赖 --> <dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-chrome-driver</artifactId><version>4.9.0</version> </dependency> <!-- TestNG测试依赖 --> <dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>7.4.0</version><scope>test</scope> </dependency>
Python使用selenium
- 需要:
(1)安装python;(2)安装selenium库;(3)下载对应的浏览器的webdriver
- 安装方法
pip install selenium
常用的浏览器
- Chrome:ChromeDriver下载地址
- Firefox:GeckoDriver下载地址
- Edge:Microsoft WebDriver下载地址
- Internet Explorer:IEDriverServer
ie浏览器设置方法
selenium的功能
- (1)主要被用于自动化测试
- (2)爬虫和数据抓取
- (3)网站监控
定期检查网站是否在线,以及页面元素是否按预期显示,可以用来监控网站的健康状态
- (4)视觉测试:结合图像识别技术,检查网页的视觉元素是否符合设计
- (5)浏览器兼容性测试
- (6)性能测试:模拟用户行为来评估网站的性能
- (7)api测试
- (8)用户旅程映射
- (9)自动化报告生成
二、chromeDriver的安装
查看本机的chrome版本?
打开chrome浏览器,地址栏输入"chrome://version/",可以看到版本为:126.0.6478.57
匹配对应的chromedriver并下载
Selenium 3.0及以上版本中,Firefox浏览器驱动独立了,需要下载和设置浏览器驱动。
对于Chrome,也需要下载对应的ChromeDriver
-
方法一:访问 谷歌的chromedriver官方下载站 如果没有,可以选择离当前版本最近的次版本
-
方法二:访问地址 https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json 选择离自己最近的版本号
记住放置的路径,我这里是:D:\Drivers\chromedriver-win64
在服务器上例如Centos如何安装Chrome
安装chrome:
curl https://intoli.com/install-google-chrome.sh | bash查看chrome版本:
google-chrome --version
下载chromedriver同上
三、selenium内容详解
chrome启动
public static void main(String[] args) {// 设置系统属性,指定chromeDriver的路径System.setProperty("webdriver.chrome.driver","D:\\Drivers\\chromedriver-win64");// 创建webdriver对象WebDriver driver = new ChromeDriver();// 创建chromeOptions对象,可以设置Chrome的启动参数ChromeOptions options = new ChromeOptions();// 打开百度首页driver.get("https://www.baidu.com");
}
注:后续不再重复webdriver的设置和创建了,均会以 driver 直接替代
chrome启动参数
前提:ChromeOptions options = new ChromeOptions();
// 禁用浏览器扩展。options.addArguments("--disable-extensions"); // 启用无头模式(不显示浏览器界面)options.addArguments("--headless"); // 指定浏览器分辨率options.addArguments("window-size=1920x3000"); // 启动时最大化浏览器窗口options.addArguments("start-maximized"); // 禁用GPU硬件加速 options.addArguments("--disable-gpu"); // 指定用户数据目录,用于自定义Chrome的用户配置文件options.addArguments("--user-data-dir"); // 禁用弹出窗口拦截器options.addArguments("--disable-popup-blocking"); // 彻底停用沙箱,这在非桌面环境中运行Chrome时非常有用options.addArguments("--no-sandbox"); // 禁用网页安全性功能,用于解决跨域问题options.addArguments("--disable-web-security"); // 忽略SSL证书错误 options.addArguments("--ignore-certificate-errors"); // 以隐身模式启动浏览器options.addArguments("--incognito"); // 设置代理服务器地址和端口,例如 --proxy-server=127.0.0.1:8087 options.addArguments("--proxy-server"); // 设置浏览器窗口的位置options.addArguments("--window-position"); // 设置浏览器窗口的大小 options.addArguments("--window-size"); // 禁用JavaScriptoptions.addArguments("--disable-javascript"); // 禁用插件 options.addArguments("--disable-plugins"); // 禁用图像 options.addArguments("--disable-images");
元素的定位方式
!!! 不管哪种方式都应该保证定位要操作的对象是唯一的 !!!
// 使用元素的ID属性来定位元素,这是最快且最准确的方式
driver.findElement(By.id("id值"));
// 使用CSS选择器来定位元素
driver.findElement(By.cssSelector("input[type='submit']"));
//使用元素的class属性来定位元素
driver.findElement(By.className("xxxx"));
//通过元素的标签名来定位元素
driver.findElement(By.tagName("xxxx"));
//通过元素的name属性来定位元素
driver.findElement(By.name("xxxx"));
//通过链接的完整文本内容来定位 <a> 标签元素
driver.findElement(By.linkText("xxxx"));
//通过链接文本的部分内容来定位 <a> 标签元素
driver.findElement(By.partialLinkText("xxxx"));
//通过包含指定文本的class属性来定位元素
driver.findElement(By.classNameContaining("xxxx"));
//通过包含指定文本的标签名来定位元素
driver.findElement(By.tagNameContaining("xxxx"));
//通过包含指定文本的CSS选择器来定位元素
driver.findElement(By.cssSelectorContaining("xxxx"));
//通过包含指定文本的XPath表达式来定位元素
driver.findElement(By.xpathContaining("//input[contains(@class,'partialClass')]"));
//使用XPath表达式来定位多个元素,返回一个元素列表
List<WebElement> elements = driver.findElements(By.xpath("//input"));
//使用XPath表达式来定位元素,XPath是一种在XML文档中查找信息的语言,也适用于HTML
driver.findElement(By.xpath("//input[@type='submit']"));
多说两句:
- 1、优先使用ID定位;
ID是元素在HTML中的唯一标识符,使用ID进行定位是最直接、最快速的方式。如果元素有唯一的ID,应该优先使用ID进行定位,因为它的效率最高
- 2、Selenium官方推荐使用CSS选择器进行元素定位
因为CSS选择器的效率通常高于XPath,并且语法更加简洁。
CSS的获取可以用chrome的F12开发者模式中Element-右键-copy-copy selector来获取 - 3、避免使用xpath的绝对路径
绝对路径对页面结构要求比较严格,不建议使用绝对路径,因为页面结构的微小变化都可能导致定位失败
XPATH的获取可以用chrome的F12开发者模式中Element-右键-copy-copy xpath来获取 - 4、使用逻辑运算符组合定位:使用XPath的逻辑运算符and、or来组合更多元素特征,以提高定位的准确性。
- 5、避免使用过于通用的选择器:如find_element_by_tag_name,因为这种方法可能会返回多个元素,需要进一步使用下标来定位特定的元素
- 6、考虑元素的可访问性:选择那些在DOM结构中相对稳定且不太可能变化的元素属性进行定位
- 7、动态元素的处理:对于动态生成的元素,可以考虑使用显式等待(Explicit Wait),等待元素可见或可操作后再进行定位
- 8、框架和iframe的处理:当元素位于iframe或不同的框架中时,需要先切换到相应的框架中再进行元素定位。
- 9、异常处理:在定位元素时,应该添加异常处理逻辑,以便在元素未找到时能够给出清晰的错误信息。
等待机制
三种等待
- 硬等待【Hard Wait】(也叫强制等待)
Thread.sleep(3000); // 硬等待,等待3秒
- 隐式等待【Implicit Wait】:等待页面所有元素
driver.manage().timeouts().implicitlywait(10,TimeUint.SECONDS); // 设置隐式等待时间为10秒
- 显式等待【Explicit Wait】:可以指定等待页面的某一个元素
- 显式等待使用WebDriverWait和ExpectedConditions来等待特定的条件发生
- WebDriverWait接收两个参数:一个WebDriver对象和一个秒数(最大等待时间)。如果在指定的时间内条件没有满足,将会抛出一个TimeoutException异常
WebDriverWait wait = new WebDriverWait(driver, 10); // 显式等待,等待一个元素可见,最多等待10秒 WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("xxxid值"))); // 等待元素可点击 WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("elementId"))); //等待元素存在 WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("elementId"))); //等待页面标题:会等待直到页面的标题完全匹配“预期的标题” WebElement element = wait.until(ExpectedConditions.titleIs("预期的标题"));
总结
- 【硬等待】
如果等待时间是三天,那么强制等待会一直等待直到三天结束;
通常不推荐使用,因为它会无条件的阻塞进程,效率低; - 【隐式等待】
是等待页面所有的元素加载完成后才执行下面代码,如果加载过程中超过等待时间就会报错
- 【显示等待】
显示等待最长等待时间为设置的时间,在期间如果满足等待结束条件(until()方法中)就会结束等待
- 隐式等待和显示显式等待是常用的等待方式,只能等待可以根据项目需求自定义实现
等待超时处理方法
-
1、增加等待时间 : 针对页面加载缓慢 或 网络延迟引起的异常
-
2、优化元素定位: 确保使用的XPath或CSS选择器准确且唯一,避免因定位不当导致的超时
-
3、使用Try-Catch块来捕获和处理TimeoutException,可以防止脚本因超时而突然失败,并允许执行其他操作或记录错误
-
4、增加重试机制(代码示例如下)
for (int i = 0; i < maxAttempts; i++) {try {element = WebDriverWait(driver, 5).until(ExpectedConditions.presence_of_element_located((By.ID, "elementID")));// 执行元素上的操作break; // 如果成功,退出循环} catch (TimeoutException e) {if (i < maxAttempts - 1) {continue; // 如果还有尝试次数,继续重试} else {throw e; // 如果已达最大尝试次数,抛出异常}} }
-
5、 检查网络连接 : 确保测试环境的网络连接稳定,因为不稳定的网络连接可能会导致WebDriver与网站交互时超时
-
6、更新Selenium和WebDriver : 保持Selenium和对应的WebDriver更新到最新版本,以确保与浏览器的兼容性
浏览器及窗口操作
包含浏览器的:前进、后退、滚动条操作、最大化、全屏、宽高设置、获取窗口位置和大小、设置窗口位置和大小
driver.navigate().back(); //浏览器后退
driver.navigate().refresh(); //刷新
driver.navigate().forward(); //浏览器前进
//浏览器滚动条操作,此时需要将webDriver强制转换
//executeScript()中是js代码,scrollTop方法是向上滚动多少个像素
((JavascriptExecutor)driver).executeScript("document.documentElement.scrollTop=10000");
//浏览器最大化
driver.manage().window().maximize();
//浏览器全屏
driver.manage().window().fullscreen();
//设置浏览器宽高
driver.manage().window().setSize(new Dimension(600,1000));
// 获取窗口大小:size.getWidth() 、size.getHeight()
Dimension size = driver.manage().window().getSize();
// 设置窗口大小
driver.manage().window().setSize(new Dimension(800, 600));
// 获取窗口位置:position.getX()、position.getY()
Point position = webDriver.manage().window().getPosition();
// 设置窗口位置
driver.manage().window().setPosition(new Point(100, 100));
键盘和鼠标操作
利用Actions和Keys类来模拟键盘操作,包括文本输入、按键和组合键序列
增强自动化脚本的用户交互能力
键盘事件
-
单个使用
1.TAB键:sendKeys(Keys.TAB)
2. 回车键:sendKeys(Keys.ENTER)
3.空格键:sendKeys(Keys.SPACE)
4.回退键:sendKeys(Keys.ESCAPE) -
组合使用
1.全选(Ctrl+A):sendKeys(Keys.CONTROL,‘a’)
2.复制(Ctrl+C):sendKeys(Keys.CONTROL,‘c’)
3.剪贴(Ctrl+X):sendKeys(Keys.CONTROL,‘x’)
4.粘贴(Ctrl+V):sendKeys(Keys.CONTROL,‘v’) -
代码示例
// 打开百度网页 driver.get("https://www.baidu.com"); //control+a driver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"A"); //control+x driver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"X"); //control+v driver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"V");
鼠标事件
通过ActionChains 类实现鼠标执行的操作:
1、contextClick() 单击
2、doubleClick() 双击
3、dragAndDrop() 拖动
4、moveToElement() 移动
5、perform() 右击
不能发送鼠标滚轮操作
// 打开百度网页
webDriver.get("https://www.baidu.com");
webDriver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴");
webDriver.findElement(By.cssSelector("#su")).click();
//找到图片按钮
WebElement webElement = driver.findElement(By.cssSelector("#\\32 > div > div > div > div > div.list-scroll_7E1go > div > div:nth-child(1) > div.avatar-wrapper_622F1 > a:nth-child(1) > div > div._capsule_1e0bo_35.capsule_GwMlS.cu-line-clamp-1"));
//鼠标右击操作
Actions actions = new Actions(driver);
//鼠标移动到图片,右击,执行
actions.moveToElement(webElement).contextClick().perform();
浏览器关闭
可以通过quit()和close()方法关闭浏览器
webDriver.close(); // close关闭当前页面
webDriver.quit(); // quit关闭整个浏览器并且清空缓存
相关文章:
selenium学习笔记(一)
文章目录 前言一、selenium的简介java使用seleniumPython使用selenium常用的浏览器selenium的功能 二、chromeDriver的安装查看本机的chrome版本?匹配对应的chromedriver并下载在服务器上例如Centos如何安装Chrome 三、selenium内容详解chrome启动chrome启动参数元素…...
jest expect().resolves和expect().rejects原理
假设存在如下代码 export default function fetchData(fn) {return Axios.get(http://www.dell-lee.com/react/api/demo.json) } 接口返回的数据为 {"success": true } 那么对于测试代码 test(fetchData, async () > {await expect(fetchData()).resolves.to…...
大语言模型驱动的Agent:定义、工作原理与应用
文章目录 引言什么是大语言模型? Agent的概念LLM Agent的工作原理 Dify平台上的AgentLLM Agent的应用场景挑战与展望结论 引言 随着人工智能(AI)技术的发展,特别是自然语言处理(NLP)领域的进步,…...
写作词汇积累:纰漏、坎肩、颠三倒四、隔阂
纰漏 【纰漏】是指因粗心而产生的差错、小事故或漏洞 1. 在准备这次会议的过程中,我们反复核对资料,力求不出现任何【纰漏】。2. 在这次重要的项目汇报中,他小心翼翼地检查每一页 PPT,生怕出现任何【纰漏】。3. 尽管她工作一向细…...
一种简易的免杀绕过方法
一种简易的免杀绕过方法 这里我们直接参考师兄的项目https://github.com/snnxyss/In-Swor exe-shellcode-加密-运行 话不多说直接上图 这里我们用geacon作为本次实验 从这里我们可以看到 geacon已经不行了 这里我们将exe转shellcode 生成之后将123.txt放到config目录下 利…...
CTF web解题 [NISACTF 2022]popchains PHP反序列化 pop链
不积跬步无以至千里 不积小流无以成江海 对web方向有了更近一步的了解,根据一道题目来学习PHP反序列化及pop链 [NISACTF 2022]popchains flag:NSSCTF{3096663a-4b18-4567-bdfb-8403f9414704} Happy New Year~ MAKE A WISH <?php echo?Happy?Ne…...
重温设计模式--单例模式
文章目录 单例模式(Singleton Pattern)概述单例模式的实现方式及代码示例1. 饿汉式单例(在程序启动时就创建实例)2. 懒汉式单例(在第一次使用时才创建实例) 单例模式的注意事项应用场景 C代码懒汉模式-经典…...
AI的进阶之路:从机器学习到深度学习的演变(一)
AI的进阶之路:从机器学习到深度学习的演变 在当今科技迅猛发展的时代,人工智能(AI)、机器学习(ML)和深度学习(DL)已成为推动创新的核心力量。这三个领域虽然紧密相连,却…...
WPF+MVVM案例实战与特效(四十七)-实现一个路径绘图的自定义按钮控件
文章目录 1、案例效果2、创建自定义 PathButton 控件1、定义 PathButton 类2、设计样式与控件模板3、代码解释3、控件使用4、直接在 XAML 中绑定命令3、源代码获取4、总结1、案例效果 2、创建自定义 PathButton 控件 1、定义 PathButton 类 首先,我们需要创建一个新的类 Pat…...
Python 写的 智慧记 进销存 辅助 程序 导入导出 excel 可打印
图样: 就可以导入了 上代码 import tkinter as tk from tkinter import ttk import sqlite3 from datetime import datetime from tkinter import messagebox, filedialog import pandas as pd import reclass OrderSystem:def __init__(self, root):self.root r…...
【电商搜索】CRM: 具有可控条件的检索模型
【电商搜索】CRM: 具有可控条件的检索模型 目录 文章目录 【电商搜索】CRM: 具有可控条件的检索模型目录文章信息摘要研究背景问题与挑战如何解决核心创新点算法模型实验效果(包含重要数据与结论)相关工作后续优化方向 后记 https://arxiv.org/pdf/2412.…...
python使用pip进行库的下载
前言 现如今有太多的python编译软件,其库的下载也是五花八门,但在作者看来,无论是哪种方法都是万变不离其宗,即pip下载。 pip是python的包管理工具,无论你是用的什么python软件,都可以用pip进行库的下载。 …...
Golang 的并发优势
在如今的编程领域,一个程序能够同时处理多个任务的能力非常重要,这就是所谓的并发处理。而 Golang 在并发编程方面表现十分出色,具有很多独特的优势,简直不要太简单。 一、轻量级的协程(Goroutine) 在传统…...
5G学习笔记之Non-Public Network
目录 0. NPN系列 1. 概述 2. SNPN 2.1 SNPN概述 2.2 SNPN架构 2.3 SNPN部署 2.3.1 完全独立 2.3.2 共享PLMN基站 2.3.3 共享PLMN基站和PLMN频谱 3. PNI-NPN 3.1 PNI-NPN概述 3.2 PNI-NPN部署 3.2.1 UPF独立 3.2.2 完全共享 0. NPN系列 1. NPN概述 2. NPN R18 3. 【SNPN系列】S…...
SpringBoot——核心概念
文章目录 一.核心概念IoC/DI思想2.Ioc容器3.Bean 二.IoC入门案例三.DI入门案例分析四.bean基础配置五.bean的实例化(创建)六.bean实例化——静态工厂七.bean实例化——示例工程与FactoryBean八.bean的生命周期九.依赖注入的两种方式十.构造器注入十一.依…...
【HarmonyOs学习日志(14)】计算机网络之域名系统DNS
域名系统DNS 域名系统DNS——从域名解析出IP地址 文章目录 域名系统DNS概述域名到IP地址的解析 互联网的域名结构命名标准 域名服务器域名的解析过程 概述 域名系统DNS(Domain Name System)是互联网使用的命名系统,用来把便于人们使用的机器…...
电脑丢失bcrypt.dll文件是什么原因?找不到bcrypt.dll文件修复办法来啦!
电脑运行时常见问题及解决方案:文件丢失、文件损坏与系统报错 作为一名软件开发从业者,深知电脑在日常使用中难免会遇到各种问题,如文件丢失、文件损坏和系统报错等。这些问题不仅影响工作效率,还可能带来数据丢失的风险。今天&a…...
shell编程3
声明 学习视频来自B站UP主 泷羽sec 向脚本程序传递参数 可以向脚本程序传递一个或多参数 echo 执行的文件名是:S0 echo 第一个参数是: 1 e c h o 传递的参数作为一个字符串显示 : 1 echo 传递的参数作为一个字符串显示: 1echo传递的参数作为一个字符串显示:* echo 传递的参数…...
LAUNCHXL_F28379D_Workspace_CCS124
/// 安装 controlSUITE C:\ti\controlSUITE\device_support\F2837xD\v210 /// /// /// /// /// 删除 /// /// /// >> Compilation failure source_common/subdir_rules.mk:9: recipe for target source_common/F2837xD_Adc.obj failed "C:/ti/controlSUITE/devic…...
智慧商城:编辑切换状态,删除功能
编辑切换状态 为 编辑 注册点击事件进行状态取反,为该状态赋一个初始值 false 如果是非编辑状态是要进行结算的,否则删除 点击“编辑”状态是 要进行 “删除”,非编辑状态是要进行 “结算” 当 结算 时,希望是能 全选 进而能多卖…...
支付测试 流程
支付测试 流程 支付测试是确保支付系统安全、稳定、可靠运行的关键环节,以下是其一般流程: 测试计划阶段 明确测试目标:确定本次支付测试的重点和预期达到的目标,如测试支付功能的完整性、安全性、性能等。制定测试计划&#x…...
Ai编程从零开始全栈开发一个后台管理系统之用户登录、权限控制、用户管理-前端部分(十二)
云风网 云风笔记 云风知识库 一、创建前端部分 1、vite初始化项目 npm create vitelatest admin-frontend – --template vue-ts 2、安装必要的依赖 npm install vue-router pinia axios element-plus element-plus/icons-vue安装完成后package.json如下: {&qu…...
LeetCode 197. 上升的温度
LeetCode 197. 上升的温度 表: Weather ---------------------- | Column Name | Type | ---------------------- | id | int | | recordDate | date | | temperature | int | ---------------------- id 是该表具有唯一值的列。 没有具有相同 recordDate 的不同行。…...
ECharts散点图-气泡图,附视频讲解与代码下载
引言: ECharts散点图是一种常见的数据可视化图表类型,它通过在二维坐标系或其它坐标系中绘制散乱的点来展示数据之间的关系。本文将详细介绍如何使用ECharts库实现一个散点图,包括图表效果预览、视频讲解及代码下载,让你轻松掌握…...
【pycharm】对需要传参数以及配置文件的情况进行debug教程
【pycharm】对需要传参数以及配置文件的情况进行debug教程 例如下面这个项目,我们要运行需要在终端输入 python main.py -mtrain -trsr0.03 -vsr0.01其中 -m‘train’ -trsr0.03 -vsr0.01是我们需要传的参数 在终端运行如下: 如果我们要进行debug的话…...
three.js混合白色模型的智慧城市扫光效果
three.js混合白色模型的智慧城市扫光效果 https://threehub.cn/#/codeMirror?navigationThreeJS&classifyshader&idcityBlendLight import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls.js import { FBXLoader …...
【QT常用技术讲解】发送POST包(两种方式:阻塞方式及非阻塞方式)
前言 http/https(应用层)协议是广泛使用的网络通信协议。在很多与第三方API对接的场景中,通常是通过http/https协议完成,比如API对接时,通常要通过POST包获取access_token进行鉴权,然后再进行数据交互(本篇也包含有对接…...
基于Python大数据的电影可视化分析系统
标题:基于 Python 大数据的电影可视化分析系统 内容:1.摘要 本文介绍了一个基于 Python 大数据的电影可视化分析系统。该系统通过收集和分析大量电影数据,提供了对电影市场的深入洞察。文章首先介绍了系统的背景和目的,然后详细描述了系统的架构和功能。…...
Vue3:uv-upload图片上传
效果图: 参考文档: Upload 上传 | 我的资料管理-uv-ui 是全面兼容vue32、nvue、app、h5、小程序等多端的uni-app生态框架 (uvui.cn) 代码: <view class"greenBtn_zw2" click"handleAddGroup">添加班级群</vie…...
VBA技术资料MF243:利用第三方软件复制PDF数据到EXCEL
我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…...
redis使用注意哪些事项
1. 数据类型选择: • Redis支持多种数据类型,如字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等。在选择…...
Go使用sqlx操作MySQL完整指南
# Go使用sqlx操作MySQL完整指南## 1. 安装依赖bash go get github.com/go-sql-driver/mysql go get github.com/jmoiron/sqlx2. 数据库基础操作 package mainimport ("fmt"_ "github.com/go-sql-driver/mysql""github.com/jmoiron/sqlx" )// 定…...
计算机基础复习12.23
ThreadLocal 线程隔离:ThreadLocal为每个线程提供了独立的变量副本,意味着线程之间不会相互影响,可以安全的在多线程环境中使用这些变量而不必担心数据竞争或同步问题 ThreadLocal的实现依赖于Thread类中的一个ThreadLocalMap字段ÿ…...
Jenkins介绍
Jenkins 是一款流行的开源自动化服务器,在软件开发和持续集成 / 持续交付(CI/CD)流程中发挥着关键作用。 一、主要功能 1.持续集成(CI) (1).自动构建:Jenkins 可以配置为监听代码仓…...
RK3588 , mpp硬编码yuv, 保存MP4视频文件.
RK3588 , mpp硬编码yuv, 保存MP4视频文件. ⚡️ 传送 ➡️ Ubuntu x64 架构, 交叉编译aarch64 FFmpeg mppRK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGBRk3588 FFmpeg 拉流 RTSP, 硬解码转RGBRK3588 , mpp硬编码yuv, 保存MP4视频文件....
Delphi WebBrowser 基本操作与常见问题的解决方案
前言 WebBrowser 作为Delphi 常见的网络浏览控件,我这里整理了一些它的基本操作,遇到了一些问题,我梳理了一下并给出解决方案 基本操作 WebBrowser1.GoHome; //到浏览器默认主页 WebBrowser1.Refresh; //刷新 WebBrowser1.GoBack; //后退 Web…...
【更新】LLM Interview
课程链接:BV1o217YeELo 文章目录 LLM基础相关1. LLMs概述2. 大语言模型尺寸3. LLMs的优势与劣势4. 常见的大模型分类5. 目前主流的LLMs开源模型体系有哪些(Prefix Decoder,Causal Decoder,Encoder-Decoder的区别是什么)…...
从零开始C++棋牌游戏开发之第一篇:C++ 游戏开发环境搭建与工具简介
前言:作者的感想 每一次选择开始一项新技能的学习,总会让人感到既兴奋又有些许忐忑。C 游戏开发,尤其是针对棋牌类游戏规则实现的开发,更是一个有趣而充满挑战的领域。作为一名开发者,我深知面对 C 时的那种 "既…...
Hydrogen-Web 项目常见问题解决方案
Hydrogen-Web 项目常见问题解决方案 hydrogen-web Lightweight matrix client with legacy and mobile browser support [这里是图片001] 项目地址: https://gitcode.com/gh_mirrors/hy/hydrogen-web 项目基础介绍 Hydrogen-Web 是一个轻量级的 Matrix 客户端,专…...
LabVIEW中的“Synchronize with Other Application Instances“
在LabVIEW中,“Synchronize with Other Application Instances”是一个常见的提示或错误,通常出现在尝试并行运行多个LabVIEW实例时,特别是当你打开多个VI或项目时。这个问题可能影响程序的执行流程,导致不同实例之间的数据同步或…...
Hslcommunication通讯调用
Vs2022选择配置属性选择高级语言运行时(/clr);符合模式选择否;引用选择Hslcommunication.dll和HslCppExtension.dll; Demo #include <iostream> using namespace HslCommunication; using namespace HslCommunication::Core::Net; using namespace HslCommunication::Mo…...
渐进式 Web 应用程序:新的 FE 系统
在企业环境中,我们通常认为稳定的互联网连接是理所当然的。然而,现实世界的条件经常挑战这一假设,可能会中断关键业务运营。本文详细介绍了我们如何将传统的纯在线 ERP 系统转变为具有弹性、支持离线的解决方案的更可靠的系统。通过利用基于浏…...
安科瑞能源物联网平台在老旧小区用电安全改造中的应用与优势
安科瑞 吕梦怡 一、现状 老旧住宅小区普遍存在建成时间久远的情况,其电力系统刚开始的设计标准已难以匹配当下居民不断攀升的用电需求。电力基础设施老化现象较为突出,例如电线的绝缘层出现破损、电表箱被锈蚀以及配电设备超期服役等问题比比皆是。小…...
[Effective C++]条款36-37 两个绝不
本文初发于 “天目中云的小站”,同步转载于此。 条款36 : 绝不重新定义继承而来的non-virtual函数 本条款很容易理解, 援引以前的条款就可以说明为什么 : 条款34中就提到过 : non-virtual函数意味着接口 强制性实现继承, 它不应当被改变. 重新定义继承而来的non-…...
MySQL数据库——复制表数据与结构
命令格式 create table 表名 select 字段1,字段2 from 被复制表 首先新建一个表,然后从被复制的表中选择字段复制到新表 举例...
一文掌握如何编写可重复执行的SQL
一文掌握如何编写可重复执行的SQL 文章已同步个人博客:一文掌握如何编写可重复执行的SQL 背景 先提出问题,这里的可重复执行是指什么?我们为什么要编写可重复执行的sql? 可重复执行是指一条sql重复多次执行都不会报错…...
编译笔记:vs 中 正在从以下位置***加载符号 C# 中捕获C/C++抛出的异常
加载符号 解决方法: 进入VS—工具—选项----调试----符号,看右边有个“Microsoft符号服务器”,将前面的勾去掉,(可能还有删除下面的那个缓存)。 参考 C# 中捕获C/C抛出的异常 在需要捕捉破坏性异常的函数…...
[搜广推]王树森推荐系统——Deep Retrieval 召回
Deep Retrieval 简介 Deep Retrieval 是一种推荐系统框架,它将物品表示为路径(path),并在线上查找与用户最匹配的路径。 这种方法与传统的双塔模型不同,后者通常将用户和物品表示为向量,并在线上进行最近邻…...
【深入解析蓝牙dumpsys bluetooth_manager 命令输出】
了解蓝牙的工作状态以及如何在测试中利用这些信息。 1. Bluetooth Status(蓝牙状态) enabled: true state: ON address: 00:00:00:00:43:36 name: 小米手机 time since enabled: 00:15:18.492enabled: true — 蓝牙功能已启用。state: ON — 蓝牙目前是开启状态。address: …...
【三】Fast-DDS hello world!
编译hello world # 进入到源码目录 mkdir -p examples/cpp/hello_world/build cd examples/cpp/hello_world/build cmake .. && make -j4运行publisher ./hello_world publisher 运行subscriber ./hello_world subscriber 结果...