目录
元素定位操作
应用场景
计算机不像人一样“聪明”,我们需要通过元素定位来获取元素,才能让计算机帮我们“操作“这个元素。
步骤
1.打开uiautomatorviewer工具或者命令行输入uiautomatorviewer
2.打开模拟器或真机
3.通过uiautomatorviewer工具获取想要进行操作的元素的Node Detail 信息
4.通过元素定位API进行定位
5.对元素进行相关操作
注意点
元素的定位基于当前屏幕范围内展示的可见元素。
定位一个元素
应用场景
想要对按钮进行点击,想要对输入框进行输入,想要获取文本框的内容,定位元素是自动化操作必须要使用的方法。只有获取元素之后,才能对这个元素进行操作。
注意点
#find_element_by_*方法被弃用
#导入模块
from selenium.webdriver.common.by import By
方法名
#通过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)
Demo
#点击搜索
driver.find_element(By.ID,"com.android.settings:id/search").click()
#输入hello
driver.find_element(By.CLASS_NAME,"android.widget.EditText").send_keys("hello")
#点击返回
driver.find_element(By.XPATH,"//*[@content-desc='收起']").click()
定位一组元素
#获取resource-id为"android:id/title"的元素,并打印出文字内容
titles = driver.find_elements(By.ID, "android:id/title")
for title in titles:
print(title.text)
#获取class为"android.widget.TextView"的元素,并打印出文字内容
text_views = driver.find_elements(By.CLASS_NAME,"android.widget.TextView")
for text_view in text_views:
print(text_view.text)
#通过xpath形式获取包含‘设’的元素,并打印出文字内容
eles = driver.find_elements(By.XPATH,"//*[contains(@text,'设')]")
for element in eles:
print(element.text)
注意点
-
如果通过一组的方式进行定位,获取的返回值不再是一个元素。而是一个列表,列表中装着所有符合这个特征的元素。
-
如果find_element方法,传入了一个没有的条件,会报错,NoSuchElementException
-
如果find_elements方法,传入了一个没有的条件,不会报错,返回一个空列表
元素等待
应用场景
可能由于一些原因,我们想找的元素并没有立刻出来,此时如果直接定位可能会报错
原因:
-
由于网络速度原因
-
服务器处理请求原因
-
电脑配置原因
概念
WebDriver定位页面元素时如果未找到,会在指定时间内一直等待的过程
元素等待一共分为两种类型
-
隐式等持
-
显式等待
隐式等待
应用场景
针对所有定位元素的超时时间设置为同一个值的时候
概念
等待元素加载指定的时长,超出时长抛出NoSuchElementException异常
步骤
- 在获取driver対象后,使用driver调用implicitly_wait方法即可
- 设置超时时间
作用
- 在设置了超时时间之后,后续所有的定位元素的方法都会在这个时间内等待元素的出现
- 如果出现了,直接进行后续操作
- 如果没有出现,报错,NoSuchElementException
Demo
driver.implicitly_wait(10)
print("---start")
driver.find_element(By.XPATH,"//*[@content-desc='收起']").click()
print("---stop")
显式等待
应用场景
针对所有定位元素的超时时间设置为不同的值的时候
概念
等待元素加载指定的时长,超出时长抛出TimeoutException异常
步骤
-
导包from selenium.webdriver.support.wait import WebDriverWait
-
创建WebDriverWait 对象
-
调用WebDriverWait对象的until方法
作用
- 在设置了显示等待之后,可以等待一个超时时间,在这个超时时间之内进行查找,默认每0.5秒找一次
- 0.5秒的频率是可以设置的
- 一但找到这个元素,直接进行后续操作
- 如果没有找到,报错,TimeOutException
示例
在5秒钟内,每1秒在《设置》程序中的“返回”按钮,如果找到则点击。如果找不到则观察对应错误信息。
Demo
WebDriverWait(driver,5,1).until(lambda x:x.find_element(By.XPATH,"//*[@content-desc='收起']")).click()
隐式等待和显式等待的选择
作用域
- 显式等待为单个元素有效
- 隐式为全局元素
方法
- 显式等待方法封装在WebDriverWait类中
- 隐式等待则直接通过driver实例化对象调用
关于sleep的形式
-
sleep是固定死一个时间,不是不行,是不推荐。
-
元素等待可以让元素出来的第一时间进行操作。sleep可能造成不必要的浪费。
元素操作API
点击元素
应用场景
需要点击某个按钮的时候使用
方法名
#对element按钮进行点击操作
element.click()
示例
- 打开《设置》
- 点击放大镜按钮
核心代码
driver.find_element(By.ID,"com.android.settings:id/search").click()
输入和清空输入框内容
应用场景
需要对输入框进行输入或清空的时候使用
方法名
# 对element输入框进行输入操作
#参数
# value:输入的内容
element.send_keys(value)
#对element输入框进行清空操作
element.clear()
示例
1.打开《设置》
2.点击“放大镜”
3.输入"hello"
4.暂停2秒
5.清空所有文本内容
6.暂停5秒
7.输入“你好”
核心代码
try:
# 连接到设备
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_capabilities)
# 程序等待
sleep(2)
# 2.点击“放大镜”
driver.find_element(By.ID,"com.android.settings:id/search").click()
# 3.输入"hello"
driver.find_element(By.ID,"android:id/search_src_text").send_keys("hello")
# 4.暂停2秒
sleep(2)
# 5.清空所有文本内容
driver.find_element(By.ID,"android:id/search_src_text").clear()
# 6.暂停5秒
sleep(5)
# 7.输入“你好”
driver.find_element(By.ID,"android:id/search_src_text").send_keys("你好")
except Exception as e:
print("出现异常,错误信息为:{}".format(e))
注意点
输入中文需要加入两个参数
"unicodeKeyboard": True,
"resetKeyboard": True
获取元素的文本内容
应用场景
需要获取按钮、文本框、输入框等控件的文本内容时使用
属性名
#获取element控件的文本内容
#返回值:
#控件的文本内容
element.text
示例
1.打开《设置》
2.获取所有resource-id为“android:id/title"的元素,井打印其文字内容
核心代码
eles = driver.find_elements(By.ID,'android:id/title')
for i in eles:
print(i.text)
获取元素的位置和大小
应用场景
需要获取元素的位置和大小的时候使用
属性名
#获取element的位置
#返回值:
#字典,x为元素的x坐标,y为元素的y坐标
element.location
#获取element的大小
#返回值:
#字典,width为宽度,height为高度
element.size
示例
1.打开《设置》
2.获取“放大镜”的位置和大小
核心代码
search_button = driver.find_element(By.ID,"com.android.settings:id/search")
print(search_button.location)
print(search_button.location["x"])
print(search_button.location["y"])
print(search_button.size)
print(search_button.size["width"])
print(search_button.size["height"])
获取元素的属性值
应用场景
根据特征定位到元素,使元素的属性名获取对应的属性值
方法名
#对element进行点击操作
#参数:
# value:要获取的属性名
#返回值:
#根据属性名得到的属性值
element.get_attribute(value)
#value:元素的属性
示例
1.打开《设置》
2.获取所有resource-id为"android:id/title”的元素
3.使用get_attribute获取这些元素的enabled、text、content-desc、resource-id、class的属性值
核心代码
eles = driver.find_elements(By.ID, 'android:id/title')
for i in eles:
print(i.get_attribute("enabled"))
print(i.get_attribute("clickable"))
print(i.get_attribute("text"))
#获取resource-id的属性值
print(i.get_attribute("resourceId"))
#获取class的属性值
print(i.get_attribute("className"))
#获取content-desc的属性值
print(i.get_attribute("name"))
注意点
-
value='text'返回text的属性值
-
value='name'返回content-desc / text属性值
-
value='className'返回class属性值,只有APl=>18才能支持
-
value='resourceId'返回resource-id属性值,只有APl=>18才能支持
总结
- 点击事件
- 关键属性:click
- 输入事件
- 关键属性:send_keys
- 获取元素的文本内容
- 关键属性:text
- 清空输入内容
- 关键属性:clear
- 获取元素位置
- 关键属性:location
- 获取元素大小
- 关键属性:size
- 获取元素的属性值
- 关键属性:get_attribute