Python Selenium 库学习指南
Python Selenium 库学习指南
目录
- Selenium 基础介绍
- Selenium 是什么
- 安装 Selenium
- Selenium 的工作原理
- Selenium 基本用法
- 启动浏览器
- 定位元素
- 常见操作:点击、输入、滚动
- 高级用法
- 切换窗口与标签页
- 模拟鼠标操作与键盘输入
- 动态加载的网页处理
- 等待机制
- 显式等待与隐式等待
- 等待条件与时间限制
- Selenium 与浏览器交互
- 模拟用户行为
- 上传与下载文件
- Selenium 与 JavaScript 的交互
- 执行 JavaScript 代码
- 获取 JavaScript 渲染的内容
- 常见问题与解决方案
- 报错与调试
- 遇到反爬虫机制时的处理
- Selenium 实战:自动化测试与爬虫应用
- 自动化测试的基本框架
- 使用 Selenium 爬取动态网页数据
- 总结与扩展
第一章:Selenium 基础介绍
1.1 Selenium 是什么
Selenium 是一个强大的浏览器自动化工具,它可以模拟用户在浏览器中的操作,如点击按钮、输入文本、滚动页面等。它最初用于 Web 应用的自动化测试,但在数据抓取和爬虫领域也得到了广泛应用,特别是抓取动态加载的网页内容。
Selenium 可以与多种浏览器配合使用,包括 Chrome、Firefox、Edge、Safari 等,它通过 WebDriver 接口与浏览器交互。
1.2 安装 Selenium
安装 Selenium 非常简单,首先需要安装 selenium
库。在终端或者命令行中运行以下命令:
pip install selenium
Selenium 需要与浏览器驱动程序(如 ChromeDriver 或 GeckoDriver)配合使用,浏览器驱动程序负责控制浏览器的行为。以 Chrome 浏览器为例,你需要下载与浏览器版本匹配的 chromedriver
:
- 下载地址:ChromeDriver
- 解压并将其路径添加到系统的环境变量中,或者在代码中指定路径。
1.3 Selenium 的工作原理
Selenium 通过 WebDriver 与浏览器交互。WebDriver 是浏览器的接口,允许你通过编程控制浏览器的行为。例如,启动浏览器、访问网页、执行点击操作、获取页面元素等。
Selenium 与浏览器的通信是通过 HTTP 协议实现的,WebDriver 会向浏览器发送 HTTP 请求,而浏览器则根据请求执行相应操作。
第二章:Selenium 基本用法
2.1 启动浏览器
首先,我们需要启动浏览器并加载网页。以下是启动 Chrome 浏览器并访问网页的基本代码:
from selenium import webdriver# 指定浏览器驱动路径(如果已添加环境变量则可省略)
driver = webdriver.Chrome(executable_path='/path/to/chromedriver')# 访问指定 URL
driver.get('https://www.example.com')# 打印网页标题
print(driver.title)# 关闭浏览器
driver.quit()
2.2 定位元素
在 Selenium 中,元素的定位是与浏览器交互的关键步骤。你可以通过多种方法来定位元素,常见的有:
- By.ID:根据元素的
id
属性定位 - By.NAME:根据元素的
name
属性定位 - By.XPATH:使用 XPath 表达式定位元素
- By.CSS_SELECTOR:使用 CSS 选择器定位元素
- By.CLASS_NAME:根据类名定位元素
- By.TAG_NAME:根据标签名定位元素
示例:根据 ID 定位并点击一个按钮
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()# 访问网页
driver.get('https://www.example.com')# 定位并点击按钮
button = driver.find_element(By.ID, 'submit-button')
button.click()driver.quit()
示例:使用 XPath 定位元素
# 定位并获取元素文本
element = driver.find_element(By.XPATH, '//h1')
print(element.text)
2.3 常见操作
在 Selenium 中,常见的操作包括点击、输入文本、清空文本框、滚动页面等。
2.3.1 点击元素
button = driver.find_element(By.ID, 'submit-button')
button.click()
2.3.2 输入文本
input_field = driver.find_element(By.NAME, 'username')
input_field.send_keys('my_username')
2.3.3 清空输入框
input_field.clear()
2.3.4 滚动页面
from selenium.webdriver.common.action_chains import ActionChains# 滚动到页面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")# 或者滚动到指定元素
element = driver.find_element(By.ID, 'target-element')
ActionChains(driver).move_to_element(element).perform()
第三章:高级用法
3.1 切换窗口与标签页
在 Selenium 中,你可以在多个窗口或标签页之间进行切换。每个浏览器窗口都有一个唯一的句柄(handle),你可以通过句柄来切换窗口。
示例:切换窗口
# 获取当前窗口句柄
main_window = driver.current_window_handle# 打开新窗口并获取新窗口句柄
driver.find_element(By.ID, 'new-window').click()
new_window = driver.window_handles[1]# 切换到新窗口
driver.switch_to.window(new_window)# 在新窗口中进行操作
driver.find_element(By.ID, 'some-element').click()# 切换回主窗口
driver.switch_to.window(main_window)
3.2 模拟鼠标操作与键盘输入
Selenium 支持模拟鼠标点击、双击、右键点击等操作,以及键盘输入(如按下 Enter 键)。
模拟鼠标操作
from selenium.webdriver.common.action_chains import ActionChains# 鼠标悬停在一个元素上
element = driver.find_element(By.ID, 'hover-element')
actions = ActionChains(driver)
actions.move_to_element(element).perform()# 右键点击
actions.context_click(element).perform()
模拟键盘输入
from selenium.webdriver.common.keys import Keys# 输入文本并按 Enter 键
input_field = driver.find_element(By.NAME, 'search')
input_field.send_keys('Python')
input_field.send_keys(Keys.RETURN)
3.3 动态加载的网页处理
有些网页的内容是通过 JavaScript 动态加载的,Selenium 可以帮助你处理这些动态加载的网页。
示例:等待网页加载
import time# 等待页面加载完毕
time.sleep(3)# 处理动态加载的内容
dynamic_element = driver.find_element(By.ID, 'dynamic-content')
print(dynamic_element.text)
第四章:等待机制
4.1 显式等待与隐式等待
在 Selenium 中,网页内容的加载可能需要一些时间,特别是在动态加载的页面上。为了解决这一问题,Selenium 提供了等待机制,分为显式等待和隐式等待。
4.1.1 隐式等待
隐式等待是设置一个全局的等待时间,当查找元素时,如果元素没有马上出现,Selenium 会等待一定的时间再去查找。
driver = webdriver.Chrome()
driver.implicitly_wait(10) # 设置等待时间为 10 秒driver.get('https://www.example.com')
element = driver.find_element(By.ID, 'some-element')
4.1.2 显式等待
显式等待是为某个特定的元素设置等待条件,直到条件满足或超时为止。通常配合 WebDriverWait
和 expected_conditions
使用。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECdriver = webdriver.Chrome()
driver.get('https://www.example.com')# 等待元素加载完成,最多等待 10 秒
element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'some-element'))
)print(element.text)
第五章:Selenium 与浏览器交互
5.1 模拟用户行为
Selenium 允许你模拟用户的各种行为,几乎可以完成任何在浏览器中手动操作的任务。这包括点击、拖动、键盘输入、滚动等。
5.1.1 模拟点击行为
点击行为通常用来模拟用户点击网页中的按钮或链接。使用 click()
方法可以模拟点击操作。
# 定位按钮并点击
button = driver.find_element(By.ID, 'submit-button')
button.click()
5.1.2 模拟输入文本
通过 send_keys()
方法,Selenium 可以模拟用户在输入框中输入文本。你可以输入普通文本,也可以输入特殊的按键(如 Enter
、Tab
等)。
# 定位输入框并输入文本
input_field = driver.find_element(By.NAME, 'search')
input_field.send_keys('Python Selenium')# 模拟按下回车键
input_field.send_keys(Keys.RETURN)
5.1.3 鼠标拖动与放置
Selenium 可以模拟鼠标拖动操作,例如拖动一个元素并放置到另一个位置。
from selenium.webdriver.common.action_chains import ActionChains# 定位源元素与目标元素
source_element = driver.find_element(By.ID, 'draggable')
target_element = driver.find_element(By.ID, 'droppable')# 模拟拖拽操作
actions = ActionChains(driver)
actions.drag_and_drop(source_element, target_element).perform()
5.2 上传与下载文件
Selenium 也可以模拟文件上传和下载操作,这对于自动化测试非常有用。
5.2.1 上传文件
上传文件是通过 send_keys()
方法将文件路径输入到文件选择框中来完成的。确保你的页面中有一个 <input type="file">
元素。
# 定位上传文件的输入框并发送文件路径
file_input = driver.find_element(By.ID, 'file-upload')
file_input.send_keys('/path/to/your/file.txt')# 提交上传表单
submit_button = driver.find_element(By.ID, 'submit')
submit_button.click()
5.2.2 下载文件
Selenium 本身不直接支持文件下载,但你可以通过修改浏览器设置来实现自动下载。对于 Chrome 浏览器,你可以配置下载目录并禁止弹出下载对话框。
from selenium import webdriver# 设置下载路径
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--headless") # 无头模式
chrome_options.add_argument("--disable-gpu")
chrome_options.add_experimental_option("prefs", {"download.default_directory": "/path/to/your/download/directory","download.prompt_for_download": False, # 禁止弹出下载对话框
})driver = webdriver.Chrome(options=chrome_options)
driver.get('http://example.com/download-link')# 执行下载操作
download_button = driver.find_element(By.ID, 'download')
download_button.click()
第六章:Selenium 与 JavaScript 的交互
6.1 执行 JavaScript 代码
Selenium 允许你通过 execute_script()
方法在浏览器中执行 JavaScript 代码。这对于动态网页的处理或需要控制浏览器的行为时非常有用。
6.1.1 执行简单的 JavaScript
# 执行 JavaScript 代码,滚动页面到底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
6.1.2 获取 JavaScript 渲染的内容
有些网页内容是通过 JavaScript 动态渲染的,Selenium 允许你获取这些动态生成的内容。例如,可以通过 execute_script()
获取页面的 HTML 内容。
# 获取页面渲染后的 HTML
page_html = driver.execute_script("return document.documentElement.outerHTML")
print(page_html)
6.1.3 执行自定义的 JavaScript 代码
你也可以通过 execute_script()
执行自定义的 JavaScript 代码,控制页面行为。
# 让页面元素改变颜色
driver.execute_script("document.body.style.backgroundColor = 'yellow';")
第七章:常见问题与解决方案
7.1 Selenium 常见错误与调试
在使用 Selenium 时,可能会遇到一些常见的错误,以下是一些常见问题及解决方案。
7.1.1 元素未找到错误 (NoSuchElementException
)
当 Selenium 无法定位到某个元素时,会抛出 NoSuchElementException
异常。常见原因包括元素尚未加载、定位方法错误等。
解决方案:
- 使用等待机制,确保元素加载完成后再进行操作。
- 检查元素的定位方式是否正确。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 显式等待直到元素可见
element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'submit-button'))
)
element.click()
7.1.2 超时错误 (TimeoutException
)
TimeoutException
通常发生在等待元素时超时。如果页面加载过慢或网络不稳定,可能导致此错误。
解决方案:
- 增加等待时间。
- 使用
WebDriverWait
等待页面加载或某个元素的出现。
from selenium.webdriver.support.ui import WebDriverWait# 等待页面加载完毕
driver.get('https://www.example.com')
WebDriverWait(driver, 15).until(lambda driver: driver.execute_script("return document.readyState") == "complete")
7.1.3 浏览器闪退或崩溃
浏览器闪退或崩溃通常与系统环境、驱动版本、浏览器版本不匹配等因素有关。
解决方案:
- 确保浏览器和浏览器驱动的版本一致。
- 使用无头模式(Headless)来减少资源占用。
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--headless") # 无头模式
driver = webdriver.Chrome(options=chrome_options)
第八章:Selenium 实战
8.1 自动化测试的基本框架
Selenium 常用于 Web 应用的自动化测试,自动化测试能够模拟用户的操作,确保应用程序的功能正常。常见的测试框架有 unittest
、pytest
等。以下是一个使用 unittest
的基本示例:
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import Byclass TestWebsite(unittest.TestCase):def setUp(self):self.driver = webdriver.Chrome()self.driver.get('https://www.example.com')def test_title(self):self.assertEqual(self.driver.title, 'Example Domain')def test_button_click(self):button = self.driver.find_element(By.ID, 'submit-button')button.click()self.assertTrue(self.driver.find_element(By.ID, 'next-page'))def tearDown(self):self.driver.quit()if __name__ == '__main__':unittest.main()
8.2 使用 Selenium 爬取动态网页数据
动态加载网页内容通常使用 JavaScript 进行渲染,Selenium 能够处理这些动态网页。以下是一个使用 Selenium 抓取动态数据的例子:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import timedriver = webdriver.Chrome()
driver.get('https://quotes.toscrape.com/js/')# 等待动态内容加载
time.sleep(3)# 获取页面中的所有引言
quotes = driver.find_elements(By.CLASS_NAME, 'quote')
for quote in quotes:text = quote.find_element(By.CLASS_NAME, 'text').textauthor = quote.find_element(By.CLASS_NAME, 'author').textprint(f'"{text}" - {author}')driver.quit()
第九章:总结与扩展
通过本篇文章,你应该已经掌握了 Selenium 的基础使用、常见操作以及一些高级技巧。以下是一些扩展内容,你可以继续深入学习:
- 浏览器调试:了解如何调试 Selenium 代码,分析网络请求,处理 JavaScript 渲染的问题。
- 多浏览器支持:学习如何在不同浏览器(如 Firefox、Edge)中使用 Selenium。
- 分布式爬虫:了解如何结合 Selenium 和分布式爬虫框架(如 Scrapy 或 Celery)来构建大规模的爬虫。
- 性能优化:学习如何优化 Selenium 脚本的执行速度,例如使用无头浏览器,减少冗余的等待时间等。
Selenium 是一个功能强大的工具,可以应用于自动化测试、数据抓取和许多其他领域。希望这篇教程能够帮助你掌握 Selenium 的基本用法,进一步提升你在 Python 编程中的技能。如果有任何问题,欢迎随时提问!
相关文章:
Python Selenium 库学习指南
Python Selenium 库学习指南 目录 Selenium 基础介绍 Selenium 是什么安装 SeleniumSelenium 的工作原理 Selenium 基本用法 启动浏览器定位元素常见操作:点击、输入、滚动 高级用法 切换窗口与标签页模拟鼠标操作与键盘输入动态加载的网页处理 等待机制 显式等待…...
如何解决Webview和H5缓存问题,确保每次加载最新版本的资源
WebView 用于加载 H5 页面是常见的做法,它能够加载远程的 HTML、CSS、JavaScript 资源,并且让 Web 应用嵌入到原生 App 中。然而,WebView 的缓存机制有时会导致用户看到的是旧版本的页面或资源,尤其是在 H5 发版后,iOS…...
costmap 中点与多边形的相对位置关系
一、背景 近期在阅读move_base源码costmap部分(感觉想玩转movebase导航,costmap必须理解呀)。读到两处点与多边形的相对位置关系。在此总结一下,分别是: intersects: 利用待测点向右引出的射线与多边形的交点数来确定相对位置。有的称 射线交叉算法&am…...
C#与Vue2上传下载Excel文件
1、上传文件流程:先上传文件,上传成功,返回文件名与url,然后再次发起请求保存文件名和url到数据库 前端Vue2代码: 使用element的el-upload组件,action值为后端接收文件接口,headers携带session信…...
.NetCore 使用 NPOI 读取带有图片的excel数据
在.NetCore使用NPOI插件进行批量导入时,获取Excel中的所有的图片数据,存到集合中。 1.定义类PictureData 代码如下: public class PictureData { public byte[] Data { get; set; } } 2.数据集引用 using NPOI.XSSF.UserModel; usin…...
鸿蒙打包发布
HarmonyOS应用/元服务发布(打包发布) https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/ide-publish-app-V13?catalogVersionV13 密钥:包含非对称加密中使用的公钥和私钥,存储在密钥库文件中,格式…...
C++并发编程之跨应用程序与驱动程序的单生产者单消费者队列
设计一个单生产者单消费者队列(SPSC队列),不使用C STL库或操作系统原子操作函数,并且将其放入跨进程共享内存中以便在Ring3(用户模式)和Ring0(内核模式)之间传递数据,是一…...
22、PyTorch nn.Conv2d卷积网络使用教程
文章目录 1. 卷积2. python 代码3. notes 1. 卷积 输入A张量为: A [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ] \begin{equation} A\begin{bmatrix} 0&1&2&3\\\\ 4&5&6&7\\\\ 8&9&10&11\\\\ 12&13&14&15 \end{b…...
智汇云舟参编《城市轨道交通安全防范系统技术要求》国标正式发布
近日,根据国家标准化管理委员会官网,全国标准信息公共服务平台发布的公告,国家标准《城市轨道交通安全防范系统技术要求》(GB/T 26718-2024)已由全国城市轨道交通标准化技术委员会上报国家标准化管理委员会,…...
C# 数据拟合教程:使用 Math.NET Numerics 的简单实现
C# 数据拟合实战:使用 Math.NET Numerics 快速实现 引言 在科学计算、工程建模或数据分析中,数据拟合是一个非常重要的技术。无论是线性拟合还是非线性拟合,借助适当的工具都可以快速解决问题。本文将向您展示如何使用 C# 和强大的数值计算…...
WEB攻防-通用漏洞_XSS跨站_权限维持_捆绑钓鱼_浏览器漏洞
目录 XSS的分类 XSS跨站-后台植入Cookie&表单劫持 【例1】:利用beef或xss平台实时监控Cookie等凭据实现权限维持 【例2】:XSS-Flash钓鱼配合MSF捆绑上线 【例3】:XSS-浏览器网马配合MSF访问上线 XSS的分类 反射型(非持久…...
瑞芯微 RK 系列 RK3588 使用 ffmpeg-rockchip 实现 MPP 视频硬件编解码-代码版
前言 在上一篇文章中,我们讲解了如何使用 ffmpeg-rockchip 通过命令来实现 MPP 视频硬件编解码和 RGA 硬件图形加速,在这篇文章,我将讲解如何使用 ffmpeg-rockchip 用户空间库(代码)实现 MPP 硬件编解码。 本文不仅适…...
MySQL数据库(SQL分类)
SQL分类 分类全称解释DDLData Definition Language数据定义语言,用来定义数据库对象(数据库,表,字段)DMLData Manipulation Language数据操作语言,用来对数据库表中的数据进行增删改DQLData Query Languag…...
SpringBoot-Day1
1.Springboot入门 创建Maven工程 导入spring-boot-stater-web起步依赖 编写Controller 提供启动类 2.yml配置信息书写与获取 书写 # 发件人信息 email:user: 172349823457qq.comcode: sajdajlwhjfgfkllwhost: smtp.qq.comauth: true # 学生爱好 hobbies:- 打篮球- 踢…...
【JavaScript】基础内容,HTML如何引用JavaScript, JS 常用的数据类型
HTML 嵌入 Javascript 的方式 引入外部 js 文件 <head> <script Language "javaScript" src"index.js"/> </head>内部声明 <head> <script language"javascript">function hello(){alert("hello word&qu…...
mysql中创建计算字段
目录 1、计算字段 2、拼接字段 3、去除空格和使用别名 (1)去除空格 (2)使用别名:AS 4、执行算术计算 5、小结 博主用的是mysql8 DBMS,附上示例资料: 百度网盘链接: https://pan.baidu.co…...
如何优化zibll子比主题SEO并设置有效robots文件
如果你不知道 robots.txt 是什么,也不确定如何正确地设置它,本篇文章会向您介绍适用于子比主题的 robots.txt 文件,利用它可以提升 SEO 的效果,避免收录无关页面,从而解决网站被收录但无权重的困境。 作为一款高效的 …...
线程间通信
线程间通信(Inter-Thread Communication, 简称ITC)是指在多线程编程中,不同线程之间如何交换信息或协调彼此的行为。良好的线程间通信机制是构建高效、可靠的并发程序的关键。Java语言提供了多种内置工具和库来支持线程间的通信,包…...
【实践】操作系统智能助手OS Copilot新功能测评
一、引言 数字化加速发展,尤其人工智能的发展速度越来越快。操作系统智能助手成为提升用户体验与操作效率的关键因素。OS Copilot借助语言模型,人工智能等,对操作系统的自然语言交互操作 推出很多功能,值得开发,尤其运…...
今年的电商年货节,主流的营销策略是怎样?
随着一年的年关将近,新一年的CNY营销也逐渐拉开帷幕。考虑到此时消费需求的膨胀,这个时间不论对于线上还是线下市场而言,都是重要的营销节点。今年CNY营销,电商平台上的主流营销策略是这样?就让我们来简单了解下概况。…...
Java设计模式——单例模式(特性、各种实现、懒汉式、饿汉式、内部类实现、枚举方式、双重校验+锁)
文章目录 单例模式1️⃣特性💪单例模式的类型与实现:类型懒汉式实现(线程不安全)懒汉式实现(线程安全)双重锁校验懒汉式(线程安全)饿汉式实现(线程安全)使用类的内部类实现⭐枚举方式实现单例(推荐)👍 单例…...
基于 Python 的学生成绩管理系统设计与实现
标题:基于 Python 的学生成绩管理系统设计与实现 内容:1.摘要 摘要:本文介绍了一个基于 Python 的学生成绩管理系统的设计与实现。该系统旨在提高学生成绩管理的效率和准确性,方便教师和学生进行成绩查询和分析。本文详细描述了系统的设计思路、功能模块…...
局域网共享文件夹实现两台Windows电脑之间传输文件
文章目录 1. 启用网络发现和文件共享2. 设置共享文件夹3. 记录主电脑的IP地址4. 在第二台电脑访问共享文件夹5. 故障排查6. 启用文件共享未生效方案1:检查服务状态方案2:检查防火墙设置方案3:检查网络类型方案4:使用“管理员命令提…...
JS的事件循环机制
<script>setTimeout(()>{console.log(1)},1000)setTimeout(()>{console.log(2)},3000)var start Date.now();while ( (Date.now() - start) < 10000 ){}console.log(3)</script>执行如下代码会发现先打印3,再打印1 再打印2。 现象本质还是因为…...
《自动驾驶与机器人中的SLAM技术》ch9:自动驾驶车辆的离线地图构建
目录 1 点云建图的流程 2 前端实现 2.1 前端流程 2.2 前端结果 3 后端位姿图优化与异常值剔除 3.1 两阶段优化流程 3.2 优化结果 ① 第一阶段优化结果 ② 第二阶段优化结果 4 回环检测 4.1 回环检测流程 ① 遍历第一阶段优化轨迹中的关键帧。 ② 并发计算候选回环对…...
环境搭建——Mysql、Redis、Rocket MQ部署
前言 在搭建分布式系统时,MySQL、Redis 和 RocketMQ 是常用的基础服务。每个服务各自的功能不同,但它们在数据存储、缓存、消息队列等方面不可或缺。如果你是初学者,别担心,本文会一步步详细教你如何在服务器上通过 Docker 部署这…...
Pycharm连接远程解释器
这里写目录标题 0 前言1 给项目添加解释器2 通过SSH连接3 找到远程服务器的torch环境所对应的python路径,并设置同步映射(1)配置服务器的系统环境(2)配置服务器的conda环境 4 进入到程序入口(main.py&#…...
git的基本操作
创建分支: 1,拉去develop代码; 2,git checkout develop切换到develop; 3,git branch lyb/lyb_develop ; 4,git push --set-upstream origin lyb/lyb_develop 切换分支,上…...
Linux软件包管理工具概览
目录 RPM(RedHat Package Manager) DPKG(Debian Packager) APT(Advanced Package Tool) YUM(Yellowdog Updater, Modified) DNF(Dandified YUM) 总结 在…...
unity学习16:unity里向量的计算,一些方法等
目录 1 unity里的向量: 2 向量加法 2.1 向量加法的几何意义 2.2向量加法的标量算法 3 向量减法 3.1 向量减法的几何意义 3.2 向量减法的标量算法 4 向量的标量乘法 5 向量之间的乘法要注意是左乘 还是右乘 5.1 注意区别 5.2 向量,矩阵&#x…...
HTML拖拽功能(纯html5+JS实现)
1、HTML拖拽--单元行拖动 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><…...
w158医院资源管理系统的设计与实现
🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…...
【计算机网络】lab3 802.11 (无线网络帧)
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀计算机网络_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2.…...
linux进程
课本概念:程序的⼀个执行实例,正在执行的程序等内核观点:担当分配系统资源(CPU时间,内存)的实体。 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合.课本上称之为PCB&…...
pytest-allure框架简单封装----测试报告
安装allure-commandline---可以支持allure命令 把对应的压缩包解压后,把xxx/bin配置到环境变量的path去 可以输入allure -version检查版本 pip install allure-pytest2.11.1 生成测试报告 import pytest pytest_args ["-s","-v","--capturesys…...
【2025最新计算机毕业设计】基于SpringBoot+Vue奶茶点单系统(高质量源码,提供文档,免费部署到本地)
作者简介:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容:🌟Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…...
HTML中最基本的东西
本文内容的标签,将是看懂HTML的最基本之基本 ,是跟您在写文章时候一样内容。一般想掌握极其容易,但是也要懂得如何使用,过目不忘,为手熟尔。才是我们学习的最终目的。其实边看边敲都行,或者是边看边复制粘贴…...
Open FPV VTX开源之ardupilot配置
Open FPV VTX开源之ardupilot配置 1. 源由2. 配置3. 总结4. 参考资料5. 补充5.1 飞控固件版本5.2 配置Ardupilot的BF OSD5.3 OSD偏左问题 1. 源由 飞控嵌入式OSD - ardupilot配置使用ardupliot配套OSD图片。 Choose correct font depending on Flight Controller SW. ──>…...
基于OQuPy的量子编程实例探究:理论、实践与展望
基于OQuPy的量子编程探究:理论、分析与实践 一、引言 1.1 研究背景与意义 近年来,量子计算作为一种革命性的计算范式,在科学界与产业界引发了广泛关注。它依托量子力学原理,运用量子比特(qubit)进行信息处理,与传统计算相比,具备并行处理、指数级加速等显著优势,为解…...
深入理解 ECMAScript 2024 新特性:正则表达式 /v 标志
ECMAScript 2024 (ES15)标准引入了新的正则表达式标志 /v,这一新增功能不仅优化了多行匹配的处理,还增加了对特殊字符匹配的支持。这一变革对于需要处理复杂文本数据的应用场景尤为重要,比如日志分析、代码审核等。接下…...
iOS 逆向学习 - Inter-Process Communication:进程间通信
iOS 逆向学习 - Inter-Process Communication:进程间通信 一、进程间通信概要二、iOS 进程间通信机制详解1. URL Schemes2. Pasteboard3. App Groups 和 Shared Containers4. XPC Services 三、不同进程间通信机制的差异四、总结 一、进程间通信概要 进程间通信&am…...
Prompt工程框架介绍与场景选择
文章目录 Prompt工程框架介绍1. CREATE框架2. RACE框架3. RISE框架4. ROSES框架5. E.R.A框架6. SAGE框架7. CARE框架8. PEAR框架9. TIER框架10. LEAP框架11. DEEP框架12. WISE框架13. FOCUS框架14. CLEAR框架15. SMART框架16. CLEAR框架17. LEAN框架18. BRIEF框架19. FAST框架2…...
信号量机制之苹果-橘子问题
桌上有一空盘,允许存放一种水果。爸爸可向盘中放苹果,也可向盘中放橘子,儿子专等吃盘中的橘子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一个水果供吃者取用。 要求:请用信号量机制实现爸爸、儿子、女儿三个并发…...
工业路由器和工业交换机,如何打造高效稳定的工业网络?
工业路由器和工业交换机各有千秋,但如何将它们完美结合,构建稳定高效的工业网络?答案就在这里! 工业物联网(IIoT)是高效、稳定的工业网络成为智慧工厂、工业自动化和远程监控等场景的基础支撑。工业路由器…...
【IDEA 2024】学习笔记--文件选项卡
在我们项目的开发过程中,由于项目涉及的类过多,以至于我们会打开很多的窗口。使用IDEA默认的配置,个人觉得十分不便。 目录 一、设置多个文件选项卡按照文件字母顺序排列 二、设置多个文件选项卡分行显示 一、设置多个文件选项卡按照文件字…...
LabVIEW光流算法的应用
该VI展示了如何使用NI Vision Development Module中的光流算法来计算图像序列中像素的运动矢量。通过该方法,可以实现目标跟踪、运动检测等功能,适用于视频处理、机器人视觉和监控领域。程序采用模块化设计,包含图像输入、算法处理、结果展示…...
WPF 如何添加系统托盘
1.使用Nuget 添加 handycontrol cs xmlns:hc"https://handyorg.github.io/handycontrol" 2.窗体添加控件cs <hc:NotifyIcon x:Name"NotifyIconContextContent" Text"软件名称" ContextMenu"{StaticResource ContextMenu}" Click&…...
小游戏前端地区获取
目前前端获取除了太平洋,没有其它的了。 //在JS中都是使用的UTF-8,然而requst请求后显示GBK却是乱码,对传入的GBK字符串,要用数据流接收,responseType: "arraybuffer" tt.request({url: "https://whoi…...
美摄科技为企业打造专属PC端视频编辑私有化部署方案
美摄科技,作为视频编辑技术的先行者,凭借其在多媒体处理领域的深厚积累,为企业量身打造了PC端视频编辑私有化部署解决方案,旨在帮助企业构建高效、安全、定制化的视频创作平台,赋能企业内容创新,提升品牌影…...
【0x005B】HCI_Write_Default_Erroneous_Data_Reporting命令详解
目录 一、命令概述 二、命令格式及参数 2.1. HCI_Write_Default_Erroneous_Data_Reporting命令格式 2.2. Erroneous_Data_Reporting 三、生成事件及参数 3.1. HCI_Command_Complete事件 3.2. 状态码(Status) 四、命令执行流程 4.1. 命令发起阶段(主机端) 4.2. 命…...