自己总结:selenium高阶知识
全篇大概10000字(含代码),建议阅读时间30min
一、等待机制
如果有一些内容是通过Ajax加载的内容,那就需要等待内容加载完毕才能进行下一步操作。
为了避免人为操作等待,会遇到的问题, selenium将等待转换为机器去等待,去判断在什么时间去进行下一步操作。
1.1 页面级等待机制
定义等待页面加载完毕的超时时间,默认设置为0表示等待时间不限。
set_page_load_timeout(最长等待秒数)
设置等待超时时间,全局设置,在WebDriver 生命周期内生效
from selenium import webdriverdriver = webdriver.Chrome()
driver.set_page_load_timeout(3)
driver.get("https://www.selenium.dev/")
driver.quit()
等待时间设置为3秒,如果加载时间超过3秒,就会抛出异常。如果在3秒内加载完成,则执行下一行代码。
1.2元素级等待机制强制等待
也就是说有一些元素需要触发特定区域后才会显示,才能进行下一步操作。
这样就可以使用强制等待方式,通过 time库来进行等待。
from selenium import webdriver
from selenium.webdriver.common.by import By
import timedriver = webdriver.Chrome()
driver.get("https://www.baidu.com")driver.find_element(By.LINK_TEXT, "登录").click()
time.sleep(3)
driver.find_element(By.LINK_TEXT, "立即注册").click()
driver.quit()
不建议使用!
1.3 素级等待机制隐式等待
它是在执行函数时增加一些宽限时间,设置一个最长超出时间,如果在一定时间内元素还是没有出现,直接抛出异常、
implicitly_wait(等待秒数)
隐式等待
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.implicitly_wait(10)driver.get("https://www.baidu.com")
driver.find_element(By.LINK_TEXT, "登录").click()
driver.find_element(By.LINK_TEXT, "立即注册").click()driver.quit()
负作用:
- 检查某元素是否不存在,等待隐式等待中设置最大时长,减缓测试速度。
- 干扰显式等待。
1.4 元素及等待机制 显式等待
指定条件判断函数,每隔一定时间检测该条件是否成立。成立就执行下一步,直到超过最大等待时间。
from selenium.webdriver.support.wait import WebDriverWait
导入
WebDriverWait(WebDriver实例, 超时秒数, 检测时间间隔(可选), 可忽略异常集合(可选))
实例化方法
检测时间间隔: 调用until 或until_not 中传入判断函数的间隔时间,默认0.5秒。
可忽略异常集合:调用until或until_not 中传入判断函数,如果抛出集合中定义的异常,代码不会执行失败,会继续正常执行。默认异常是 NoSuchElementException。
until
等待直到条件判断函数的返回值不为False。
until_not
等待直到条件判断函数返回值为False,如果抛出可忽略异常,会当做False处理。
使用自定义等待条件函数
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWaitdef registerLinkDisplayed(webDriver):# 检测是否已经显示立即注册链接return webDriver.find_element(By.LINK_TEXT, "立即注册").is_displayed()driver = webdriver.Chrome()
driver.get("https://www.baidu.com")driver.find_element(By.LINK_TEXT, "登录").click()
# 每间隔0.5秒 去调用判断函数,条件满足执行下一行代码。
WebDriverWait(driver, 10).until(registerLinkDisplayed)
driver.find_element(By.LINK_TEXT, "立即注册").click()
driver.quit()
使用预定义等待条件函数
from selenium.webdriver.suport import expected_conditions
预定义等待函数
visibility_of_element_located()
判断目标元素是否处于可见状态
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditionsdriver = webdriver.Chrome()
driver.get("https://www.baidu.com")driver.find_element(By.LINK_TEXT, "登录").click()
targetLocator = (By.LINK_TEXT, "立即注册")
WebDriverWait(driver, 10).until(expected_conditions.visibility_of_all_elements_located(targetLocator))driver.find_element(By.LINK_TEXT, "立即注册").click()driver.quit()
预定义所有条件等待函数
类别 | 函数名称 | 参数 | 功能 |
判断元素的可见性 | visibility_of_element_located | locator(目标元素定位) | 判断目标元素是否已显示,如果已显示,则返回该WebElement对象 |
visibility_of | webElement(目标元素) | 判断目标元素是否已显示,如果已显示,则返回该WebElement对象 | |
visibility_of_all_elements_located | locator(目标元素定位) | 判断页面上是否存在一个或多个符合定位的元素,且是否已全部显示,如果是,则返回WebElement集合 | |
visibility_of_any_elements_located | locator(目标元素定位) | 根据定位判断页面上是否存在一个或多个符合定位的元素,元素中是否至少有一个已先睡,如果是,则返回其中已显示的WebElement集合 | |
invisibility_of_element_located | locator(目标元素定位) | 根据定位判断目标元素是否未显示 | |
判断元素的状态、文本、值 | element_to_be_clickable | locator(目标元素定位) | 根据定位判断目标元素是否处于可单击状态 |
element_located_to_be_selected | locator(目标元素定位) | 根据定位判断目标元素是否处于已选中状态 | |
element_to_be_selected | webElement(目标元素) | 判断目标元素是否处于已选中状态 | |
element_located_selection_state_to_be | locator(目标元素定位),is_selected(期望状态) True(选中) False(未选中) | 根据定位判断选中状态是否符合预期 | |
element_selection_state_to_be | webElement(目标元素),is_selected(期望状态) True(选中) False(未选中) | 判断目标元素选中状态是否符合预期 | |
text_to_be_present_in_element | locator(目标元素定位), text(期望包含的文本) | 判断目标元素的文本是否包含期望的文本 | |
text_to_be_present_in_element_value | locator(目标元素定位),text(期望包含的文本) | 判断目标元素的value属性是否已包含期望文本 | |
判断元素是否存在 | presence_of_element_located | locator(目标元素定位) | 根据定位判断页面上是否存在首个符合定位元素,如果有,则返回该WebElement |
presence_of_all_elements_located | locator(目标元素定位) | 根据定位判断页面上是否存在一个或多个符合定位元素,如果有,则返回WebElement集合 | |
staleness_of | webElement(目标元素) | 判断目标元素是否已经从DOM结构上完全消失 | |
判断浏览器窗口、弹框及内嵌网页 | new_window_is_opened | current_handles(当前的窗口句柄集合) | 判断是否有新窗口打开,句柄数量是否会在当前句柄集合的基础上有所基础 |
number_of_windows_and_switch_to_it | locator(目标元素(IFrame/Frame)定位) | 根据定位判断是否可以切换到目标元素,如果可以切换,则会直接切换到指定元素(IFrame/Frame)上 | |
alert_is_present | - | 判断是否已出现浏览器弹窗 | |
判断网页标题或URL | title_contains | title(期望包含的标题) | 判断网页标题是否已包含期望的标题(即是否模糊匹配) |
title_is | title(期望相等的标题) | 判断网页标题是否完全等于期望的标题(即是否完全匹配) | |
url_changes | url(当前URL) | 判断URL是否发生变化,即与当前的URL不相同 | |
url_contains | url(期望包含的URL) | 判断URL是否已包含期望的URL(即是否模糊匹配) | |
url_matches | pattern(格式表达式) | 判断URL是否匹配格式表达式(例如正则表达式) | |
url_to_be | url(期望相等的URL) | 判断URL是否已包含期望的URL(即是否完全匹配) |
3. 其他可选参数设置
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.common import exceptionsdriver = webdriver.Chrome()
driver.get("https://www.baidu.com")WebDriverWait(driver, 30, 2, [exceptions.NoSuchElementException, ZeroDivisionError])\.until(lambda p : 3/0, "很明显, 3是不能除以0的")
1.5 脚本级等待机制
driver.set_script_timeout(最长等待秒数)
为JavaScript设置超时时间
二、对键盘和鼠标进行精准模拟
ActionChains 偏向底层的自动化交互方式,实现鼠标移动、单击、右击、双击、鼠标按下或松开、悬停拖拽、按键按下或松开、按组合键等复杂的操作。
2.1 ActionChains 操作链
from selenium.webdriver.common.action_chains import ActionChains
引入模块使用库
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChainsdriver = webdriver.Chrome()
driver.get("https://www.baidu.com")ActionChains(driver).click(driver.find_element(By.LINK_TEXT, "登录")).perform()
# .click(...) 对操作进行设置,在操作链中预约了一个单击操作,操作对象是登录。
# .perform() 执行操作链中所有操作
driver.quit()
案例:鼠标悬停在设置菜单上,然后再弹出的菜单中选择搜索设置。最后在弹出的设置面板中按顺序进行不显示、仅繁体中文、显示、保存设置操作。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()driver.get("https://www.baidu.com")
# move_to_element会将鼠标指针放置在"设置"链接上,实现悬停效果
# pause(3) 等待秒
ActionChains(driver).move_to_element(driver.find_element(By.XPATH, "//span[text()='设置']"))\.pause(3).perform()
ActionChains(driver).click(driver.find_element(By.LINK_TEXT, "搜索设置"))\.pause(3).perform()
ActionChains(driver).click(driver.find_element(By.ID, "s1_2"))\.click(driver.find_element(By.ID, "SL_2"))\.click(driver.find_element(By.ID, "sh_1"))\.click(driver.find_element(By.LINK_TEXT, "保存设置"))\.pause(3).perform()driver.quit()
2.2 ActionChains 鼠标与键盘操作设置
类别 | 函数名 | 参数 | 功能 |
鼠标按钮操作设置 | click | element(目标元素,可选) | 单击目标元素,如果没有传入目标元素参数,会单击当前鼠标指针位置 |
context_click | element(目标元素,可选) | 右击目标元素,如果没有传入目标元素,会右击鼠标指针位置 | |
double_click | element(目标元素,可选) | 双击目标元素,如果没有传入目标元素,会双击当前鼠标位置 | |
click_and_hold | element(目标元素,可选) | 在目标元素长按鼠标按钮。如果没有传入目标元素,会在当前鼠标位置按下鼠标左键 | |
release | element(目标元素,可选) | 在目标元素松开鼠标按钮。如果没有传入目标元素,则会在当前鼠标指针位置按下鼠标左键 | |
鼠标移动操作设置 | move_to_element | element(目标元素) | 将鼠标指针移动到目标元素中间 |
move_to_element_with_offset | element(目标元素) ,x坐标,y坐标 | 将鼠标指针移动到相对目标元素的坐标(x,y) | |
move_by_offset | x坐标,y坐标 | 将鼠标移动到相对于目标元素的坐标(x,y) | |
鼠标综合性操作 | drag_and_drop | sourceElement(被拖放的元素), targetElement(要拖放到的目的地元素) | 在被拖放元素上按下鼠标按钮,然后移动到目标元素上松开鼠标 |
drag_and_drop_by_offset | sourceElement(被拖放的元素), targetElement(要拖放到目的地元素),x坐标,y坐标 | 在被拖放元素上按下鼠标按钮,然后移动到相距目标元素坐标x,y,并松开鼠标按钮 | |
键盘按键操作设置 | send_keys | keys_to_send(要按的键钮) | 在当前焦点处输入 |
send_keys_to_element | element(目标元素),keys_to_send(要按的键钮) | 对目标元素按指定键 | |
key_down | key(键),element(目标元素,可选) | 对目标元素按下指定键,如果没有传入目标元素,会在当前焦点位置按下指定键 | |
key_up | key(键),element(目标元素,可选) | 对目标元素松开指定键,如果没有传入目标元素,则会在当前焦点位置松开指定键 | |
等待设置 | pause | seconds(等待秒) | 在指定时间内暂停所有后续操作 |
reset_actions()
清空操作链中全部设置
2.3 模拟复杂键盘操作
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://www.baidu.com")
baiduSearchInput = driver.find_element(By.ID, "kw")baiduSearchInput.send_keys("python")
time.sleep(3)baiduSearchInput.send_keys(Keys.CONTROL, "a")
time.sleep(3)
baiduSearchInput.send_keys(Keys.CONTROL, "x")
time.sleep(3)
baiduSearchInput.send_keys(Keys.CONTROL, "v")
time.sleep(3)
baiduSearchInput.send_keys(Keys.BACKSPACE)
time.sleep(3)
baiduSearchInput.send_keys(Keys.ENTER)
三、操作浏览器 Cookie
get_cookies()
获取所有cookie对象集合
get_cookie(cookie名称)
根据名称获取cookie
from selenium import webdriverdriver = webdriver.Chrome()
driver.get("https://www.baidu.com")# 获取全部cookies
pageCookies = driver.get_cookies()
for cookie in pageCookies:print(cookie)# 根据名称获取cookie
print(driver.get_cookie("BD_HOME"))
3.1 新增和删除cookie
driver.add_cookie(cookie对象)
新增cookie
from selenium import webdriverdriver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.add_cookie({'name': 'MockCookie', 'value': '小那同学'})
可以在浏览器F12调试工具中 Application查看当前添加的cookie
delete_all_cookies()
删除全部 cookie
delete_cookie(cookie名称)
按名称删除指定 cookie
from selenium import webdriverdriver = webdriver.Chrome()
driver.get("https://www.baidu.com")driver.delete_all_cookies()
3.2 对浏览窗口或元素截图
save_screenshot(截图文件保存路径)
对浏览器截图
from selenium import webdriverdriver = webdriver.Chrome()
driver.get("https://www.baidu.com")driver.save_screenshot("保存路径")
3.3 对元素截图
screenshot(截图文件路径)
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.get("https://www.baidu.com")driver.find_element(By.ID, "su").screenshot("图片地址")
3.4 Selenium操作附加自定义事件
from selenium.webdriver.support.event_firing_webdriver import EventFiringWebDriver
操作添加事件
EventFiringWebDriver(WebDriver实例,AbstractEventListener实例)
AbstractEventListener 抽象类,使用EventFiringWebDriver 需要设定自定义时间监听器类。
类需要继承 AbstractEventListener类。
类别 | 函数名 | 参数 | 描述 |
浏览器级别 | before_navigate_to(url, driver) | url:跳转的目标URL driver:当前WebDriver实例 | 导航前事件,定义页面发生跳转前需要执行的代码 |
after_navigate_to(url, driver) | url: 跳转的目标URL driver:当前WebDriver实例 | 导航后事件,定义页面发生跳转后需要执行的代码 | |
before_navigate_back(driver) | driver:当前WebDriver实例 | 浏览器后退前事件,定义浏览器在执行后退后需要执行的代码 | |
after_navigate_forward(driver) | driver: 当前WebDriver实例 | 浏览器前进事件,定义浏览器在执行前进操作后需要执行的代码 | |
after_navigate_forward(driver) | driver: 当前WebDriver实例 | 浏览器前进后事件,定义浏览器在执行关闭操作前需要执行的代码 | |
before_close(driver) | driver: 当前WebDriver实例 | 浏览器关闭后事件,定义浏览器在执行关闭操作后需要执行的代码 | |
元素级 | before_find(by, value, driver) | by: 当前使用的查找条件类型 value:当前使用的查找值 driver: 当前WebDriver实例 | 查找元素前事件,定义Selenium在查找元素前需要执行的代码 |
after_find(by, value, driver) | by: 当前使用的查找条件类型 value:当前使用的查找值 driver: 当前WebDriver实例 | 找到元素后事件,定义Selenium在找到元素后需要执行的代码 | |
before_click(element, driver) | element: 要操作的元素 driver: 当前WebDriver实例 | 单击元素前事件,定义Selenium在单击元素前需要执行的代码 | |
after_click(element, driver) | element: 要操作的元素 driver:当前WebDriver实例 | 单击元素后事件,定义Selenium在单击元素后需要执行的代码 | |
before_change_value_of(element, driver) | element: 要操作的元素 driver:当前WebDriver实例 | 元素值变更前事件,定义Selenium更改元素需要执行的代码 | |
after_change_value_of(element, driver) | element: 要操作的元素 driver: 当前WebDriver实例 | 元素值变更后事件,定义Selenium更改元素值后需要执行的代码 | |
脚本级 | before_execute_script(script, driver) | script: 要执行的脚本 driver: 当前WebDriver实例 | 脚本执行前事件,定义脚本执行前需要执行的脚本 |
after_execute_script(script, driver) | script:要执行的脚本 driver:当前WebDriver实例 | 脚本执行后事件,定义脚本执行后需要执行的代码 | |
异常或退出 | on_exception(exception, driver) | exception: 抛出的异常 driver:当前WebDriver实例 | 异常事件,定义在Selenium操作发生异常时需要执行的代码 |
before_quit(driver) | driver:当前WebDriver实例 | WebDriver退出会话前事件,定义在退出会话前需要执行的代码 | |
after_quit(driver) | driver: 当前webDriver实例 | WebDriver退出会话后事件,定义在退出会话后需要执行的代码 |
四、浏览器启动参数设置
4.1 WebDriver 实例化参数
driver = webdriver.Chrome()
默认实例化没有参数
4.2 浏览器设置参数
options
启动选项,用于设置浏览器
desired_capabilities
类似于options, 在远程运行系统补丁或浏览器不定的情况下使用 desired_capabilities,推荐使用 options参数
chrome_options
等同于options参数,已过时不推荐使用
4.3 浏览器驱动程序设置参数
executable_path
浏览器驱动程序路径,没有指定,默认使用环境变量中的路径。
service_args
浏览器驱动程序参数。浏览器不同,参数也可能不相同。
port
驱动程序启用端口号,默认使用任意闲置端口号。
service_log_path
驱动程序存放日志文件地址。
4.4 selenium与浏览器驱动程序连接参数
keep-alive
表示与ChromeDriver连接时,是否带上HTTP请求头Connecton,默认值为True。
4.5 JavaScript 进行深度操作
虽然Selenium有丰富的操作,但是有一些场景可能需要使用JavaScript进行扩展。
webdriver.execute_script("js脚本", 自定义参数集(可选))
执行同步脚本
webdriver.execute_async_script("js脚本", 自定义参数集(可选))
执行异步脚本
不建议使用Js去执行selenium已经存在的内容。
相关文章:
自己总结:selenium高阶知识
全篇大概10000字(含代码),建议阅读时间30min 一、等待机制 如果有一些内容是通过Ajax加载的内容,那就需要等待内容加载完毕才能进行下一步操作。 为了避免人为操作等待,会遇到的问题, selenium将等待转换…...
无线遥控红外通信
无线遥控红外通信 红外发射装置一般是指红外遥控器由 键盘电路 ,红外编码电路 电源电路 和红外发射 电路组成 一般的红外线波长为940nm左右,外形与普通发光二极管相同 红外遥控为了提高抗干扰性能和降低电源消耗,红外遥控器常用载波的方式传送…...
第一个C++程序--(蓝桥杯备考版)
第一个C程序 基础程序 #include <iostream>//头⽂件 using namespace std;//使⽤std的名字空间 int main()//main函数 {cout << "hello world!" << endl; //输出:在屏幕打印"hello world!" return 0;}main函数 main 函数是…...
Rust包管理和构建工具
Cargo 是 Rust 语言的包管理和构建工具。它提供了一套完整的工具链,用于管理 Rust 项目的依赖关系、编译代码、运行测试和生成文档。Cargo 极大地简化了 Rust 项目的开发和部署过程,使得开发者可以专注于编写代码,而不是处理构建系统的复杂性…...
STM32输入捕获详解
目录 一、引言 二、输入捕获原理 三、寄存器介绍 四、配置步骤 1.开启时钟 2.GPIO 初始化 3.初始化定时器 4.配置输入捕获模式 5.使能捕获和更新中断 6.设置中断分组并编写中断服务函数 7.使能定时器 五、程序示例 六、总结 一、引言 在嵌入式系统开发中࿰…...
利用高德地图API,如何在PHP与vue3中实现地图缩放功能
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
Selenium WebDriver:自动化网页交互的利器
Selenium WebDriver:自动化网页交互的利器 在当今快速发展的Web开发领域,自动化测试已经成为确保应用程序质量和用户体验的重要手段。Selenium WebDriver,作为Selenium工具包中的核心组件,正是这一领域的佼佼者。本文将详细介绍S…...
uniapp -- 实现页面滚动触底加载数据
效果 首选,是在pages.json配置开启下拉刷新 {"path": "pages/my/document/officialDocument","style": {"navigationStyle":</...
用ChatGPT-o1进行论文内容润色效果怎么样?
目录 1.引导问题发现 2.角色设定 3.整理常问修改 4.提供样例 5.小细节 小编在这篇文章中分享如何充分利用ChatGPT-o1-preview来提升论文润色的技巧。小编将持续跟进最新资源和最新的调研尝试结果,为宝子们补充更多实用的写作技巧。这些技巧将有助于您更有效地利…...
6 C/C++输⼊输出(下)(未完续)
1. OJ(online judge)题⽬输⼊情况汇总 在竞赛的 OJ 题⽬中,⼀般关于输⼊场景总结为下⾯四类: 接下来,我们就结合题⽬,给⼤家分别介绍。 1.1 单组测试⽤例 练习1 B2009 计算 (ab)/c 的值 - 洛谷 | 计算机科…...
题海拾贝:力扣 20、有效的括号
Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路! 我的博客:<但凡.-CSDN博客 我的专栏:《编程之路》、《题海拾贝》、《数据结构与算法之美》 欢迎点赞、关注! 1、题目 2、题解 这…...
视频推拉流EasyDSS无人机直播技术巡查焚烧、烟火情况
焚烧作为一种常见的废弃物处理方式,往往会对环境造成严重污染。因此,减少焚烧、推广绿色能源和循环经济成为重要措施。通过加强森林防灭火队伍能力建设与长效机制建立,各地努力减少因焚烧引发的森林火灾,保护生态环境。 巡察烟火…...
基于Hermite多项式的三维反时间波的生成
原创:daode3056(daode1212) 反时间波,也称为时间反演波,是一种在特定条件下能够实现波的聚焦和传播的技术。反时间波的产生基于时间反演技术,其原理和方法通常有: 1. [时间反演信号处理原理]: 时间反演技术并不是指时间…...
数据结构与算法复习AVL树插入过程
环境 $ cat /proc/version Linux version 6.8.0-45-generic (builddlcy02-amd64-115) (x86_64-linux-gnu-gcc-13 (Ubuntu 13.2.0-23ubuntu4) 13.2.0, GNU ld (GNU Binutils for Ubuntu) 2.42) #45-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 30 12:02:04 UTC 2024 #include <std…...
MetaGPT源码 (Memory 类)
目录 MetaGPT源码:Memory 类例子 MetaGPT源码:Memory 类 这段代码定义了一个名为 Memory 的类,用于存储和管理消息(Message)对象。Memory 提供了多种操作消息的功能,包括添加单条或批量消息、按角色或内容筛选消息、删除最新消息…...
day1数据结构,关键字,内存空间存储与动态分区,释放
小练习 在堆区空间连续申请5个int类型大小空间,用来存放从终端输入的5个学生成绩,然后显示5个学生成绩,再将学生成绩升序排序,排序后,再次显示学生成绩。显示和排序分别用函数完成(两种排序方法࿰…...
C# 用封装dll 调用c++ dll 使用winapi
这里用c net 封装winapi函数 pch.h // pch.h: 这是预编译标头文件。 // 下方列出的文件仅编译一次,提高了将来生成的生成性能。 // 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。 // 但是,如果此处列出的文件中的任何一个…...
vue2 如何设置i18n的默认语言为当前浏览器的语言
做到i18n这里设置默认语言的时候遇到了一些小问题,所以做个记录: 原始代码lang/index // index.js import Vue from vue import VueI18n from vue-i18n import Cookies from js-cookie // import elementEnLocale from element-ui/lib/locale/lang/en // element-…...
QT数据库SQLite:QsqlTableModel使用总结
数据库连接、数据模型与界面组件所涉及的类之间的关系如下所示: 数据库类 QSqlDatabase 类用于建立与数据库的连接,QSqlDatabase 对象就表示这种连接。QSqlDatabase 类的功能主要分为三大部分: 1、创建数据库连接,即创建 QSqlDat…...
服务器零配件
阵列卡 H3C电池 RAId 卡 内存条位置 HBA卡 MOC卡...
MySQL 学习 之 批量插入数据性能问题
文章目录 现象优化 现象 在使用 kettle 同步大数据的数据到我们的 MySQL 数据库中时发现,数据量大时插入效率很慢,大约在 2000/s 优化 在 MySQL 驱动连接中添加 rewriteBatchedStatementstrue 参数,减少 网络 IO DB IO 耗时 默认关闭指定…...
会话管理和身份验证和授权
Cookie、Session、Token Cookie 简介:[Cookie]是一种小型文本文件,由服务器发送到用户的浏览器并保存在用户的计算机上。其主要作用是识别用户身份、跟踪用户活动、保存用户设置等。Cookie通常由名称、值、域名、路径、过期时间等字段组成,并…...
RK3588 rknpu2/rkllm/rockit/mpp/rga 等源码验证
RK3588 简介 本项目基于rk3588硬件平台,将嵌入式、流媒体、AI等相关的技术验证源码地址 源码说明 buildroot 为buildroot使用方法dk_doc 为rk的文档mpp 在mpp例子上增加推流rga 为rk3588的硬件加速模块,可快速处理视频,提供的API接口与op…...
【CSS in Depth 2 精译_075】12.2 Web 字体简介 + 12.3 谷歌字体的用法
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第四部分 视觉增强技术 ✔️【第 12 章 CSS 排版与间距】 ✔️ 12.1 间距设置 12.1.1 使用 em 还是 px12.1.2 对行高的深入思考12.1.3 行内元素的间距设置 12.2 Web 字体 ✔️12.3 谷歌字体 ✔️12.…...
【数字花园】个人知识库网站搭建:①netlify免费搭建数字花园
目录 [[数字花园]]的构建原理包括三个步骤:五个部署方案教程相关教程使用的平台 步骤信息管理 这里记录的自己搭建数字花园(在线个人知识库)的经历,首先尝试的是网上普遍使用的方法,也就是本篇文章介绍的。 后面会继续…...
访问者模式的理解和实践
在软件开发过程中,设计模式为我们提供了解决常见问题的最佳实践。访问者模式(Visitor Pattern)是行为设计模式之一,它将数据操作与数据结构分离,使得在不修改数据结构的前提下,能够定义作用于这些元素的新的…...
SpringBoot中Selenium详解
文章目录 SpringBoot中Selenium详解一、引言二、集成Selenium1、环境准备1.1、添加依赖 2、编写测试代码2.1、测试主类2.2、页面对象2.3、搜索组件 三、使用示例四、总结 SpringBoot中Selenium详解 一、引言 在现代软件开发中,自动化测试是提高软件质量、减少重复…...
Android 系统应用重名install安装失败分析解决
Android 系统应用重名install安装失败分析解决 文章目录 Android 系统应用重名install安装失败分析解决一、前言1、Android Persistent apps 简单介绍 二、系统 persistent 应用直接安装需求分析解决1、系统应用安装报错返回的信息2、分析解决 三、其他1、persistent系统应用in…...
scala中如何解决乘机排名相关的问题
任务目标: 1.计算每个同学的总分和平均分 2.按总分排名,取前三名 3.按单科排名,取前三名 好的,我们可以用Scala来完成这个任务。下面是一个简单的示例代码,它将演示如何实现这些功能: // 假设我们有一个…...
常用的注解
RequestMapping 用于映射请求路径 可以添加在类或方法上 请求类型 请求类型包括GET、POST、PUT、DELETE等 默认支持GET和POST两种方式 简写:GetMapping、PostMapping、PutMapping、DeleteMapping PostMapping("/buy") 等价 RequestMapping("/buy&quo…...
移动应用渗透测试:确保通过测试的关键安全策略
无论您是为了维持合规性、保护敏感用户数据,还是维护品牌声誉,顺利通过渗透测试(Pen Test)都是至关重要的。为了帮助您轻松应对这一过程,有几个积极的安全措施可以帮助确保您的应用程序更加安全。 通过采用高级安全机…...
【Canvas与光阑】立方体六彩光阑
【成图】 120*120的png图标 大小图: 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>立方体 六彩光阑 Draft2</…...
【ArcGIS微课1000例】0135:自动生成标识码(长度不变,前面自动加0)
文章目录 一、加载实验数据二、BSM计算方法一、加载实验数据 加载专栏《ArcGIS微课实验1000例(附数据)》配套数据中0135.rar中的建筑物数据,如下图所示: 打开属性表,BSM为数据库中要求的字段:以TD_T 1066-2021《不动产登记数据库标准》为例: 计算出来的BSM如下图: 二、B…...
nginx文件上传下载控制
上传大小控制 client_max_body_size 设置最大客户端请求体大小 默认大小1M,可以使用在http, server, location块。 根据不同的请求路径设置不同的大小控制 server {listen 9001;client_max_body_size 2M;location / {root D:\\server\\nginx-1.22.0\\html\\9001;}locat…...
LabelImg使用教程
(yolov5scondaPython3123) D:\PyCharm20240724\20240724PyCharmProject>conda.bat deactivate D:\PyCharm20240724\20240724PyCharmProject>conda activate labelimg_env (labelimg_env) D:\PyCharm20240724\20240724PyCharmProject> labelimg 创建快捷键方式...
运维新手入门——KVM(Beginner‘s Guide to Operations and Maintenance - kvm)
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…...
Android 10.0 WiFi连接默认设置静态IP地址功能实现
1.前言 在10.0的系统rom定制化开发中,在定制化某些功能开发中,在wifi模块中,有产品需要要求设置wifi静态ip功能,而系统中wifi连接 后ip是动态的,每次开机后 连接wifi的ip就是不固定的,所以产品需要采用固定ip,就需要实现静态ip功能 2.WiFi连接默认设置静态IP地址功能实…...
ceph /etc/ceph-csi-config/config.json: no such file or directory
环境 rook-ceph 部署的 ceph。 问题 kubectl describe pod dragonfly-redis-master-0Warning FailedMount 7m59s (x20 over 46m) kubelet MountVolume.MountDevice failed for volume "pvc-c63e159a-c940-4001-bf0d-e6141634cc55" : rpc error: cod…...
windows C#-限制可访问性
属性或索引器的 get 和 set 部分称为访问器。 默认情况下,这些访问器具有与其所属属性或索引器相同的可见性或访问级别。不过,有时限制对其中某个访问器的访问是有益的。 通常,限制 set 访问器的可访问性,同时保持 get 访问器可公…...
Java-22 深入浅出 MyBatis - 手写ORM框架3 手写SqlSession、Executor 工作原理
点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatisÿ…...
【数据分享】1901-2023年我国省市县三级逐年最低气温数据(Shp/Excel格式)
之前我们分享过1901-2023年1km分辨率逐月最低气温栅格数据和Excel和Shp格式的省市县三级逐月最低气温数据,原始的逐月最低气温栅格数据来源于彭守璋学者在国家青藏高原科学数据中心平台上分享的数据!基于逐月栅格数据我们采用求年平均值的方法得到逐年最…...
AlphaPose、yolov8Pose、RTMPose进行对比
一、Alphapose 参考: https://blog.csdn.net/m0_45850873/article/details/123939849...
【Linux】文件系统
文章目录 Group中的组成部分inode tableinode bitmapdata blocksblock bitmapgroup descriptor tablesuper block 文件系统关于inode和blocksinode和block是如何映射的?12个直接映射一级间接索引二级间接索引三级间接索引 为什么访问文件的是inode,但是我…...
希迪智驾持续亏损8.2亿:毛利率下滑,冲刺“自动驾驶矿卡第一股”
《港湾商业观察》黄懿 近日,希迪智驾(湖南)股份有限公司(下称“希迪智驾”)向港交所主板递交上市申请,联席保荐人为中金公司、中信建投国际、中国平安资本(香港)。 资料显示&#…...
Python实现中国象棋
探索中国象棋 Python 代码实现:从规则逻辑到游戏呈现 中国象棋,这款源远流长的棋类游戏,承载着深厚的文化底蕴与策略智慧。如今,借助 Python 与 Pygame 库,我们能够在数字世界中复刻其魅力,深入探究代码背后…...
C++小碗菜之五:GDB调试工具
“程序员不是编写代码的人,而是调试错误的人。” – 约翰本尼斯(John Bennet) 目录 前言 在虚拟机中安装 GDB GDB调试的实战演练 创建示例代码 例子: 使用 GDB 调试 编译代码 启动 GDB 设置断点 运行程序 打印变量值 …...
机器学习干货笔记分享:朴素贝叶斯算法
朴素贝叶斯分类是一种十分简单的分类算法,即对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。 以判定外国友人为例做一个形象的比喻。 若我们走在街上看到一个黑皮肤的外…...
bug:uniapp运行到微信开发者工具 白屏 页面空白
1、没有报错信息 2、预览和真机调试都能正常显示,说明代码没错 3、微信开发者工具版本已经是win7能装的最高版本了,1.05版 链接 不打算回滚旧版本 4、解决:最后改调试基础库为2.25.4解决了,使用更高版本的都会报错,所…...
VBA API 概述 | 宏编程
注:本文为 “VBA API 概述 | 宏编程 | 执行速度慢” 相关文章合辑。 VBA API 详解 Office 二次开发于 2020-12-17 22:27:10 发布 Office 版本变动 在 Office 2010 之前,微软仅提供 32-bit 版本的 Office。而自 Office 2010 起,出现了 32-b…...
《九重紫》逐集分析鉴赏—序言、概览、框架分析
主标题:《九重紫》一起追剧吧副标题:《九重紫》逐集分析鉴赏—序言、概览、框架分析《永夜星河》后,以为要浅尝剧荒,一部《九重紫》突出重围。 看了宣传片感觉不是很差,看了部分剪辑感觉还可以,看了一两集感…...