【2024软件测试面试必会技能】Appium自动化(6):原生app元素定位方法

news2024/9/9 5:29:49

元素定位方法介绍及应用:

Appium方法定位原生app元素:

通过appium inspector工具,可以获取元素的相关信息;在appium中提供了一系列的元素定位API,通过在这些API中输入指定的元素信息,就能完成元素定位,定位元素后就进行对元素进行自动操作。

appium中识别元素的方式有两种写法

方式一:driver.find_element_by_id(" ")

方式二:driver.find_element(By.ID," ")    -----推荐使用

基本元素定位如下:

前置条件

代码示例:

复制代码

from appium import webdriver  # 导入appium 驱动包
from appium.webdriver.webdriver import By   # 导入appium 定位的方法包


# 1、定义一个DesiredCapabilities配置的字典
des = {
    'platformName':'Android',
    'platformVersion':'6.0.1',  # 填写android虚拟机/真机的系统版本号
    'deviceName':'MuMu',      # 填写安卓虚拟机/真机的设备名称
    'appPackage':'com.sky.jisuanji',    # 填写被测app包名
    'appActivity':'.JisuanjizixieActivity',    # 填写被测app的入口
    'udid':'127.0.0.1:7555',    # 填写通过命令行 adb devices 查看到的udid
    'noReset':True,               # 重置APP
    'unicodeKeyboard':True,       # 支持中文输入
    'resetKeyboard':True,         # 支持重置键盘
    'newCommandTimeout':30        # 30秒没发送新命令就断开连接
       }

# 2、把配置的字典作为请求参数发送给appium服务器
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',des)

复制代码

1、ID定位(取resource-id、id、name)

driver.find_element(By.ID," ")

代码示例:

# ID 定位(取resource-id、id、name)
driver.find_element(By.ID,'com.sky.jisuanji:id/btn6').click()

2、class定位(取class)

driver.find_element(By.CLASS_NAME," ")

代码示例:

# class定位(取class)
driver.find_element(By.CLASS_NAME,'android.widget.Button').click()

注:class有时不是唯一的值,如计算器的数字按键6和9,它们的class都是相同的值,故class定位一般不推荐使用!

3、AccessibilityId定位(取content-desc)注:有些元素是没有content-desc的属性的

driver.find_element_by_accessibility_id('')    注:driver.find_element(By. )  新定位方法By已经没有accessibility_id的方法了

代码示例:

# AccessibilityId定位(取content-desc)
driver.find_element_by_accessibility_id('').click()

备注:其中name方式(取text)已不支持

Xpath定位方法:

xpath ==> XPATH 是一门标记语言 作用是在XML、XHTML 文档中查找元素

selenium xpath是1.0版本语法                           appium xpath是2.0版本语法

1、绝对路径:

绝对路径 xpath 绝对路径  /开头 从根节点直接一层一层定位找到元素;元素的全路径,包含了全部节点。这种方法写起来很长,效率不高;另一方面由于涉及到太多层,一旦中间任何一层有变动,那元素就定位不到了

 

代码示例:通过绝对路径知道计算机的数字按键 5 并点击

# xpath 绝对路径定位/开头 从根节点直接一层一层定位找到元素 遇到同层级相同的元素,用下标区分,下标从1开始
driver.find_element(By.XPATH,'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout[2]/android.widget.LinearLayout/android.widget.TableLayout/android.widget.LinearLayout[2]/android.widget.Button[2]').click

2、使用属性定位  

注:

appium中xpath属性定位格式:driver.find_element(By.XPATH,'//类名[@text="text值"]')

网页中xpath属性定位格式:driver.find_element(By.XPATH,'//标签[@id="id值"]')

text属性:
driver.find_element(By.XPATH,'//类名[@text="text值"]')
resource-id属性:
driver.find_element(By.XPATH,'//类名[@resource-id="属性值"]')
content-desc属性:
driver.find_element(By.XPATH,'//类名[@content-desc="属性值"]')
class属性:
driver.find_element(By.XPATH,'//类名')
多属性:
and表示并且 or表示或者
driver.find_element(By.XPATH,'//类名[@属性名="属性值" and @属性名="属性值"]')
driver.find_element(By.XPATH,'//类名[@属性名="属性值" or @属性名="属性值"]')

代码示例:

复制代码

# 使用属性 定位 //类名[@属性名="属性值"]
driver.find_element(By.XPATH,'//android.widget.Button[@resource-id="com.sky.jisuanji:id/btn8"]').click()
driver.find_element(By.XPATH,'//android.widget.Button[@text="8"]').click()
# 扩展:and/or
# //类名[@属性名1=“属性值1” and @属性名2=“属性值2”]
# //类名[@属性名1=“属性值1” or @属性名2=“属性值2”]
driver.find_element(By.XPATH,'//android.widget.Button[@text="8" and @resource-id="com.sky.jisuanji:id/btn8"]').click()
driver.find_element(By.XPATH,'//android.widget.Button[@text="8" or @bounds="sss"]').click()
# find_elements() 把满足条件的所有元素按匹配顺序放入列表 所以是先匹配到8 然后到9
els = driver.find_elements(By.XPATH,'//android.widget.Button[@text="9" or @text="8"]')
els[0].click()
els[1].click()

复制代码

备注:
1、所有元素的属性都可以进行定位,但必须该属性的值是界面上唯一的
2、xpath支持*代表任意个字符,比如find_element(By.XPATH,'//*[@text=text值]'),这种用法容易同时识别多个元素

3、使用部分属性值定位

当元素的属性值过长或者元素属性值内容中存在动态变化的情况下,可以使用该方法。

starts-with()   contains()    ends-with()--ends-with

起始位置匹配:starts-with()

driver.find_element(By.XPATH,'//类名[starts-with(@属性名,"部分属性值")]')

包含匹配:contains()

driver.find_element(By.XPATH,'//类名[contains(@属性名,"部分属性值")]')

末尾位置匹配:ends-with()   

driver.find_element(By.XPATH,'//类名[ends-with(@属性名,"部分属性值")]')

注:在selenium中没有该方法,ends-with()字符串结尾比对 ,是xpath2.0的函数库和语法,而xpath1.0不存在该函数,selenium中的xpath语法使用的是1.0语法,但是appium是使用xpath2.0及以上的语法

 代码示例:

复制代码

# 部分属性值定位  
# 1、元素属性过长 使用ends-with()方法
driver.find_element(By.XPATH,'//android.widget.Button[ends-with(@resource-id,"btn8")]').click()
# 2、动态元素  第一次打开 text="id_9" 第二次打开text="id_10" 第三次打开text="id_11"
# starts-with(@text,"id_")
driver.find_element(By.XPATH,'//android.widget.Button[starts-with(@text,"id_")]').click()

复制代码

uiautomator方法定位原生app元素:

appium在android端是调用其底层的UIAutomator2自动化测试框架去驱动自动化,在定位元素的时候,可以借助UIAutomator2的语法来实现定位。在代码实现上提供的API是find_element_by_android_uiautomator;利用android_uiautomator进行定位,语法必须属性值是双引号

1、根据text定位:

find_element_by_android_uiautomator('text("值")')
find_element_by_android_uiautomator('newUiSelector().text("值")')    # 'newUiSelector()'推荐使用

代码示例:

# 通过text定位
driver.find_element_by_android_uiautomator('text("5")').click()
# 推荐使用正规方法
driver.find_element_by_android_uiautomator('new UiSelector().text("5")').click()

text定位相关函数:
textContains:模糊匹配文本
textStartsWith:以某个文本开头来匹配
textMatches:正则匹配

代码示例:

复制代码

# text定位相关函数:
# textContains:模糊匹配文本
driver.find_element_by_android_uiautomator('new UiSelector().textContains("...")')
# textStartsWith:以某个文本开头来匹配
driver.find_element_by_android_uiautomator('new UiSelector().textStartsWith("...")')
# textMatches:正则匹配
driver.find_element_by_android_uiautomator('new UiSelector().textMatches("...")')

复制代码

2、根据resourceId定位:

find_element_by_android_uiautomator('resourceId("值")')
find_element_by_android_uiautomator('newUiSelector().resourceId("值")')

代码示例:

# 根据resourceId定位:
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("...")').click()

3、根据className定位:关键字className

代码示例:

# 根据className定位:关键字className
driver.find_element_by_android_uiautomator('new UiSelector().className("...")').click()

4、根据contenet-des定位:关键字description

代码示例:

# 根据contenet-des定位:关键字description
driver.find_element_by_android_uiautomator('new UiSelector().description("...")').click()

5、组合定位(类名和文本)

newUiSelector().className("类名").text("值")其它组合定位方式类推

代码示例:

# 组合定位(类名和文本):
driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.Button").text("7")').click()
driver.find_element_by_android_uiautomator('new UiSelector().text("8").className("android.widget.Button")').click()

6、根据元素关系定位

1)后代元素定位:
使用条件:子元素属性不定,不唯一,只能通过父元素来定位
newUiSelector().resourceId("值").childSelector(className("值").instance(数字))
其中childSelector可以传入resourceId、description等方法
instance表示匹配的结果所有元素里面的第几个元素,从0开始计数

代码示例:

# 后代元素定位
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.sky.jisuanji:id/tablelayout").childSelector(className("android.widget.Button").instance(3))').click()

2)兄弟元素定位
通过子元素找到父元素,然后通过父元素再去找兄弟元素
newUiSelector().resourceId("值").fromParent(text("值"))
fromParent()表示从元素的父元素下查找

代码示例:

# 兄弟元素定位
driver.find_element_by_android_uiautomator('new UiSelector().text("7").fromParent(text("9"))').click()
ends_with()字符串结尾比对 == 是xpath2.0的函数库、语法 而xpath1.0不存在该函数

元素定位方法介绍及应用:

Appium方法定位原生app元素:

通过appium inspector工具,可以获取元素的相关信息;在appium中提供了一系列的元素定位API,通过在这些API中输入指定的元素信息,就能完成元素定位,定位元素后就进行对元素进行自动操作。

appium中识别元素的方式有两种写法

方式一:driver.find_element_by_id(" ")

方式二:driver.find_element(By.ID," ")    -----推荐使用

基本元素定位如下:

前置条件

代码示例:

复制代码

from appium import webdriver  # 导入appium 驱动包
from appium.webdriver.webdriver import By   # 导入appium 定位的方法包


# 1、定义一个DesiredCapabilities配置的字典
des = {
    'platformName':'Android',
    'platformVersion':'6.0.1',  # 填写android虚拟机/真机的系统版本号
    'deviceName':'MuMu',      # 填写安卓虚拟机/真机的设备名称
    'appPackage':'com.sky.jisuanji',    # 填写被测app包名
    'appActivity':'.JisuanjizixieActivity',    # 填写被测app的入口
    'udid':'127.0.0.1:7555',    # 填写通过命令行 adb devices 查看到的udid
    'noReset':True,               # 重置APP
    'unicodeKeyboard':True,       # 支持中文输入
    'resetKeyboard':True,         # 支持重置键盘
    'newCommandTimeout':30        # 30秒没发送新命令就断开连接
       }

# 2、把配置的字典作为请求参数发送给appium服务器
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',des)

复制代码

1、ID定位(取resource-id、id、name)

driver.find_element(By.ID," ")

代码示例:

# ID 定位(取resource-id、id、name)
driver.find_element(By.ID,'com.sky.jisuanji:id/btn6').click()

2、class定位(取class)

driver.find_element(By.CLASS_NAME," ")

代码示例:

# class定位(取class)
driver.find_element(By.CLASS_NAME,'android.widget.Button').click()

注:class有时不是唯一的值,如计算器的数字按键6和9,它们的class都是相同的值,故class定位一般不推荐使用!

3、AccessibilityId定位(取content-desc)注:有些元素是没有content-desc的属性的

driver.find_element_by_accessibility_id('')    注:driver.find_element(By. )  新定位方法By已经没有accessibility_id的方法了

代码示例:

# AccessibilityId定位(取content-desc)
driver.find_element_by_accessibility_id('').click()

备注:其中name方式(取text)已不支持

Xpath定位方法:

xpath ==> XPATH 是一门标记语言 作用是在XML、XHTML 文档中查找元素

selenium xpath是1.0版本语法                           appium xpath是2.0版本语法

1、绝对路径:

绝对路径 xpath 绝对路径  /开头 从根节点直接一层一层定位找到元素;元素的全路径,包含了全部节点。这种方法写起来很长,效率不高;另一方面由于涉及到太多层,一旦中间任何一层有变动,那元素就定位不到了

 

代码示例:通过绝对路径知道计算机的数字按键 5 并点击

# xpath 绝对路径定位/开头 从根节点直接一层一层定位找到元素 遇到同层级相同的元素,用下标区分,下标从1开始
driver.find_element(By.XPATH,'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout[2]/android.widget.LinearLayout/android.widget.TableLayout/android.widget.LinearLayout[2]/android.widget.Button[2]').click

2、使用属性定位  

注:

appium中xpath属性定位格式:driver.find_element(By.XPATH,'//类名[@text="text值"]')

网页中xpath属性定位格式:driver.find_element(By.XPATH,'//标签[@id="id值"]')

text属性:
driver.find_element(By.XPATH,'//类名[@text="text值"]')
resource-id属性:
driver.find_element(By.XPATH,'//类名[@resource-id="属性值"]')
content-desc属性:
driver.find_element(By.XPATH,'//类名[@content-desc="属性值"]')
class属性:
driver.find_element(By.XPATH,'//类名')
多属性:
and表示并且 or表示或者
driver.find_element(By.XPATH,'//类名[@属性名="属性值" and @属性名="属性值"]')
driver.find_element(By.XPATH,'//类名[@属性名="属性值" or @属性名="属性值"]')

代码示例:

复制代码

# 使用属性 定位 //类名[@属性名="属性值"]
driver.find_element(By.XPATH,'//android.widget.Button[@resource-id="com.sky.jisuanji:id/btn8"]').click()
driver.find_element(By.XPATH,'//android.widget.Button[@text="8"]').click()
# 扩展:and/or
# //类名[@属性名1=“属性值1” and @属性名2=“属性值2”]
# //类名[@属性名1=“属性值1” or @属性名2=“属性值2”]
driver.find_element(By.XPATH,'//android.widget.Button[@text="8" and @resource-id="com.sky.jisuanji:id/btn8"]').click()
driver.find_element(By.XPATH,'//android.widget.Button[@text="8" or @bounds="sss"]').click()
# find_elements() 把满足条件的所有元素按匹配顺序放入列表 所以是先匹配到8 然后到9
els = driver.find_elements(By.XPATH,'//android.widget.Button[@text="9" or @text="8"]')
els[0].click()
els[1].click()

复制代码

备注:
1、所有元素的属性都可以进行定位,但必须该属性的值是界面上唯一的
2、xpath支持*代表任意个字符,比如find_element(By.XPATH,'//*[@text=text值]'),这种用法容易同时识别多个元素

3、使用部分属性值定位

当元素的属性值过长或者元素属性值内容中存在动态变化的情况下,可以使用该方法。

starts-with()   contains()    ends-with()--ends-with

起始位置匹配:starts-with()

driver.find_element(By.XPATH,'//类名[starts-with(@属性名,"部分属性值")]')

包含匹配:contains()

driver.find_element(By.XPATH,'//类名[contains(@属性名,"部分属性值")]')

末尾位置匹配:ends-with()   

driver.find_element(By.XPATH,'//类名[ends-with(@属性名,"部分属性值")]')

注:在selenium中没有该方法,ends-with()字符串结尾比对 ,是xpath2.0的函数库和语法,而xpath1.0不存在该函数,selenium中的xpath语法使用的是1.0语法,但是appium是使用xpath2.0及以上的语法

 代码示例:

复制代码

# 部分属性值定位  
# 1、元素属性过长 使用ends-with()方法
driver.find_element(By.XPATH,'//android.widget.Button[ends-with(@resource-id,"btn8")]').click()
# 2、动态元素  第一次打开 text="id_9" 第二次打开text="id_10" 第三次打开text="id_11"
# starts-with(@text,"id_")
driver.find_element(By.XPATH,'//android.widget.Button[starts-with(@text,"id_")]').click()

复制代码

uiautomator方法定位原生app元素:

appium在android端是调用其底层的UIAutomator2自动化测试框架去驱动自动化,在定位元素的时候,可以借助UIAutomator2的语法来实现定位。在代码实现上提供的API是find_element_by_android_uiautomator;利用android_uiautomator进行定位,语法必须属性值是双引号

1、根据text定位:

find_element_by_android_uiautomator('text("值")')
find_element_by_android_uiautomator('newUiSelector().text("值")')    # 'newUiSelector()'推荐使用

代码示例:

# 通过text定位
driver.find_element_by_android_uiautomator('text("5")').click()
# 推荐使用正规方法
driver.find_element_by_android_uiautomator('new UiSelector().text("5")').click()

text定位相关函数:
textContains:模糊匹配文本
textStartsWith:以某个文本开头来匹配
textMatches:正则匹配

代码示例:

复制代码

# text定位相关函数:
# textContains:模糊匹配文本
driver.find_element_by_android_uiautomator('new UiSelector().textContains("...")')
# textStartsWith:以某个文本开头来匹配
driver.find_element_by_android_uiautomator('new UiSelector().textStartsWith("...")')
# textMatches:正则匹配
driver.find_element_by_android_uiautomator('new UiSelector().textMatches("...")')

复制代码

2、根据resourceId定位:

find_element_by_android_uiautomator('resourceId("值")')
find_element_by_android_uiautomator('newUiSelector().resourceId("值")')

代码示例:

# 根据resourceId定位:
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("...")').click()

3、根据className定位:关键字className

代码示例:

# 根据className定位:关键字className
driver.find_element_by_android_uiautomator('new UiSelector().className("...")').click()

4、根据contenet-des定位:关键字description

代码示例:

# 根据contenet-des定位:关键字description
driver.find_element_by_android_uiautomator('new UiSelector().description("...")').click()

5、组合定位(类名和文本)

newUiSelector().className("类名").text("值")其它组合定位方式类推

代码示例:

# 组合定位(类名和文本):
driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.Button").text("7")').click()
driver.find_element_by_android_uiautomator('new UiSelector().text("8").className("android.widget.Button")').click()

6、根据元素关系定位

1)后代元素定位:
使用条件:子元素属性不定,不唯一,只能通过父元素来定位
newUiSelector().resourceId("值").childSelector(className("值").instance(数字))
其中childSelector可以传入resourceId、description等方法
instance表示匹配的结果所有元素里面的第几个元素,从0开始计数

代码示例:

# 后代元素定位
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.sky.jisuanji:id/tablelayout").childSelector(className("android.widget.Button").instance(3))').click()

2)兄弟元素定位
通过子元素找到父元素,然后通过父元素再去找兄弟元素
newUiSelector().resourceId("值").fromParent(text("值"))
fromParent()表示从元素的父元素下查找

代码示例:

# 兄弟元素定位
driver.find_element_by_android_uiautomator('new UiSelector().text("7").fromParent(text("9"))').click()
ends_with()字符串结尾比对 == 是xpath2.0的函数库、语法 而xpath1.0不存在该函数

 总结

如果你对此文有任何疑问,如果你也需要接口项目实战,如果你对软件测试、接口测试、自动化测试、面试经验交流感兴趣欢迎加入我们,加入方式在文章的最后面

  自动化测试相关教程推荐:

2023最新自动化测试自学教程新手小白26天入门最详细教程,目前已有300多人通过学习这套教程入职大厂!!_哔哩哔哩_bilibili

2023最新合集Python自动化测试开发框架【全栈/实战/教程】合集精华,学完年薪40W+_哔哩哔哩_bilibili

测试开发相关教程推荐

2023全网最牛,字节测试开发大佬现场教学,从零开始教你成为年薪百万的测试开发工程师_哔哩哔哩_bilibili

postman/jmeter/fiddler测试工具类教程推荐

讲的最详细JMeter接口测试/接口自动化测试项目实战合集教程,学jmeter接口测试一套教程就够了!!_哔哩哔哩_bilibili

2023自学fiddler抓包,请一定要看完【如何1天学会fiddler抓包】的全网最详细视频教程!!_哔哩哔哩_bilibili

2023全网封神,B站讲的最详细的Postman接口测试实战教学,小白都能学会_哔哩哔哩_bilibili

  总结:

 光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

​​​

​​​

如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。

如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步

在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。

我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,

测试开发视频教程、学习笔记领取传送门!!

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

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

相关文章

学习Redis基础篇

1.初识Redis 1.认识NoSQL 2.认识Redis 3.连接redis命令 4.数据结构的介绍 5.通用命令 2.数据类型 1.String类型 常见命令:例子:set key value

【Linux 内核源码分析】内存管理——伙伴分配器

在Linux操作系统中,内存分配通常由内核中的内存管理模块完成。以下是三个主要的内存分配器: 伙伴系统 (Buddy System):这是内核中最基本的分配器,用于分配物理内存。伙伴系统将内存块组织成不同大小的伙伴,以便有效地分…

电脑c盘太满了怎么办?5个必备的好方法~

随着我们在电脑上存储和安装越来越多的文件和程序,C盘的空间可能会迅速减少,甚至变得过于拥挤。当C盘空间不足时,会影响电脑的运行速度和性能,甚至导致系统崩溃。本文将介绍一些解决C盘空间不足问题的方法,帮助你更好地…

git中将所有修改的文件上传到暂存区

案例: 我将本地的多个文件进行了修改,导致文件发生了变化。使用git status命令,查看文件的状态,发现有多个文件是modified,即被修改了。 本地文件发生了变化,需要将modified的文件添加到暂存区&#xff0c…

【Git工具实战】实用真实 Git 开发工作流程

前言 最近工作中发现,很多开发人员连最基本的Git怎么使用都不知道,比如什么时候切分支,什么时候合并代码,代码遇到冲突怎么办,经常出现掉代码,代码合并后丢失的情况。以下为个人总结的常规Git开发工作流程…

Python实战:读取MATLAB文件数据(.mat文件)

Python实战:读取MATLAB文件数据(.mat文件) 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 👈 希望得到您的订阅…

七分钟交友匿名聊天室源码

应用介绍 本文来自:七分钟交友匿名聊天室源码 - 源码1688 简介: 多人在线聊天交友工具,无需注册即可畅所欲言!你也可以放心讲述自己的故事,说出自己的秘密,因为谁也不知道对方是谁。 运行说明&#xff…

docker镜像和容器的关系

背景 镜像和容器都是docker中非常重要的概念,镜像是静态的,而容器是动态的,两者的关系就类似类和实例的关系,本文就来分析下两者的关联 镜像和容器 我们知道镜像是存放在仓库中的静态的文件,而容器是运行中的进程&a…

厌倦了混乱的代码?掌握编写干净代码库的艺术

对于入门的开发人员来说,虽然克服了最初的障碍,学会了编程,找到了理想的工作。但其编程旅程并没有就此结束。他们面临真正的挑战:如何编写更好的代码。这不仅仅是为了完善功能,还要编写出经得起时间考验的优雅、可维护…

HTML5 Canvas 限定文本区域大小,文字自动换行,自动缩放

<!DOCTYPE html> <html> <body><h1>HTML5 Canvas 限定文本展示范围、自动计算缩放字体大小</h1><div id"tips">0</div> <div id"content">良田千顷不过一日三餐广厦万间只睡卧榻三尺良田千顷不过一日三餐…

发电机组启动前的准备和检查注意事项

发电机组启动前的准备&#xff1a; 1.检查润滑油的油位、 冷却液液位、燃油量&#xff1b; 2.检查机的供油、润滑、冷却等系统各个管路及接头有无漏油漏水现象&#xff1b; 3.检查电气线路有无破皮等漏电隐患&#xff0c;接地线电气线路是否松动&#xff0c;机组与基础的连接是…

MES系统中的手动排产和自动排产-助力生产效率

企业在排产管理中面临的问题&#xff1a; 大多数的企业在调度排产过程中&#xff0c;都会遇到以下问题。首先是插单非常的多&#xff0c;计划调整困难&#xff0c;会经常性的发生原材料、零部件的备货不足。计划按MRP或库存展示计算出需求后将产生大量工单&#xff0c;这些工单…

transformer 最简单学习1 输入层embeddings layer,词向量的生成和位置编码

词向量的生成可以通过嵌入层&#xff08;Embedding Layer&#xff09;来完成。嵌入层是神经网络中的一种常用层&#xff0c;用于将离散的词索引转换为密集的词向量。以下是一个典型的步骤&#xff1a; 建立词表&#xff1a;首先&#xff0c;需要从训练数据中收集所有的词汇&…

vue 常用库

vue-cropper 一个优雅的图片裁剪插件 dayjs Day.js 是一个轻量的处理时间和日期的 JavaScript 库&#xff0c;和 Moment.js 的 API 设计保持完全一样 NutUI-Bingo 基于 NutUI 的抽奖组件库&#xff0c;助力营销活动和小游戏场景。

java面试题之mybatis篇

什么是ORM&#xff1f; ORM&#xff08;Object/Relational Mapping&#xff09;即对象关系映射&#xff0c;是一种数据持久化技术。它在对象模型和关系型数据库直接建立起对应关系&#xff0c;并且提供一种机制&#xff0c;通过JavaBean对象去操作数据库表的数据。 MyBatis通过…

内容检索(2024.02.23)

随着创作数量的增加&#xff0c;博客文章所涉及的内容越来越庞杂&#xff0c;为了更为方便地阅读&#xff0c;后续更新发布的文章将陆续在此汇总并附上原文链接&#xff0c;感兴趣的小伙伴们可持续关注文章发布动态&#xff01; 本期更新内容&#xff1a; 1. 电磁兼容理论与实…

C语言——指针——第2篇——(第20篇)

坚持就是胜利 文章目录 一、指针和数组二、二级指针1、什么是 二级指针&#xff1f;2、二级指针 解引用 三、指针数组模拟二维数组 一、指针和数组 问&#xff08;1&#xff09;&#xff1a;指针和数组之间是什么关系呢&#xff1f; 答&#xff1a;指针变量就是指针变量&…

【spring】 ApplicationListener的使用及原理简析

文章目录 使用示例&#xff1a;原理简析&#xff1a; 前言&#xff1a;ApplicationListener 是spring提供的一个监听器&#xff0c;它可以实现一个简单的发布-订阅功能&#xff0c;用有点外行但最简单通俗的话来解释&#xff1a;监听到主业务在执行到了某个节点之后&#xff0c…

GitHub热门项目之Memos 打造私有备忘录

效果 1. 写备忘录或简单笔记&#xff0c;支持Markdown 2. 时间线 3. 探索可以看到其他用户公开的内容 项目地址 usememos/memos&#xff1a;一种开源的轻量级笔记服务。轻松捕捉和分享您的伟大想法。 (github.com)https://github.com/usememos/memos 体验地址 Memoshttp://…

精通Django模板(模板语法、继承、融合与Jinja2语法的应用指南)

模板&#xff1a; 基础知识&#xff1a; ​ 在Django框架中&#xff0c;模板是可以帮助开发者快速⽣成呈现给⽤户⻚⾯的⼯具模板的设计⽅式实现了我们MVT中VT的解耦(M: Model, V:View, T:Template)&#xff0c;VT有着N:M的关系&#xff0c;⼀个V可以调⽤任意T&#xff0c;⼀个…