Selenium(3 + 4 超级详细笔记)

news2024/11/25 4:25:47

文章目录

  • selenium(web自动化测试)
    • 1. selenium初始化(2种)
    • 2. chrome 启动参数(3种)
    • 3. 八大定位方式
      • 3.1 css 定位
      • 3.2 xpath 定位
      • 3.3 link_text 定位
      • 3.4 partial_link_text 定位
      • 3.5 relative 相对定位
    • 4. 添加等待时间
      • 4.1 休眠等待:time(调式)
      • 4.2 显式等待:Explicit Waits(常用)
      • 4.3 隐式等待:Implicit Waits
    • 5. 浏览器操作(WebDriver方法)
      • 5.1 获取信息
      • 5.2 导航
      • 5.3 切换框架(iframe)
      • 5.4 切换窗口(window)
      • 5.5 屏幕截图
    • 6. 元素操作(WebElement方法)
      • 6.1 鼠标操作(click)
      • 6.2 键盘操作(send_keys)
      • 6.3 其它操作(4种)
    • 7. 下拉框操作(Select)
    • 8. 提示框操作(Prompt box)
    • 9. 执行 JS 脚本
    • 10. PO(page object) 框架


selenium(web自动化测试)

1. selenium初始化(2种)

  • 方式一
# 导入包 (selenium 4版本)
import pytest, os
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
# 用 os 处理路径
chrome_driver_path = os.path.abspath(os.path.join(os.path.dirname(os.path.dirname(__file__)), 'drivers/chromedriver.exe'))
edge_driver_path = os.path.abspath(os.path.join(os.path.dirname(os.path.dirname(__file__)), 'drivers/msedgedriver.exe'))
# 处理测试初始化
@pytest.fixture(scope='session')
def open_close_browser():
    print("Open browser!")
    # 调起 chrome 浏览器
    driver = webdriver.Chrome(service=Service(chrome_driver_path))
    # 调起 edge 浏览器
    # driver = webdriver.Edge(service=Service(edge_driver_path))
    yield driver
    print("Close browser!")
    driver.close()
    print("Test over!")
  • 方式二:(推荐
# 导入包 (selenium 4版本)
import pytest, os
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.microsoft import EdgeChromiumDriverManager
from webdriver_manager.microsoft import IEDriverManager
from webdriver_manager.firefox import GeckoDriverManager
# 处理测试初始化
print("Open browser!")
    # 调起 chrome 浏览器
    # 设置 option 参数(选择)
    service = Service(executable_path=ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service)
    # 调起 edge 浏览器
    # service = Service(executable_path=EdgeChromiumDriverManager().install())
    # driver = webdriver.Edge(service=service)
    # 调起 ie 浏览器
    # service = Service(executable_path=IEDriverManager().install())
    # driver = webdriver.Ie(service=service)
    # 调起 firefox 浏览器
    # service = Service(executable_path=GeckoDriverManager().install())
    # driver = webdriver.Firefox(service=service)
    yield driver
    print("Close browser!")
    driver.close()
    print("Test over!")
    
# 自动下载的 driver(驱动)在C盘的用户夹下的.wdn文件中。

2. chrome 启动参数(3种)

  • –headless: 无界面运行(示例
# 选择参数
option = webdriver.ChromeOptions()
# 添加属性值
option.add_argument('--headless')
# 创建浏览器驱动对象
driver = webdriver.Chrome(options=option, service=Service(chrome_driver_path))
  • –start-maximized: 窗口最大化运行
option.add_argument('--start-maximized')
  • –incognito: 隐身模式运行
option.add_argument('--incognito')
  • 不展示“浏览器正在被自动化程序控制”提示
option.add_experimental_option('excludeSwitches', ['enable-automation'])

3. 八大定位方式

定位方式代码
id 定位driver.find_element(By.ID, ‘kw’)
name 定位driver.find_element(By.NAME, ‘wd’)
classname 定位driver.find_element(By.CLASS_NAME, ‘s_ipt’)
tar_name 定位driver.find_element(By.TAG_NAME, ‘input’)
css 定位1. driver.find_element(By.CSS_SELECTOR, ‘#kw’) # CSS选择器
2. driver.find_element(By.CSS_SELECTOR, ‘input.s_plt’) # CSS选择器
xpath 定位driver.find_element(By.XPATH, ‘//*[@id=“kw”]’)
link_text 定位driver.find_element(By.LINK_TEXT, ‘新闻’)
partial_link_text 定位driver.find_element(By.PARTIAL_LINK_TEXT, ‘新’)

3.1 css 定位

工具获取

  • 通过chrome开发者工具复制可得, 百度首页为例,css定位搜索输入框
driver.find_element(By.CSS_SELECTOR, '#kw').send_keys('selenium')

手工编写获取

  • 标签和属性组合: 标签名[属性名=属性值]

  • 有多个标签时,标签之前空格相隔

  • 属性可以是任意属性

  • class/id除了可以采用以上写法外,还可以采用专用写法, 以百度搜索输入框为例:

    • 通过class编写: 标签名.class属性值
    input.s_ipt 	# input标签中class属性值为s_ipt
    
    • 通过id编写: 标签名#id属性值
    input#kw 		# input标签中id属性值为kw
    
    • class 和 id 组合
    input#kw.s_ipt 	# input标签中id值为kw,class值为s_ipt
    

3.2 xpath 定位

表达式描述
//从当前节点获取子孙节点
/从当前节点获取直接子节点
@选取属性
[ ]添加筛选条件
*获取当前节点
**获取当前节点的父节点
nodename获取该节点的所有子节点
  • XPath:即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。它被开发者采用来当作小型查询语言.

  • 获取xpath路径有两种方式:

    • 通过开发者工具复制 xpath 路径
    driver.find_element(By.XPATH, '//*[@id="kw"]')
    
    • 手工编写 xpath 路径

    1.纯标签路径

    纯标签路径分两种:一种是绝对路径,另一种是相对路径, 以百度首页输入框为例:

    ​ 1. 绝对路径:

    /html/body/div/div/div[5]/div/div/form/span[1]/input
    
    1. 相对路径:
    //form/span[1]/input
    

    2.标签和属性相结合

    语法://标签名[@属性名=属性值]

    //input[@id='kw']		# 查找input标签中属性id值为kw的页面元素
    //*[@id='kw'] 			# 查找属性为id=‘kw'的页面元素
    //span/input[@id='kw'] 	# 标签也可以有多个
    //span[@class='bg s_ipt_wr quickdelete-wrap']/input # 还可以使用上层标签的属性帮助定位
    

    3. xpath 模糊匹配

    • starts-with: 以什么开头
    //input[starts-with(@type, "sub")] # 查找input标签中type属性,其值以sub开头的页面元素
    
    • ends-with: 以什么结尾(注:chrome使用的是xpath1.0版本,不支持此项模糊查询)
    //input[ends-with(@type,"mit")] # 查找input标签中type属性,其属性值以mit结尾的页面元素
    
    • contains: 包含
    //input[contains(@class, 's_btn')] # 查找input标签中class属性中含有“s_btn”字符串的页面元素
    
    • contains: 包含text
    //div[contains(text(), "热榜")] # 查找div标签中文本中含有“热榜”的页面元素
    

3.3 link_text 定位

  • link_text定位文字链接
driver.find_element(By.LINK_TEXT, '新闻').click()

3.4 partial_link_text 定位

  • partial_link_text通过部分文字定位文字链接
driver.find_element(By.PARTIAL_LINK_TEXT, '新').click()

3.5 relative 相对定位

  • to_left_of:定位位于指定元素左侧的元素。
  • to_right_of:定位位于指定元素右侧的元素。
  • above:定位位于指定元素上方的元素。
  • below:定位位于指定元素下方的元素。
from selenium.webdriver.support.relative_locator import locate_with
# 获取相对元素
text_locator = locate_with(By.ID,'kw').to_left_of({By.ID: "kw"})
# 注意:
# 目前不知道这个元素能干什么,后续补充!

4. 添加等待时间

4.1 休眠等待:time(调式)

  • 有时候为了保证脚本运行的稳定性,需要脚本中添加等待时间, 添加休眠:
import time # 先导入模块文件
sleep(3) # 休眠3秒

4.2 显式等待:Explicit Waits(常用)

  • 显式等待主要是使用WebDriverWait来实现,其语法格式如下:
from selenium.webdriver.support.wait import WebDriverWait

WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)

# driver:浏览器驱动;
# timeout:最长超时时间,默认以秒为单位;
# poll_frequency:检测的间隔步长,默认为0.5s;
# ignored_exceptions:超时后的抛出的异常信息,默认抛出NoSuchElementExeception异常。

在使用WebDriverWait时,需要搭配untiluntil_not方法来使用,其语法格式如下:

until(method, message='')
until_not(method, message='')

# method:指定预期条件的判断方法;
# message:超时后抛出的提示;
  • 示例
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 创建 Wait 对象
wait = WebDriverWait(driver,2,0.3)
wait.until(EC.title_is('标题'))
# 后续操作
方法描述类型
title_is(‘’)判断当前页面的 title 是否等于预期布尔
title_contains(‘’)判断当前页面的 title 是否包含预期字符串布尔
presence_of_element_located(locator)判断元素是否被加到了 dom 树里,并不代表该元素一定可见WebElement
visibility_of_element_located(locator)判断元素是否可见,可见代表元素非隐藏,并且元素的宽和高都不等于0WebElement
visibility_of(element)跟上一个方法作用相同,但传入参数为 elementWebElement
text_to_be_present_in_element(locator ,‘’)判断元素中的 text 是否包含了预期的字符串布尔
text_to_be_present_in_element_value(locator ,‘’)判断元素中的 value 属性是否包含了预期的字符串布尔
frame_to_be_available_and_switch_to_it(locator)判断该 frame 是否可以 switch 进去,True 则 switch 进去,反之 False布尔
invisibility_of_element_located(locator)判断元素中是否不存在于 dom 树或不可见布尔
element_to_be_clickable(locator)判断元素中是否可见并且是可点击的布尔
staleness_of(element)等待元素是否从 dom 树中移除布尔
element_to_be_selected(element)判断元素是否被选中,一般用在下拉列表布尔
element_selection_state_to_be(element,True)判断元素的选中状态是否符合预期,参数 element,第二个参数为 True/False布尔
element_located_selection_state_to_be(locator,True)跟上一个方法作用相同,但传入参数为 locator布尔
alert_is_present()判断页面上是否存在 alertalert
  • 示例代码:
from time import sleep
from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
 
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
element = WebDriverWait(driver, 2,0.5,ignored_exceptions=None).until(EC.presence_of_element_located((By.ID, 'toolbar-search-input')),message='超时!') # 定位不存在的标签
element.send_keys('NBA',Keys.ENTER)
sleep(5)    	# 休眠5秒
driver.quit()   # 关闭浏览器并释放进程资源

4.3 隐式等待:Implicit Waits

  • 适用场景:一般在 Browser 初始化阶段(conftest文件中)使用。
driver.implicitly_wait(30)

# 隐式地等待一个元素被发现或一个命令完成,这个方法每次会话只需要调用一次。

5. 浏览器操作(WebDriver方法)

5.1 获取信息

  • 获取浏览器信息,其方法分别如下所示:
driver = webdriver.Chrome()
driver.title  		# 获取浏览器当前页面的标签
driver.current_url  # 获取浏览器当前地址栏的URL
driver.page_source  # 获取当前html源码
driver.name  		# 获取浏览器名称(chrome)
driver.current_window_handle	# 窗口句柄
driver.window_handles			# 当前窗口的所有句柄
driver.get_window_rect() 		# 获取浏览器尺寸,位置
driver.get_window_position() 	# 获取浏览器位置(左上角)

# 运行结果:
{'width': 1552, 'height': 840}
{'x': -8, 'y': -8}

5.2 导航

  • 浏览器导航,其实现方法分别为:
driver.forward() 	# 浏览器前进
driver.back() 		# 浏览器后退
driver.refresh() 	# 刷新必应网页

5.3 切换框架(iframe)

  • 使用 WebElement
# 存储网页元素
iframe = driver.find_element(By.CSS_SELECTOR, "#modal > iframe")

# 切换到选择的 iframe
driver.switch_to.frame(iframe)

# 单击按钮
driver.find_element(By.TAG_NAME, 'button').click()
  • 使用 name 或 id
# 通过 id 切换框架
driver.switch_to.frame('buttonframe')

# 单击按钮
driver.find_element(By.TAG_NAME, 'button').click()
  • 使用索引
# 基于索引切换到第 2 个 iframe
iframe = driver.find_elements(By.TAG_NAME,'iframe')[1]

# 切换到选择的 iframe
driver.switch_to.frame(iframe)
  • 离开框架
# 切回到默认内容
driver.switch_to.default_content()

5.4 切换窗口(window)

# 打开新闻 Tab 标签
driver.find_element(By.LINK_TEXT,'新闻').click()
# 休眠 1 秒
sleep(1)
# 切换到第一个 Tab 标签
driver.switch_to.window(driver.window_handles[0])

5.5 屏幕截图

  • 常用的截图方法如下:
方法描述
driver.save_screenshot(filename)获取当前屏幕截图保存为指定文件,filename指定为完整保存路径或文件名
driver.get_screenshot_as_base64()获取当前的屏幕截图 base64 编码字符串
driver.get_screenshot_as_file(filename)获取当前的屏幕截图,使用完整的路径
driver.get_screenshot_as_png()获取当前屏幕截图的二进制文件数据
  • 获取当前屏幕截图的案例:
from time import sleep, strftime, localtime, time
# 文件路径名
filename = os.path.abspath(os.path.dirname(__file__)) + '/screenshot.png'
filename = 'screenshot.com'
# 图片的时间信息
st = strftime("%Y-%m-%d-%H-%M-%S", localtime(time()))
filename = st + '.png'
# 获取屏幕截图
driver.save_screenshot(filename)
  • 获取截屏保存到文件夹中:
import os 
from time import sleep, strftime, localtime, time
# 图片的时间信息
st = strftime("%Y-%m-%d-%H-%M-%S", localtime(time()))
file_name = st + '.png'
# 路径
path = os.path.abspath('screenshot')
file_path = path + '/' + file_name
# 获取屏幕截图
driver.save_screenshot_as_file(file_path)

6. 元素操作(WebElement方法)

  • 常用的元素操作方法如下:
方法描述
text获取元素文本内容
rect获取元素位置信息
click()单击左键
send_keys()输入内容
clear()清除内容
submit()提交表单
get_attribute(“属性”)获取属性值
is_selected()是否被选中
is_enabled()是否可用
is_displayed()是否显示
value_of_css_property()css 属性值

6.1 鼠标操作(click)

  • 常用的鼠标操作方法如下:
方法描述
click()单击左键
context_click()单击右键
double_click()双击左键
drag_and_drop()鼠标拖动
move_to_element()鼠标悬停
execute_script()界面滑动
perform()执行所有ActionChains中存储的动作
  • 单击左键
from selenium.webdriver.common.by import By

element = driver.find_element(By.ID, 'su') #定位元素
element.click() # 给元素 单击左键
  • 单击右键

  • 依赖pyautogui第三方支持右键菜单元素操作

import pyautogui
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
#定位元素
element = driver.find_element(By.ID, 'su') 
# 给元素 单击右键
ActionChains(driver).context_click(element).perform() 
# 等待2s
sleep(2)
# 
pyautogui.typewrite(['down', 'down', 'return'])
  • 双击左键
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
# 定位元素
element = driver.find_element(By.ID, 'su') 
# 给元素 双击左键
ActionChains(driver).double_click(element).perform() 
  • 鼠标拖动
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains

# 定位要拖动的元素
source = driver.find_element('选择器','xxx')
# 定位目标元素
target = driver.find_element('选择器','xx')
# 执行拖动动作
ActionChains(driver).drag_and_drop(source, target).perform()
  • 鼠标悬停
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
#定位元素
element = driver.find_element(By.XPATH, '"//div/a[@class='s-bri c-font-normal c-color-t']"') 
# 给元素 鼠标悬停
ActionChains(driver).move_to_element(element).perform() 

6.2 键盘操作(send_keys)

  • 作用:模拟键盘输入内容。

  • 在webdriver中的keys类中,提供了很多按键方法,常用的按键操作有:

操作描述
Keys.ENTER回车键
Keys.BACK_SPACE删除键
Keys.F1F1键
Keys.SPACE空格
Keys.CONTROLCtrl键
Keys.TABTab键
Keys.ESCAPEESC键
Keys.ALTAlt键
Keys.SHIFTShift键
Keys.ARROW_UP向上箭头
Keys.ARROW_RIGHT向右箭头
Keys.ARROW_DOWN向下箭头
Keys.ARROW_LEFT向左箭头
  • 回车键操作案例:
from selenium.webdriver.common.by import By
from selenium.webdriver import Keys
# 定位元素
element = driver.find_element(By.ID, 'kw') 
# 给元素 双击左键
element.send_keys('selenium', Keys.ENTER)
  • 复制,粘贴操作案例:
from selenium.webdriver.common.by import By
from selenium.webdriver import Keys
# 定位元素
element = driver.find_element(By.ID, 'kw') 
# 全选文本
element.send_keys(Keys.CONTROL, 'a')
element.send_keys(Keys.CONTROL, 'c')
element.send_keys(Keys.CONTROL, 'v')

6.3 其它操作(4种)

  • 清除输入框的内容:clear()
from selenium.webdriver.common.by import By
# 定位搜索输入框,向搜索输入框中输入文本“selenium"
element = driver.find_element(By.ID, 'kw').send_keys('selenium')  
# 等待2s
sleep(2) 
# 清除搜索输入框中的文本
element.clear() 
  • 提交表单:submit()
from selenium.webdriver.common.by import By
# 定位搜索输入框,向搜索输入框中输入文本“selenium"
driver.find_element(By.ID, 'kw').send_keys('selenium')  
#定位搜索按钮,并提交表单
driver.find_element(By.ID, 'su').submit() 
  • 获取元素文本内容:text
from selenium.webdriver.common.by import By
# 定位文本框
element = driver.find_element(By.CSS_SELECTOR, '#bottom_layer > div > p:nth-child(3) > a')
# 等待2s
sleep(1)
# 打印出元素文本内容
print('get text:', element.text)
  • 获取页面元素属性:get_attribute(“属性”)
from selenium.webdriver.common.by import By
# 定位文本输入框
element = driver.find_element(By.ID, 'kw')
# 打印文本输入框的 name 属性
print(f'the attribute value of element is: {element.get_attribute("name")}')

7. 下拉框操作(Select)

  • 常用的下拉框操作方法如下:
方法/属性方法/属性描述
select_by_value()根据值选择
select_by_index()根据索引选择
select_by_visible_text()根据文本选择
deselect_by_value()根据值反选
deselect_by_index()根据索引反选
deselect_by_visible_text()根据文本反选
deselect_all()反选所有
options所有选项
all_selected_options所有选中选项
first_selected_option第一个选中选项
  • 根据值选择案例:
from selenium.webdriver.support.select import Select
# 定位下拉框
element = driver..find_element_by_name('selects')
# 选择选项
Select(element).select_by_visible_text('北京')

8. 提示框操作(Prompt box)

  • alert 框: 只有一个确定按钮。
# 定位 alert 框
driver.find_element(By.ID, 'alert').click()
# 切换到 alert 框
alert = driver.switch_to.alert
# 点击确认
alert.accept()
  • confirm 框 :两个按钮,一个“确定”按钮,另一个是“取消”按钮。
# 定位 confirm 框
driver.find_element(By.ID, 'confirm').click()
# 切换到 confirm 框
confirm = driver.switch_to.alert
# 点击确认
confirm.accept()
# 点击取消
confirm.dismiss()
  • prompt 框: 一个文本输入框,一个”确定“按钮和一个”取消“按钮。
# 定位 prompt 框
driver.find_element(By.ID, 'prompt').click()
# 切换到 prompt 框
prompt = driver.switch_to.alert
# 向 prompt 框发送消息
prompt.send_keys('lisainfsad')
# 点击确认
prompt.accept()
# 点击取消
prompt.dismiss()

9. 执行 JS 脚本

  • 界面滑动案例:
# 使用execute_script方法执行JavaScript代码来实现鼠标滚动
js='window.scrollTo(0, 500);' 
# 向下滚动 500 像素
driver.execute_script(js) 

10. PO(page object) 框架

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

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

相关文章

uniapp动态获取列表中每个下标的高度赋值给另一个数组(完整代码附效果图)

uniapp实现动态获取列表中每个下标的高度&#xff0c;赋值给另一个数组。 先看效果图&#xff1a; 完整代码&#xff1a; <template><div class""><div class"">我是A列表&#xff0c;我的高度不是固定的</div><div class&qu…

DDOS百科:什么是 DDoS 攻击及如何防护DDOS攻击

一、什么是 DDoS 攻击&#xff1f; 当多台机器一起攻击一个目标&#xff0c;通过大量互联网流量淹没目标或其周围基础设施&#xff0c;从而破坏目标服务器、服务或网络的正常流量时&#xff0c;就会发生分布式拒绝服务(DDoS)攻击。 DDoS允许向目标发送指数级更多的请求&#…

Revit 导出明细表的两种方法!

方法一、Revit中怎么灵活运用明细表格式的导出与导入 在做项目的时候&#xff0c;遇到一些项目需要进行工程量统计的时候&#xff0c;经常需要设置明细表里面的格式&#xff0c;例如字体、表格排布样式等&#xff0c;但是项目一旦多起来&#xff0c;这些工作重复性又太高&#…

云计算和云架构是什么 有什么用途?

云计算是一种基于互联网的计算方式&#xff0c;它通过网络将计算资源(如计算能力、存储、网络带宽等)以服务的形式提供给用户&#xff0c;并允许用户根据需求进行灵活的资源调配和管理。云计算通常分为三个层次&#xff0c;即基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服…

如何快速爬取国内985大学学术学报pdf文件

背景 最近&#xff0c;在爬取关于国内985大学的学报时&#xff0c;我注意到大部分大学学报站点格式都采用相似的形式&#xff0c;并且PDF链接都使用自增的ID。然而&#xff0c;我也发现了一个问题&#xff0c;即大多数PDF链接的ID并不是连续的。现在我将向你分享一些方法&…

图采样、随机游走、subgraph的实现

诸神缄默不语-个人CSDN博文目录 本博文主要关注如何用代码实现图采样、随机游走、subgraph&#xff08;为什么这些东西放在一起写&#xff0c;我感觉还蛮直觉的&#xff09;。 随机游走和subgraph我之前都写过不少博文了&#xff0c;可以参考↑ 这个主要是我前年还在干GNN时候…

AtcoderABC247场

A - Move RightA - Move Right 题目大意 要求判断在一行4个方块上的人进行向右移动后&#xff0c;是否每个方块上都有人。初始状态下&#xff0c;给定一个由0和1组成的长度为4的字符串S&#xff0c;其中1表示对应方块上有人&#xff0c;0表示没有人。每个人同时向右移动一格&a…

Java控制台+activiti+springboot+mybatis实现账务报销工作流程

Java控制台activitispringbootmybatis实现账务报销工作流程 一、系统介绍二、功能展示1.代码展示2.员工报销3.账务审批4.总经理审批 三、代码展示四、获取源码 一、系统介绍 系统主要功能&#xff1a; 员工&#xff1a;填写报销单 账务审批&#xff1a;报销金额小于1000账务经…

智能电表数据采集器

智能电表数据采集器是一种用于采集智能电表数据的设备&#xff0c;它可以将智能电表的数据传输到远程服务器上&#xff0c;以便进行数据分析和监控。智能电表数据采集器的主要功能是采集智能电表的实时数据&#xff0c;并将其发送到远程服务器上&#xff0c;从而实现对智能电表…

能源监测系统:实时监控+数据可视化

能源监测系统是应用物联网技术&#xff0c;对水、电、气、热等能源进行实时监测的系统&#xff0c;能够对各种设备数据进行智能化标准化的管理&#xff0c;从而建立起统一的管理优化平台&#xff0c;是积极响应国家节能降耗政策的典型模范&#xff0c;也是企业建设节能型工厂的…

【C++】-stack和queue的具体使用以及模拟实现(dqeue的介绍+容器适配器的介绍)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

MySQL第六章、JDBC编程

目录 一、数据库编程的必备条件 二、Java的数据库编程&#xff1a;JDBC 三、JDBC工作原理 四、JDBC使用 4.1JDBC开发案例 一、数据库编程的必备条件 编程语言&#xff0c;如Java&#xff0c;C、C、Python等数据库&#xff0c;如Oracle&#xff0c;MySQL&#xff0c;SQL S…

uniapp 正常显示editor富文本编辑器的内容

如果不添加editor的样式文件&#xff0c;空格、图片都会显示不正常&#xff0c;需要按照官方文档提示&#xff0c;第一添加样式&#xff0c;第二&#xff0c;设置对应的显示方式。 一、下载editor样式 二、我使用的是rich-text组件&#xff0c;来显示html字符串 <template&…

数据可视化——根据提供的数据,将数据经过处理后以折线图的形式展现

文章目录 前言处理数据获取数据筛选数据将JSON数据转换为Python数据筛选出横坐标数据和纵坐标数据 根据处理后的数据绘制折线图整体代码展示 前言 前面我们学习了如何使用 pyecharts 模块绘制简单的折线图&#xff0c;那么今天我将为大家分享&#xff0c;如何根据提供的数据将…

掘金量化—Python SDK文档—4.数据结构

目录 Python SDK文档 4.数据结构 4.1数据类 Tick - Tick 对象 报价quote - (dict 类型) Bar - Bar 对象 L2Order - Level2 逐笔委托 L2Transaction - Level2 逐笔成交 4.2交易类 Account - 账户对象 Order - 委托对象 ExecRpt - 回报对象 Cash - 资金对象 Position - 持仓对象…

ylb-接口5产品详情

总览&#xff1a; 1、service处理&#xff08;根据产品id &#xff0c;查询产品信息&#xff09; 在api模块下service包&#xff0c;ProductService接口添加新方法&#xff08;根据产品id &#xff0c;查询产品信息queryById(Integer id)&#xff09;&#xff1a; package …

微服务——技术栈+概念+远程调用案例

目录 微服务技术栈 认识微服务 微服务架构演变 总结 微服务技术对比 SpringCloud springcloud和springboot的对应版本 ​编辑 服务拆分 注意事项 入门案例 远程调用 步骤一 :注册ResTemplate 步骤二&#xff1a;修改service层代码 微服务技术栈 将一个大的项目拆分出…

GUI-Menu菜单实例(颜色+线型菜单)

运行代码&#xff1a; //GUI-Menu菜单实例&#xff08;颜色线型菜单&#xff09; #include"std_lib_facilities.h" #include"GUI/Simple_window.h" #include"GUI/GUI.h" #include"GUI/Graph.h" #include"GUI/Point.h"struc…

2.4G天线(一)

一、概念 1.1、波: 波是指振动的传播。 将某一物理量的扰动或振动在空间逐点传递时形成的运动称为波&#xff0c;波动是物质运动的重要形式。 1.2、电磁波&#xff1a; 电磁波是能量的一种&#xff0c;属于一种波。是由同相振荡且互相垂直的电场与磁场在空间…

pico添加devmem2读写内存模块

devmem2读写内存 自定义msh命令devmem2验证msh命令devmem2读CPUID读写全局变量 devmem2模块可实现对设备寄存器的读写操作。在RT-Thread的命令行组件Fish中添加devmem2模块&#xff0c;用户可在终端输入devmem2相关命令&#xff0c;FinSH根据输入对指定寄存器进行读写&#xff…