uiautomator2学习4——uiautomator2的UiObject及其他

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

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 基本可以满足使用,二来留下点未知的东西说不定还可以促进自学的欲望。

继续加油吧!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值