自己总结: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已经存在的内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/62630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上海亚商投顾:创业板指震荡调整 机器人概念股再度爆发

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日冲高回落,深成指、创业板指盘中跌超1%,尾盘跌幅有所收窄。机器人概念股逆势爆…

(Linux)CentOS7离线安装MinIO(超详细)

目录 前言1. 下载2. 安装VMware3. 安装CentOS4. 离线安装MinIO4.1. ssh工具连接CentOS4.2. 上传MinIO离线包4.2.1 创建data目录4.2.2 上传RPM包到data目录4.2.3 安装RPM包4.2.4 创建MinIO数据目录4.2.5 配置 MinIO 服务4.2.6 启动 MinIO4.2.7 开放端口 4.2.8 访问MinIO 创作不易…

【JavaWeb后端学习笔记】Maven项目管理

Maven 1、分模块设计2、Maven继承2.1 继承关系2.2 版本锁定 3、Maven聚合4、聚合与继承的关系 1、分模块设计 如果一个项目中含有大量的功能模块。可以考虑将这些功能分模块设计,逐一进行开发。例如将公共类可以定义在一个项目中,将通用工具类也放在一个…

HarmonyOS-高级(四)

文章目录 应用开发安全应用DFX能力介绍HiLog使用指导HiAppEvent 🏡作者主页:点击! 🤖HarmonyOS专栏:点击! ⏰️创作时间:2024年12月11日11点18分 应用开发安全 应用隐私保护 隐私声明弹窗的作…

网络安全法-网络运行安全

第三章 网络运行安全 第一节 一般规定 第二十一条 国家实行网络安全等级保护制度。网络运营者应当按照网络安全等级保护制度的要求,履行下列安全保护义务,保障网络免受干扰、破坏或者未经授权的访问,防止网络数据泄露或者被窃取、篡改&…

论文阅读:Statistical Comparisons of Classifiers over Multiple Data Sets

论文地址:Statistical Comparisons of Classifiers over Multiple Data Sets (acm.org) 前面在机器学习之Friedman检验-CSDN博客 中提到了Friedman检验,这里将对这个方法的论文进行详细的阅读,以了解其原理。 摘要 尽管用于在单个数据集上比…

【Unity技巧】Unity项目中哪些文件不用管理(.gitignore)

Unity的项目编译后一般都比较大,动辙几个G。这里面一般我们只需要把Assets, Packages, ProjectSettings这三个文件夹进行源代码管理就可以,其他文件就可以通过下面的.gitignore来忽略掉。 .gitignore文件的内容如下: # 将此 .gitignore 文件…

练9:进制转换

欢迎大家订阅【蓝桥杯Python每日一练】 专栏,开启你的 Python数据结构与算法 学习之旅! 文章目录 1 进制转换2 例题分析 1 进制转换 ①任意制转为十进制 【示例】 ②十进制转为任意制 【法一】 【法二】 2 例题分析 题目地址:https:/…

C语言:指针详解续

一、字符指针变量 我们知道有种指针类型为字符指针(char*)。 #include <stdio.h> int main() {char ch w;char* pch &ch;printf("%c\n", *pch);return 0; } 其实它还有一种使用方式。 #include <stdio.h> int main() {char* pstr "hello…

HarmonyOS-高级(一)

文章目录 一次开发、多端部署自由流转 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;HarmonyOS专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年12月09日12点19分 一次开发、多端部署 布局能力 自适应布局 拉伸能力均分能力占比能力缩放…

[DEBUG] pytorch 加速安装兼容cuda12.6版本(Torch CUDA is not available )

如何使用镜像源快速安装兼容 CUDA 12.6 的 PyTorch 在使用 PyTorch 时&#xff0c;有时会遇到 CUDA 版本不兼容的问题。对于 CUDA 12.6&#xff0c;PyTorch 目前尚未直接支持&#xff0c;但可以通过安装 cu118 版本来兼容。由于 PyTorch 官网下载速度较慢&#xff0c;我们可以…

云计算IaaS-PaaS-SaaS三种服务模式转至元数据结尾

在当今数字化时代&#xff0c;云计算已经成为推动企业创新与发展的核心力量。而云计算的模型主要有三种&#xff1a;IAAS、PAAS 和 SAAS&#xff0c;它们各自在云计算的庞大体系中扮演着独特且关键的角色&#xff0c;恰似一座大厦的不同楼层&#xff0c;共同构建起强大而灵活的…

【Excel学习记录】02-单元格格式设置

1.单元格格式工具美化表格 单元格格式位置 选中单元格&#xff0c;右键→设置单元格格式 合并居中 跨越合并 字体类型、大小、颜色、填充底纹、边框 斜线 软回车&#xff1a;alt enter 格式刷 2.单元格数字格式 格式不影响数值&#xff0c;只是展示形式 日期本质也是数…

【嵌入式系统】第4章 嵌入式最小系统,供电电路,时钟电路,复位电路,程序下载电路

关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…

期权懂|交易个股期权需要注意哪些风险?

期权小懂每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 交易个股期权需要注意哪些风险&#xff1f; 一、交易个股期权需要注意合约到期风险&#xff1a; 需关注到期日&#xff0c;及时平仓或行权&#xff0c;避免合约作废。二、交易个…

MVC配置文件配置及位置

配置文件位置 默认位置 WEB-INF目录下&#xff1a;-servlet.xml 指定位置 在web.xml中配置 DispatcherServlet中的contextConfigLocation属性可以指定配置文件位置 确保配置文件存在于类路径&#xff08;Resources&#xff09;下 web.xml <?xml version"1.0" …

可视化逻辑表达式编辑器

优质博文&#xff1a;IT-BLOG-CN 一、QueryBuilder介绍 QueryBuilder 是一个用于创建查询和过滤器的 UI 组件。 QueryBuilder的特点 1、支持的输入属性丰富&#xff0c;常见的 字符串&#xff0c;整数&#xff0c;浮点数&#xff0c;布尔类型&#xff0c;日期类型&#xff0…

若依将数据库更改为SQLite

文章目录 1. 添加依赖项2. 更新配置文件 application-druid.yml2.1. 配置数据源2.2. 配置连接验证 3. 更新 MybatisPlusConfig4. 解决 mapper 中使用 sysdate() 的问题4.1. 修改 BaseEntity4.2. 修改 Mapper 5. 更新 YML 配置 正文开始&#xff1a; 前提条件&#xff1a;在您的…

OCP开闭原则

什么是OCP&#xff1f; OCP是软件七大开发原则当中最基本的一个原则&#xff1a;开闭原则 对什么开&#xff1f;对扩展开放。 对什么闭&#xff1f;对修改关闭。 OCP原则是最核心的&#xff0c;最基本的&#xff0c;其他的六个原则都是为这个原则服务的。 OCP开闭原则的核心是…

Linux下mysql环境的搭建

1.mysql的下载 去MySQL官网下载mysql的linux压缩包 MySQL :: Download MySQL Community Server 如果下载慢请到网盘中自行下载 通过网盘分享的文件&#xff1a;mysql-8.0.40-1.el7.x86_64.rpm-bundle.tar 链接: https://pan.baidu.com/s/1vUJ-VuTwer1nLPT-haQCqw?pwd6342 提…