元素定位操作 API
学习目标
- 能够分别使用 id、class、xpath 定位某一个元素
- 能够分别使用 id、class、xpath 定位某一组元素
一. 元素定位操作 API
应用场景
计算机不像人一样 ”聪明“,我们需要通过元素定位来获取元素,才能让计算机帮我们 ”操作“ 这个元素。
步骤
- 打开 uiautomatorviewer 工具
- 打开模拟器或真机
- 通过 uiautomatorviewer 工具获取想要进行操作的元素的 Node Detail 信息
- 通过元素定位 API 进行定位
- 对元素进行相关操作
注意点
元素的定位基于当前屏幕范围内展示的可见元素。
1.1 定位一个元素【掌握】
应用场景
想要对按钮进行点击,想要对输入框进行输入,想要获取文本框的内容,定位元素是自动化操作必须要使用的方法。只有获取元素之后,才能对这个元素进行操作。
方法名
# 通过id定位一个元素
# 参数:
# id_value:元素的resource-id属性值
# 返回值:
# 定位到的单个元素
driver.find_element_by_id(id_value)
# 通过class_name定位一个元素
# 参数:
# class_value:元素的class属性值
# 返回值:
# 定位到的单个元素
driver.find_element_by_class_name(class_value)
# 通过xpath定位一个元素
# 参数:
# xpath_value:定位元素的xpath表达式
# 返回值:
# 定位到的单个元素
driver.find_element_by_xpath(xpath_value)
示例
通过 id 的形式,定位 ”放大镜“ 按钮,并点击
通过 class 的形式,定位 ”输入框“,输入 ”hello“
通过 xpath 的形式,定位 ”返回“ 按钮,并点击
关键代码
driver.find_element_by_id("com.android.settings:id/search").click()
driver.find_element_by_class_name("android.widget.EditText").send_keys("hello")
driver.find_element_by_xpath("//*[@content-desc='收起']").click()
小结
- find_element_by_id 方法中传入的是 Node Detail 信息中的 resource-id
- find_element_by_class_name 方法中传入的是 Node Detail 信息中的 class
- find_element_by_xpath 方法中传入的是 Node Detail 信息中的 xpath表达式
注意点
如果很多元素的 “特征” 相同,使用 find_element_by_xxx 的方法会找到第一个
1.2 定位一组元素【掌握】
应用场景
和定位一个元素相同,但如果想要批量的获取某个相同特征的元素,使用定位一组元素的方式更加方便。
方法名
# 通过id定位一组元素
# 参数:
# id_value:元素的resource-id属性值
# 返回值:
# 列表,定位到的所有符合调价你的元素
driver.find_elements_by_id(id_value)
# 通过class_name定位一组元素
# 参数:
# class_value:元素的class属性值
# 返回值:
# 列表,定位到的所有符合调价你的元素
driver.find_elements_by_class_name(class_value)
# 通过xpath定位一组元素
# 参数:
# xpath_value:定位元素的xpath表达式
# 返回值:
# 列表,定位到的所有符合调价你的元素
driver.find_elements_by_xpath(xpath_value)
示例
通过 id 的形式,获取所有 resource-id 为 ”com.android.settings:id/title“ 的元素,并打印其文字内容
通过 class_name 的形式,获取所有class 为 ”android.widget.TextView“ 的元素,并打印其文字内容
通过 xpath 的形式,获取所有包含 ”设“ 的元素,并打印其文字内容
关键代码
titles = driver.find_elements_by_id("com.android.settings:id/title")
for title in titles:
print(title.text)
text_views = driver.find_element_by_class_name("android.widget.TextView")
for text_view in text_views:
print(text_view.text)
elements = driver.find_element_by_xpath("//*[contains(@text,'设')]")
for element in elements:
print(element.text)
1.3 定位元素的注意点【了解】
应用场景
了解这些注意点可以以后在出错误的时候,更快速的定位问题原因。
示例
使用 find_element_by_xx 或 find_elements_by_xx 的方法,分别传入一个没有的 ”特征“ 会是什么结果呢?
核心代码
driver.find_element_by_id("xxx")
driver.find_elements_by_id("xxx")
小结
- 如果使用 find_element_by_xx 方法,如果传入一个没有的特征,会报NoSuchElementException
的错误。 - 如果使用 find_elements_by_xx 方法,如果传入一个没有的特征,不会报错,会返回一个空列表