当前位置: 首页 > news >正文

【Selenium学习】Selenium 中特殊元素操作

1.鼠标定位操作

鼠标悬停,即当光标与其名称表示的元素重叠时触发的事件,在 Selenium 中将键盘鼠标操

作封装在 Action Chains 类中。Action Chains 类的主要应用场景为单击鼠标、双击鼠标、鼠标拖

曳等。部分常用的方法使用分类如下:

• click(on_element=None),模拟鼠标单击操作。

• click_and_hold(on_element=None),模拟鼠标单击并且按住不放。

• double_click(on_element=None),模拟鼠标双击。

• context_click(on_element=None),模拟鼠标右击操作。

• drag_and_drop(source,target),模拟鼠标拖曳。

• drag_and_drop(source,xoffset,yoffset),模拟将目标拖曳到目标位置。

• key_down(value,element=None),模拟按住某个键,实现快捷键操作。

• key_up(value,element=None),模拟松开某个键,一般和 key_down 操作一起使用。

• move_to_element(to_element),模拟将鼠标移到指定的某个页面元素。

• move_to_element_with_offset(to_element,xoffset,yoffset),移动鼠标至指定的坐标。

• perform(),将之前一系列的 ActionChains 执行。

• release(on_element=None),释放按下的鼠标。

接下来,列举鼠标右击操作和鼠标双击操作两个实例。

(1)鼠标右击操作,实现右击/双击百度首页“新闻”超链接。代码如下:

# _*_ coding:utf-8 _*_
"""
name:zhangxingzai
date:2023/2/16
form:《Selenium 3+Python 3自动化测试项目实战》
"""from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChainsdriver = webdriver.Firefox()
# 打开百度
driver.get('https://www.baidu.com/')
# 定位超链接‘新闻’
element = driver.find_element(By.LINK_TEXT, '新闻')
# 实现在新闻超链接上右击
ActionChains(driver).context_click(element).perform()
# 实现用鼠标实现双击‘新闻’
ActionChains(driver).double_click(element).perform()

(2)以百度首页设置为例,使用“move_to_element”的方法,鼠标即可悬停于元素设置:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChainsdriver = webdriver.Firefox()
# 打开百度
driver.get('https://www.baidu.com/')
# 通过id定位超链接‘设置’
setting = driver.find_element(By.ID, 's-usersetting-top')
# 使用方法 move_to_element 模拟将鼠标悬停在超链接“设置”处
ActionChains(driver).move_to_element(setting).perform()
# 定位超链接‘高级设置’,并实现单击操作
driver.find_element(By.CLASS_NAME, 'set').click()

实现效果如下:

2.Select 操作

Web 页面中经常会遇到下拉框选项,Select 模块提供了对标准 Select 下拉框的多种操作方

法。打开百度,单击“设置→高级设置”,会出现一个 Select 下拉框,如下图所示:

Select 元素的 HTML 代码如下图所示。

接下来介绍 3 种选择 Select 元素的值的方法。

Select 类:用于定位<select>标签。

select_by_value():通过 value 值定位下拉选项。

select_by_visible_text():通过 text 值定位下拉选项。

select_by_index():根据下拉选项的索引进行选择。第一个选项为 0,第二个选项为 1。

通过 WebDriver 代码操作下拉框,代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
from selenium.webdriver.support.select import Selectdriver = webdriver.Firefox()
# 打开百度
driver.get('https://www.baidu.com/')
# 定位超链接‘设置’
setting = driver.find_element(By.ID, 's-usersetting-top')
# 使用方法 move_to_element 模拟将鼠标悬停在超链接“设置”处
ActionChains(driver).move_to_element(setting).perform()
# 通过xpath定位超链接‘高级’,并实现单击操作
driver.find_element(By.XPATH, "//div/a[@target='_blank']/span").click()
# 通过class定位选择‘全部时间’
search_time = driver.find_element(By.CLASS_NAME, 'c-select-selection')
# 通过 value 值定位下拉选项
Select(search_time).select_by_value('stf=1676475129.442,1676561529.442|stftype=1')
# 通过 text 值定位下拉选项
Select(search_time).select_by_visible_text('最近一周')

3.键盘操作

前面介绍过,send_keys()方法可以用来模拟键盘输入,我们还可以用它来输入键盘上

的按键,甚至是组合键,如 Ctrl+a、Ctrl+c 等。

经过总结,以下为自动化测试中常用的键盘事件。

• Keys.BACK_SPACE:删除键。

• Keys.SPACE:空格键。

• Keys.TAB:Tab 键。

• Keys.ESCAPE:回退键。

• Keys.ENTER:回车键。

• Keys.CONTROL,”a”:组合键 Ctrl + A。

• Keys.CONTROL,”x”:组合键 Ctrl + X。

• Keys.CONTROL,”v”:组合键 Ctrl + V。

• Keys.CONTROL,”c”:组合键 Ctrl + C。

• Keys.F1:F1 键。

• Keys.F12:F12 键。

用法举例,如下方代码展示:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from time import sleepdriver = webdriver.Firefox()
# 打开百度
driver.get('https://www.baidu.com/')
# 在输入框输入内容
driver.find_element(By.ID, "kw").send_keys("selenium")
# 删除多输入的一个 m
driver.find_element(By.ID, "kw").send_keys(Keys.BACK_SPACE)
sleep(1)
# 输入空格键+“教程”
driver.find_element(By.ID, "kw").send_keys(Keys.SPACE)
driver.find_element(By.ID, "kw").send_keys("教程")
sleep(1)
# 输入组合键 Ctrl+a,全选输入框内容
driver.find_element(By.ID, "kw").send_keys(Keys.CONTROL, 'a')
sleep(1)
# 输入组合键 Ctrl+x,剪切输入框内容
driver.find_element(By.ID, "kw").send_keys(Keys.CONTROL, 'x')
sleep(1)
# 输入组合键 Ctrl+v,粘贴内容到输入框
driver.find_element(By.ID, "kw").send_keys(Keys.CONTROL, 'v')
sleep(1)
# 用回车键代替单击操作
driver.find_element(By.ID, "su").send_keys(Keys.ENTER)

4.利用 JavaScript 操作页面元素

WebDiver 对部分浏览器上控件并不是直接支持的,如浏览器右侧滚动条、副文本等,而是

通常借助 JavaScript 间接操作。WebDriver 提供了 execute_script()和 execute_async_scrip()两种方

法来执行 JavaScript 代码,其区别如下:

(1)execute_script 为同步执行且执行时间较短。WebDriver 会等待同步执行的结果,

然后执行后续代码。

(2)execute_async_script 为异步执行且执行时间较长。WebDriver 不会等待异步执行

代码的结果,而是直接执行后续的代码。

用于调整浏览器滚动条位置的 JavaScript 代码如下。

<!-- window.scrollTo(左边距,上边距); -->
window.scrollTo(0,450);

window.scrollTo()方法用于设置浏览器窗口滚动条的水平位置和垂直位置。第一个参数

表示水平的左边距,第二个参数表示垂直的上边距,代码如下。

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleepdriver = webdriver.Firefox()
# 打开百度
driver.get('https://www.baidu.com/')
# 设置浏览器窗口大小
driver.set_window_size(800, 700)
driver.find_element(By.ID, "kw").send_keys("selenium")
driver.find_element(By.ID, "su").click()
sleep(3)
# 通过 JavaScript 设置浏览器窗口的滚动条位置
js = "window.scrollTo(100,300)"
driver.execute_script(js)

执行结果如下图所示:

5.获得验证信息

在进行 Web 自动化测试中,用得最多的几种验证信息是 title、current_url 和 text。

  • title:用于获取当前页面的标题。

  • current_url:用于获取当前页面的 URL。

  • text:用于获取当前页面的文本信息。

下面仍以百度搜索为例,对比搜索前后的信息。

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleepdriver = webdriver.Firefox()
driver.get('https://www.baidu.com/')print('Before search================')
# 打印当前页面 title
title = driver.title
print("title:" + title)# 打印当前页面 URL
now_url = driver.current_url
print("URL:" + now_url)driver.find_element(By.ID, "kw").send_keys("selenium")
driver.find_element(By.ID, "su").click()
sleep(3)print('After search================')
# 再次打印当前页面 title
title = driver.title
print("title:" + title)
# 再次打印当前页面 URL
now_url = driver.current_url
print("URL:" + now_url)# 获取搜索结果条数
num = driver.find_element(By.XPATH, "//span[@class='hint_PIwZX c_font_2AD7M']").text
print("result:"+num)

运行结果如下:

通过上面的打印信息可以看出搜索前后的差异,这些差异信息可以拿来作为自动化测试的断言点。

6.设置元素等待

WebDriver 提供了两种类型的元素等待:显式等待和隐式等待。

(1)显示等待

显式等待是 WebDriver 等待某个条件成立则继续执行,否则在达到最大时长时抛出超

时异常(TimeoutException)。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECdriver = webdriver.Firefox()
driver.get("https://www.baidu.com")element = WebDriverWait(driver, 5, 0.5).until(EC.visibility_of_element_located((By.ID, "kw")))
element.send_keys('selenium')

WebDriverWait 类是 WebDriver 提供的等待方法。在设置时间内,默认每隔一段时间检

测一次当前页面元素是否存在,如果超过设置时间仍检测不到,则抛出异常。

具体格式如下。

  • driver:浏览器驱动。

  • timeout:最长超时时间,默认以秒为单位。

  • poll_frequency:检测的间隔(步长)时间,默认为 0.5s。

  • ignored_exceptions:超时后的异常信息,默认情况下抛出 NoSuchElementException异常。

WebDriverWait()一般与 until()或 until_not()方法配合使用,下面是 until()和 until_not()

方法的说明:

until(method, message=″)

调用该方法提供的驱动程序作为一个参数,直到返回值为 True。

until_not(method, message=″)

调用该方法提供的驱动程序作为一个参数,直到返回值为 False。

在本例中,通过 as 关键字将 expected_conditions 重命名为 EC,并调用 presence_of_element_located()方法判断元素是否存在。

expected_conditions 类提供的预期条件判断方法如下图所示。

除 expected_conditions 类提供的丰富的预期条件判断方法外,还可以利用is_displayed()方法自己实现元素显示等待。

from time import sleep, ctime
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Firefox()
driver.get("https://www.baidu.com")
print(ctime())for i in range(10):try:el = driver.find_element(By.ID, "kw22")if el.is_displayed():breakexcept:passsleep(1)
else:print("time out")
print(ctime())

相对来说,这种方式更容易理解。首先 for 循环 10 次,然后通过 is_displayed()方法循环判断元素是否可见。如果为 True,则说明元素可见,执行 break 跳出循环;

否则执行 sleep()休眠 1s 后继续循环判断。10 次循环结束后,如果没有执行 break,则执行 for 循环对应的else 语句,打印“time out”信息。

这里故意将 id 定位设置为“kw22”,定位失败,执行结果如下:

(2)隐式等待

WebDriver 提供的 implicitly_wait()方法可用来实现隐式等待,用法相对来说要简单得

多。

from time import ctime
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementExceptiondriver = webdriver.Firefox()
# 设置隐式等待为 10s
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")
try:print(ctime())driver.find_element(By.ID, "kw22").send_keys('selenium')
except NoSuchElementException as e:print(e)
finally:print(ctime())

implicitly_wait()的参数是时间,单位为秒,本例中设置的等待时间为 10s。

首先,这10s 并非一个固定的等待时间,它并不影响脚本的执行速度。其次,它会等待页面上的所有

元素。当脚本执行到某个元素定位时,如果元素存在,则继续执行;如果定位不到元素,

则它将以轮询的方式不断地判断元素是否存在。假设在第 6s 定位到了元素,则继续执行,

若直到超出设置时间(10s)还没有定位到元素,则抛出异常。

这里同样故意将 id 定位设置为“kw22”,定位失败,执行结果如下:

7.警告框处理

在 WebDriver 中处理 JavaScript 生成的 alert、confirm 和 prompt 十分简单,具体做法是,

首先使用 switch_to.alert()方法定位,然后使用 text、accept、dismiss、send_keys 等进行操

作。

  • text:返回 alert、confirm、prompt 中的文字信息。

  • accept():接受现有警告框。

  • dismiss():解散现有警告框。

  • send_keys():在警告框中输入文本(如果可以输入的话)。

这里以百度搜索设置为例,打开百度搜索设置,设置完成后单击“保存设置”按钮,可以使用 switch_to.alert()方法为百度搜索设置弹窗,如下图所示:

代码如下:

from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChainsdriver = webdriver.Firefox()
driver.get('https://www.baidu.com/')
# 定位超链接‘设置’
setting = driver.find_element(By.ID, 's-usersetting-top')
# 使用方法 move_to_element 模拟将鼠标悬停在超链接“设置”处
ActionChains(driver).move_to_element(setting).perform()
# 通过class定位超链接‘搜索设置’,并实现单击操作
driver.find_element(By.CLASS_NAME, "set").click()
# 通过xpath获取保存设置
driver.find_element(By.XPATH, "//a[@class='prefpanelgo setting-btn c-btn c-btn-primary']").click()
sleep(3)# 获取警告框
alert = driver.switch_to.alert
# 获取警告框提示信息
alert_text = alert.text
print(alert_text)
# 接取警告框
alert.accept()

8.获取Cookie

有时我们需要验证浏览器中的 Cookie 是否正确,因为基于真实的 Cookie 是无法通过

白盒测试和集成测试的。WebDriver 提供了操作 Cookie 的相关方法,可以读取、添加和删

除 Cookie。

WebDriver 操作 Cookie 的方法如下:

  • get_cookies():获得所有 Cookie。

  • get_cookie(name):返回字典中 key 为“name”的 Cookie。

  • add_cookie(cookie_dict):添加 Cookie。

  • delete_cookie(name,optionsString):删除名为 OpenString 的 Cookie。

  • delete_all_cookies():删除所有 Cookie。

下面通过 get_cookies()获取当前浏览器的所有 Cookie。代码如下:

from selenium import webdriverdriver = webdriver.Firefox()
driver.get('https://www.baidu.com/')
# 获得所有 Cookie 信息并打印
cookie = driver.get_cookies()
print(cookie)

执行结果如下:

从执行结果可以看出,Cookie 中的数据是以字典形式存放的。知道了 Cookie 中数据的

存放形式后,即可按照这种形式向浏览器中添加 Cookie。

from selenium import webdriverdriver = webdriver.Firefox()
driver.get('https://www.baidu.com/')# 添加 Cookie 信息
driver.add_cookie({'name': 'foo', 'value': 'bar'})
# 遍历指定的 Cookies
for cookie in driver.get_cookies():print("%s -> %s" % (cookie['name'], cookie['value']))

执行结果如下:

从执行结果可以看出,最后一条 Cookie 是在脚本执行过程中通过 add_cookie()方法添

加的。通过遍历得到所有的 Cookie,从而找到字典中 key 为“name”和“value”的 Cookie

值。

delete_cookie() 和 delete_all_cookies() 方法的使用也很简单,前者通过 name 删除一个

指定的 Cookie,后者直接删除浏览器中的所有 Cookies。

9.窗口截图

自动化测试用例是由程序执行的,因此有时候打印的错误信息不够直观。如果在脚本

执行出错时能够对当前窗口进行截图并保存,那么通过截图就可以非常直观地看到脚本出

错的原因。WebDriver 提供了截图函数 save_screenshot (),可用来截取当前窗口。

from time import sleep
from selenium import webdriverdriver = webdriver.Firefox()
driver.get('https://www.baidu.com/')
sleep(3)# 截取当前窗口,指定截图图片的保存位置
driver.save_screenshot("D:/baidu_img.png")

WebDriver 建议使用 png 作为图片的后缀名。脚本运行完成后,会在D盘根目录下生成 baidu_img.png 图片

这样我们就学习完大部分Selenium 的特殊元素操作方法了,读者可以掌握 Selenium 的常用方法,包括熟悉每种方法使用的场景或者前提条件。

相关文章:

【Selenium学习】Selenium 中特殊元素操作

1.鼠标定位操作鼠标悬停&#xff0c;即当光标与其名称表示的元素重叠时触发的事件&#xff0c;在 Selenium 中将键盘鼠标操作封装在 Action Chains 类中。Action Chains 类的主要应用场景为单击鼠标、双击鼠标、鼠标拖曳等。部分常用的方法使用分类如下&#xff1a;• click(on…...

Spark相关的依赖冲突,后期持续更新总结

Spark相关的依赖冲突持续更新总结 Spark-Hive_2.11依赖报错 这个依赖是Spark开启支持hive SQL解析&#xff0c;其中2.11是Spark对应的Scala版本&#xff0c;如Spark2.4.7&#xff0c;对应的Scala版本是2.11.12&#xff1b;这个依赖会由于Spark内部调用的依赖guava的版本问题出…...

【每日一题Day122】LC1237找出给定方程的正整数解 | 双指针 二分查找

找出给定方程的正整数解【LC1237】 给你一个函数 f(x, y) 和一个目标结果 z&#xff0c;函数公式未知&#xff0c;请你计算方程 f(x,y) z 所有可能的正整数 数对 x 和 y。满足条件的结果数对可以按任意顺序返回。 尽管函数的具体式子未知&#xff0c;但它是单调递增函数&#…...

笔记本加装固态和内存条教程(超详细)

由于笔记本是几年前买的了&#xff0c;当时是4000&#xff0c;现在用起来感到卡顿&#xff0c;启动、运行速度特别慢&#xff0c;就决定换个固态硬盘&#xff0c;加个内存条&#xff0c;再给笔记本续命几年。先说一下加固态硬盘SSD的好处&#xff1a;1.启动快 2.读取延迟小 3.写…...

【Python】字典 - Dictionary

字典 - Dictionarykeys()values()items()get()获取文件中指定字符的个数进阶版&#xff1a;获取所有单词的频数进阶版&#xff1a;获取所有字符的频数函数内容keys()输出字典中的所有键values()输出字典中的所有值items()以元组的形式输出键值对get()获取字典中指定键的值 keys…...

LeetCode分类刷题----二叉树

二叉树1.二叉树的递归遍历144.二叉树的前序遍历145.二叉树的后序遍历94.二叉树的中序遍历2.二叉树的迭代遍历144.二叉树的前序遍历145.二叉树的后序遍历94.二叉树的中序遍历3.二叉树的层序遍历102.二叉树的层序遍历107.二叉树的层序遍历||199.二叉树的右视图637.二叉树的层平均…...

Zipkin : Golang 微服务全链路监控(三)

Zipkin : Golang 微服务全链路监控&#xff08;三&#xff09; Golang 微服务全链路监控实现 broker-service -> auth-service -> postgres dbzipkin 监控&#xff1a;需代码入侵 使用 zipkin 库的 serverMiddleware&#xff0c;其通过 Http 跟踪&#xff08;trace&am…...

5.3 BGP路由黑洞

5.2.3实验3:BGP路由黑洞 1. 实验目的 熟悉BGP路由黑洞的应用场景掌握BGP水平分割的配置方法2. 实验拓扑 实验拓扑如图5-3所示: 图5-3:BGP路由黑洞 3. 实验步骤 配置IP地址 R1的配置 <Huawei>syst...

STM32 DFU模式烧录代码

什么是DFU? dfu的本质是isp&#xff0c;usb接口的isp&#xff0c;在系统编程&#xff0c;进入isp的方式我们先了解 如下图 boot0为高电平 boot1为低电平即可进入isp模式。 熟悉的场景 在我们使用flymcu软件下载代码时&#xff0c;本质也是isp 串口接口的isp。 傻瓜使用方式…...

松下PLC通过fpwin上传写入MRTC模块方法

目录 PLC程序上传方法 加密模块使用 PLC程序上传方法 手动将PLC模式设置为prog模式查看PLC是否设置为禁止上传查询指示灯是否变蓝&#xff0c;变蓝则需要将PLC禁止上传功能取消。 3.当上述动作操作完成后&#xff0c;将PLC程序导入到PLC中。为了配合加密程序使用&#xff0c;…...

就业大山之下的网络安全:安逸的安服仔

从去年开始&#xff0c;各个互联网大厂就接二连三的放出了裁员消息&#xff0c;整个互联网行业好像都处于寒冬状态。微博、小米、滴滴、知乎、拼多多等在内的一大批互联网知名企业&#xff0c;也相继传出“人员优化”的消息。 除了国内市场的萧条&#xff0c;国外市场也是不容…...

JavaWeb3-线程的3种创建方式7种写法

目录 1.方式一&#xff1a;继承Thread&#xff08;2种写法&#xff09; 写法①&#xff08;常规&#xff09;&#xff1a; a.使用jconsole观察线程 b.启动线程——start方法 PS&#xff1a;&#xff08;常见面试题&#xff09;start 方法与 run 方法的区别&#xff1a; 写…...

驱动调试手段

文章目录 前言一、通过sysfs调试LCD查看电源:查看 pwm 信息查看管脚信息总结前言 本文记录在驱动中常用的调试手段 提示:以下是本篇文章正文内容,下面案例可供参考 一、通过sysfs 系统起来之后可以读取 sysfs 一些信息,来协助调试 示例: 调试LCD 输入如下命令 cat /…...

[RK3568 Android12] 音频及路由

1:概述(耳机 ,hdmiin ,板载喇叭) 在开发板上面,系统注册了三个音频输出通道,如下: [ 2.280612] ALSA device list: [ 2.280622] #0: rockchip,rk809-codec [ 2.280630] #1: ROCKCHIP,SPDIF [ 2.280638] #2: rockchip,hdmi console:/proc/asound # cat pcm …...

C++——C++11 第一篇

目录 统一的列表初始化 &#xff5b;&#xff5d;初始化 decltype ​编辑 nullptr STL中一些变化 右值引用和移动语义 左值引用和右值引用 总结 左值引用优缺点 右值引用&#xff08;将亡值&#xff09; 拷贝赋值和移动赋值 万能引用|完美转发 移动构造和移动赋值注意…...

Spring Data JPA 中 CrudRepository 和 JpaRepository 的区别

1 问题描述Spring Data JPA 中&#xff0c;CrudRepository 和 JpaRepository 有何区别&#xff1f;当我在网上找例子的时候&#xff0c;发现它们可以互相替换使用。它们有什么不同呢&#xff1f;为什么你习惯用其中的一个而不是另一个呢&#xff1f;2 CrudRepository 和 JpaRep…...

推荐几款好用的数据库管理工具

本文主要介绍几款常用的数据库管理软件&#xff08;客户端&#xff09;&#xff0c;包括开源/免费的、商用收费的&#xff0c;其中有一些是专用于 MySQL 数据库的&#xff0c;例如 MySQL Workbench、phpMyAdmin&#xff0c;有一些是支持多种 SQL、NoSQL 数据库的&#xff0c;例…...

DPDK — 性能优化手段

目录 文章目录 目录硬件布局层面的优化操作系统层面的优化Linux 操作系统版本应用程序层面的优化Cache 优化内存对齐内存预取SIMD 报文批处理DDIO使用高级 CPU 指令集硬件布局层面的优化 DPDK 在硬件布局层面的优化,主要体现在以下几个方面: CPU 频率的高低:CPU 频率越高,…...

Fedora Linux未来五年规划

Fedora 委员会一直致力于起草战略计划&#xff0c;以帮助 Fedora Linux 更好地发展。近日 Fedora 委员会公布了一份 “《未来五年的 Fedora Linux 》” 战略计划草案&#xff0c;这份草案里面包含了他们的雄心壮志&#xff1a;每周将 Fedora 的活跃贡献者人数增加一倍。 Fedora…...

【C++之容器篇】map和set常见函数接口的使用与剖析

目录前言一、set1. 简介2. 成员类型3. 构造函数(1) set()(2)set(InputIterator first,InputIterator last)(3)使用4. 拷贝构造函数和赋值运算符重载5. empty()6. size()7. insert()(1)pair<iterator,bool> insert(const K& key)(2)iterator insert(iterator pos,cons…...

虚拟DOM是什么

参考文章做的总结&#xff0c;如有不足之处请指正&#xff01; 在讲虚拟dom之前&#xff0c;先讲讲&#xff0c;为什么前端操作dom会导致页面性能降低&#xff1f; 先说几个概念 有助于后面的理解 什么是 JavaScript 引擎&#xff1f; JavaScript引擎是一个专门处理JavaScript脚…...

进程通信方式

无名管道( pipe )&#xff1a; 管道是一种半双工的通信方式&#xff0c;数据只能单向流动&#xff0c;而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。高级管道&#xff08;popen&#xff09;&#xff1a; 将另一个程序当做一个新的进程在当前程序进…...

强化学习基础知识

强化学习是一种机器学习方法&#xff0c;通过agent与environment的互动&#xff0c;学习适当的action policy以取得更大的奖励reward。本篇博客介绍强化学习的基础知识&#xff0c;与两类强化学习模型。 目录强化学习的基础设定policy based 强化学习的目标3个注意事项实际训练…...

LeetCode230218_148、654. 最大二叉树

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums 构建的 最大二叉树…...

WordPress 是什么?.com 和 .org 的 WordPress 有什么差异?

本篇文章会介绍这次WordPress 5.8核心版本所带来的其中一项新功能&#xff1a;内存块小工具&#xff08;Widget&#xff09;此次更新把小工具编辑设定的页面也改成用「内存块编辑」的概念&#xff0c;就跟内置的「古腾堡」编辑器一样&#xff0c;把所有元件都内存块化&#xff…...

java8新特性【2023】

Lambda表达式 新的一套语法规则 是一个匿名函数 Testpublic void test1(){Runnable r1 new Runnable(){Overridepublic void run() {System.out.println("线程A");}};r1.run();System.out.println("");Runnable r2 () -> System.out.println("…...

刷题记录:牛客NC51101Lost Cows

传送门:牛客 题目描述: (2≤N≤8,000) cows have unique brands in the range 1..N. In a spectacular display of poor judgment, they visited the neighborhood watering hole and drank a few too many beers before dinner. When it was time to line up for their ev…...

华为OD机试 - 不等式 | 备考思路,刷题要点,答疑 【新解法】

最近更新的博客 华为OD机试 - 寻找路径 | 备考思路,刷题要点,答疑 【新解法】华为OD机试 - 最小叶子节点 | 备考思路,刷题要点,答疑 【新解法】华为OD机试 - 对称美学 | 备考思路,刷题要点,答疑 【新解法】华为OD机试 - 最近的点 | 备考思路,刷题要点,答疑 【新解法】华…...

GuLi商城-SpringCloud-OpenFeign测试远程调用

1. Feign 简介 Feign 是一个声明式的 HTTP 客户端&#xff0c;它的目的就是让远程调用更加简单。Feign 提供了HTTP请 求的模板&#xff0c;通过编写简单的接口和插入注解&#xff0c;就可以定义好 HTTP 请求的参数、格式、地址等信 息。Feign 整合了 Ribbon&#xff08;负载…...

阿里云_山东鼎信短信的使用(云市场)

目录山东鼎信API工具类随机验证码工具类进行测试Pom依赖(可以先导入依赖)创建controllerSmsServiceSmsServiceImplswagger测试(也可以使用postman)山东鼎信API工具类 山东鼎信短信官网 找到java的Api&#xff0c;复制下来 适当改了一下&#xff0c;为了调用(类名SmsUtils) p…...

制作俄语网站/南宁网站推广营销

传入一个需要比较的字符串。例如 [value compare:"********"] &#xff0c;返回 NSOrderedSame。 options:(NSStringCompareOptions)传入 NSStringCompareOptions 枚举的值 enum{NSCaseInsensitiveSearch 1,//不区分大小写比较NSLiteralSearch 2,//区分大小写比较N…...

主机屋做网站视频/色盲测试

jackson简单使用&#xff0c;对象转json&#xff0c;json转对象&#xff0c;json转list POJO序列化为json字符串&#xff1a; 准备一个POJO&#xff1a; JsonIgnoreProperties(ignoreUnknown true) class User implements Serializable {private static final long serialVers…...

国外专卖模板的网站/公司网络优化方案

本文实例讲述了PHP使用redis实现统计缓存mysql压力的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;<?php header("Content-Type:text/html;charsetutf-8");include lib/mysql.class.php;$mysql_obj mysql :: getConn();// redis$redis new Redi…...

网站文章更新怎么通知搜索引擎/百度推广效果怎么样

Golang 支持在一个平台下生成多个平台运行包编译之后直接可执行&#xff0c;使用起来非常方便1.Mac Mac下编译Linux, Windows平台的64位可执行程序&#xff1a;CGO_ENABLED0 GOOSlinux GOARCHamd64 go build test.go CGO_ENABLED0 GOOSwindows GOARCHamd64 go build test.go2.L…...

wordpress模版c2c商城/网站推广有哪些方式

众所周知&#xff0c;系统的更新是为了增强系统的稳定性&#xff0c;优化流畅性&#xff0c;有的则是优化了续航&#xff0c;修复BUG&#xff0c;优化安全性等等。对于国内很多定制UI&#xff0c;新手机更新的频率以及Android的版本都能保持一段时间的稳定。新系统一般会针对目…...

自己怎么做卡密网站/百度快照的作用是什么

云计算在图书馆领域的应用与研究已陆续展开&#xff0c;图书馆的云时代即将到来。重塑图书馆生存和发展的环境、推动图书馆自身变革是云计算环境下图书馆发展的未来趋势。 云计算是分布式处理&#xff08;Distributed Computing&#xff09;、并行处理&#xff08;Parallel Com…...