提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
uiautomator2学习4——uiautomator2的UiObject
上一篇讲到 Device 是模拟设备的操作的,但是点击、长按这种需要坐标来定位,不能很好地兼容性。因此需要用 UiObject 来协助定位元素。
UiObject 介绍
之前讲到 调用 Device 的__call__方法就会调用,源码如下。
def __call__(self, **kwargs):
return UiObject(self, Selector(**kwargs))
看源码可以得知,调用__call__方法是没有说明特定的传入参数,所以 d(resourceId=“xxxx”) 里传入的参数可以不是 resourceId ,但 resourceId 作为唯一值,所以常以 resourceId 来定位。
UiObject 的方法
- 检查特定的UI对象是否存在
# 源码
exists()
# 无需传参
# 返回:bool类型
# 示例:
d(resourceId="com.taobao.taobao:id/searchbtn").exits()
- UI对象的信息
# 源码
info()
# 无需传参
# 返回:UI对象的信息
# 示例:
d(resourceId="com.taobao.taobao:id/searchbtn").info()
- 截图
# 源码
screenshot() -> Image.Imag
# 无需传参
# 返回:Image.Imag类型内容
# 示例:
d(resourceId="com.taobao.taobao:id/searchbtn").screenshot()
- 点击
# 源码
click(timeout=None, offset=None)
# 参数:
# timeout:等待元素展示所需的时长,选填参数,默认为None;
# offset:以UI对象界面为点击范围的点击坐标,默认是(0.5, 0.5),即该UI上下左右居中点。选填参数,这里默认为None,实际默认是(0.5, 0.5)。
# 示例:
d(resourceId="com.taobao.taobao:id/searchbtn").click()
- 获取UI对象的界限
# 源码
bounds()
# 无需传参
# 返回:返回左上角的x、y轴坐标和右下角的x、y轴坐标,共4个值
示例:
d(resourceId="com.taobao.taobao:id/searchbtn").bounds()
- 根据UI对象范围百分比返回像素坐标
# 源码
center(offset=(0.5, 0.5))
# 参数:
# offset:如(0, 0) 则定位UI对象左上角, (0.5, 0.5) 则定位UI对象正中的位置,选填参数,默认为(0.5, 0.5)。
# 返回:返回UI对象指定位置的像素坐标
# 示例:
d(resourceId="com.taobao.taobao:id/searchbtn").center()
- 多次点击UI对象
# 源码
click_gone(maxretry=10, interval=1.0)
# 参数:
# maxretry:最大的点击次数,选填参数,默认为10
# interval:每次点击之间的时间间隔,选填参数,默认为1.0
# 返回:点击结束或者对象消失返回False
# 示例:
d(resourceId="com.taobao.taobao:id/searchbtn").click_gone()
- 点击UI对象
# 源码
click_exists(timeout=0)
# 参数:
# timeout:等待时长,选填参数,默认为0。
# 返回:点击成功返回True,触发了UI对象找不到的异常则返回False。
# 示例:
d(resourceId="com.taobao.taobao:id/searchbtn").click_exists()
- 长按UI对象
# 源码
long_click(duration: float = 0.5, timeout=None)
# 参数:
# duration:长按时长,单位秒;
# timeout:等待元素的时长,单位秒。
# 示例:
d(resourceId="com.taobao.taobao:id/searchbtn").long_click()
- 滑动
# 源码
swipe(direction, steps=10)
# 参数:
# direction:滑动方向,从("left", "right", "up", "down")中获取一个,必填参数;
# steps:移动步数,一步约5ms,选填参数,默认为10。
# 示例:
d(resourceId="com.taobao.taobao:id/searchbtn").swipe("left")
- 等待UI元素的出现或消失
# 源码
wait(exists=True, timeout=None)
# 参数:
# exist:如为True,则等待其出现;如为False则反之,选填参数,默认为True。
# timeout:等待时长,单位秒,选填参数,默认为None。
# 示例:
d(text="Clock").wait()
d(text="Settings").wait(exists=False) # 等待该元素消失
- 等待UI元素消失
# 源码
wait_gone(timeout=None)
# 参数:
# timeout:等待时长,单位秒。选填参数,默认为None。
# 返回:返回元素消失的布尔值
# 示例:
d(text="Clock").wait_gone()
- 输入文本
# 源码
send_keys(text)
set_text(text, timeout=None)
# 参数:
# text:输入内容,必填参数。
# timeout:等待时长,单位秒。选填参数,默认为None。
# 示例:
d(resourceId="com.taobao.taobao:id/searchEdit").send_keys("Clock")
send_keys 和 set_text可以说是一样的,因为 send_keys 调用 set_text 的逻辑
def send_keys(self, text): """ alias of set_text """ return self.set_text(text)
- 获取文本内容
# 源码
get_text(timeout=None)
# 参数:
# timeout:等待时长,单位秒。
# 返回:返回字段文本
# 示例:
d(resourceId="com.taobao.taobao:id/searchEdit").get_text()
- 清空内容
# 源码
clear_text(timeout=None) # 逻辑是调用set_text(None)
# 参数:
# timeout:等待时长,单位秒。选填参数,默认为None。
# 示例:
d(resourceId="com.taobao.taobao:id/searchEdit").clear_text()
其他
除了 Device 和 UiObject 外,其实还有 XPath 、Watcher等类型。
Device调用源码如下:
@cached_property
def watcher(self) -> Watcher:
return Watcher(self)
@cached_property
def xpath(self) -> xpath.XPath:
return xpath.XPath(self)
XPath 与 UiObject 有些类似,但是 XPath 是由 Device.xpath 返回,且同时 XPath 也有 __call__方法
class XPath(object):
......
def __call__(self, xpath: str, source=None):
# print("XPATH:", xpath)
return XPathSelector(self, xpath, source)
所以常看到有类似这样的写法
d.xpath('//*[@content-desc="搜索栏"]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]').click()
如果有学习过 selenium 的话,会了解到其中一个元素定位的方法就是通过xpath来定位的,而这里 XPath.__call__方法传入的参数 xpath 与前者大致相同,也是通过xpath来定位元素的。
XPath 的具体方法和 Watcher 作者就不多介绍了,一来前面 Device 和UiObject 基本可以满足使用,二来留下点未知的东西说不定还可以促进自学的欲望。
继续加油吧!