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

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

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.hqwc.cn/news/486880.html

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

相关文章

Linux设备模型(二) - kset/kobj/ktype APIs

一,kobject_init_and_add 1,kobject_init_and_add实现 /** * kobject_init_and_add() - Initialize a kobject structure and add it to * the kobject hierarchy. * kobj: pointer to the kobject to initialize * ktype: p…

Vue3 + Ts (使用lodash)

安装 npm i --save lodash使用 import _ from lodash⚠️报警告:!!! 此时还需要安装ts声明文件库 npm install types/lodash -D安装之后重启Vscode还是会提示上面的警告,此时还需在tsconfig.ts里面配置 {"c…

【力扣 - 搜索插入位置】

题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 题解1 int searchInsert(int* nums, int numsSize, in…

harbor(docker仓库)仓库部署 - 高可用

harbor(docker仓库)仓库部署 - 高可用 1. harbor高可用1.1 方案说明1. 双主复制2. 多harbor实例共享后端存储 1.2 部署高可用(多harbor实例共享后端存储)1. 服务器划分2. 安装harbor(先部署一套Harbor,用于…

Python代码实现2024年刘谦春晚魔术

import randomdef main():# 扑克牌随机抽取4张牌playingCards [A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K]cardTackA []for i in range(4):k random.choice(playingCards)cardTackA.append(k)# 将抽取的4张牌随机打乱cnt 0while cnt < 100:random.shuffle(cardTackA)cnt …

企业级人脸美颜和美妆解决方案

视觉营销日益重要&#xff0c;而人脸美颜和美妆作为视觉营销的关键环节&#xff0c;更是受到了众多企业的关注。美摄科技&#xff0c;作为国内领先的人脸美颜和美妆解决方案提供商&#xff0c;以其先进的技术和卓越的产品&#xff0c;助力企业打造完美视觉体验&#xff0c;提升…

快速学习安全框架 Springsecurity最新版(6.2)--用户授权模块

简介 上一节Springsecurity 用户认证 Springsecurity 拥有强大的认证和授权功能并且非常灵活&#xff0c;,一来说我们都i有以下需求 可以帮助应用程序实现以下两种常见的授权需求&#xff1a; 用户-权限-资源&#xff1a;例如张三的权限是添加用户、查看用户列表&#xff0c;李…

星宸科技SSC369G 双4K高性价比AI IPC方案

一、方案描述 SSC369G 双4K高性价比AI IPC方案采用主芯片SSC369G&#xff0c;内核为CA55四核最高主频为1.5Ghz处理器。SOC内置集成一个64位的四核RISC处理器&#xff0c;先进的图像信号处理器&#xff08;ISP&#xff09;&#xff0c;高性能的H.265/H.264/MJPEG视频编解码器&a…

5个精美的wordpress中文企业主题模板

元宇宙WordPress主题模板 简洁大气的元宇宙 Metaverse WordPress主题模板&#xff0c;适合元宇宙行业的企业官网使用。 https://www.jianzhanpress.com/?p3292 职业技术培训WordPress主题模板 简洁大气的职业技术培训WordPress主题&#xff0c;适合用于搭建教育培训公司官方…

宏观视角下的浏览器

宏观视角下的浏览器 Chrome架构线程 VS 进程进程架构 TCP协议IP&#xff1a;把数据包送达目的主机UDP&#xff1a;把数据包送达应用程序TCP&#xff1a;把数据完整地送达应用程序 HTTP请求流程构建请求查找缓存准备IP地址和端口等待TCP队列建立TCP连接发送HTTP请求 服务器端处理…

【Flink集群RPC通讯机制(四)】集群组件(tm、jm与rm)之间的RPC通信

文章目录 1. 集群内部通讯方法概述2. TaskManager向ResourceManager注册RPC服务3. JobMaster向ResourceManager申请Slot计算资源 现在我们已经知道Flink中RPC通信框架的底层设计与实现&#xff0c;接下来通过具体的实例了解集群运行时中组件如何基于RPC通信框架构建相互之间的调…

vue3 vite 经纬度逆地址解析

在web端测试经纬度逆地址解析有2中方式&#xff0c;先准备好两个应用key 第一种&#xff0c;使用“浏览器端”应用类型 const address ref() const latitude ref() // 经度 const longitude ref() // 纬度 const ak 你的key // 浏览器端 function getAddressWeb() {// 创建…