基础自动化¶
本章节为您描述 FIRERPA 提供的自动化基础功能,当然还有更进阶的功能将在后续章节描述,本章为您介绍常用的一些基础功能接口。
获取设备信息¶
获取当前设备信息,如设备名称、屏幕大小、屏幕方向和当前应用等信息。
d.device_info()
>>> d.device_info()
productName: "bumblebee"
sdkInt: 34
displayHeight: 2400
displaySizeDpX: 411
displaySizeDpY: 914
displayWidth: 1080
screenOn: true
naturalOrientation: true
currentPackageName: "com.android.launcher3"
>>> result = d.device_info()
>>> print (result.displayWidth)
1080
获取服务信息¶
获取当前服务的版本、设备唯一ID、ABI 等信息。
d.server_info()
>>> d.server_info()
uniqueId: "673abbe0-ff7b-9d82-1792-8876cb72cf56"
version: "9.25"
architecture: "arm64-v8a"
uptime: 293
secure: false
备注
version、secure 等字段以 d.server_info() 实际输出为准。未启用 服务证书 时,secure 通常为 false。
>>> result = d.server_info()
>>> print (result.secure)
False
屏幕息屏¶
以下接口将会使当前的手机屏幕息屏,相当于您在亮屏的情况下按一下电源键的效果。
d.sleep()
屏幕亮屏¶
以下接口将会使当前的手机屏幕点亮,相当于您在息屏的情况下按一下电源键的效果。
d.wake_up()
屏幕是否点亮¶
您可以通过如下接口检查当前设备的屏幕是否是点亮的状态,以便判断是否可以操作。
d.is_screen_on()
屏幕是否锁定¶
您可以通过如下接口检查当前设备屏幕是否处于锁定状态,以便判断是否可以操作。
d.is_screen_locked()
显示 Toast¶
您可以使用如下接口,在手机的界面上显示一条 Hello from Lamda! 的 Toast 消息。
d.show_toast("Hello from Lamda!")
读取剪切板¶
以下接口用于读取手机当前剪切板的内容,暂时不支持 Android 10+。
d.get_clipboard()
写入剪切板¶
以下接口用于向当前设备的剪切板写入内容。
d.set_clipboard("剪切板内容")
物理按键¶
您可以使用下面的方法来执行模拟按键的操作,支持如 KEY_BACK、KEY_DOWN、KEY_HOME 等十余种按键。
d.press_key(Keys.KEY_BACK)
d.press_key(Keys.KEY_CAMERA)
d.press_key(Keys.KEY_CENTER)
d.press_key(Keys.KEY_DELETE)
d.press_key(Keys.KEY_DOWN)
d.press_key(Keys.KEY_ENTER)
d.press_key(Keys.KEY_HOME)
d.press_key(Keys.KEY_LEFT)
d.press_key(Keys.KEY_MENU)
d.press_key(Keys.KEY_POWER)
d.press_key(Keys.KEY_RECENT)
d.press_key(Keys.KEY_RIGHT)
d.press_key(Keys.KEY_SEARCH)
d.press_key(Keys.KEY_UP)
d.press_key(Keys.KEY_VOLUME_DOWN)
d.press_key(Keys.KEY_VOLUME_MUTE)
d.press_key(Keys.KEY_VOLUME_UP)
同时,为了支持其他更多的按键,也可以使用这个方法来模拟。您可以在安卓官方文档内找到所有支持的按键名称:https://developer.android.com/reference/android/view/KeyEvent。
d.press_keycode(KeyCodes.KEYCODE_CALL)
屏幕截图¶
我们提供了屏幕截图的方法,这样您可以记录流程或做一些图像识别操作。以下示例演示了如何截取清晰度为 60 的图像,并将其保存为当前目录下的 screenshot.png 文件。
d.screenshot(60).save("screenshot.png")
>>> result = d.screenshot(60)
>>> result
<lamda.types.BytesIO object at 0x7a28361d60>
>>> result.save("screenshot.png")
52917
>>> result.getvalue()
b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01....'
目前,我们也支持区域和元素截图。元素截图并不在本章内介绍,这里为您介绍区域截图。您需要了解区域的概念和定义:在我们的接口中,区域以 Bound 来定义,它包含四个参数 top、left、right、bottom。安卓屏幕与常规坐标系不同,当前设备屏幕的左上角为原点,它的坐标为 x=0, y=0。假设当前屏幕为竖屏,分辨率 1080×1920,那么如果要截取一个全屏的区域截图,您可以这样做:
d.screenshot(60, bound=Bound(top=0, left=0, right=1080, bottom=1920)).save("screenshot.png")
这样将会产生一张全屏截图,当然这并没有必要,因为默认就是全屏截图。那么如果我们想要截取一张位于左上角的 200×200 的图像,该怎么做呢?这也很简单,您只需要像下面这样操作:
d.screenshot(60, bound=Bound(top=0, left=0, right=200, bottom=200)).save("screenshot.png")
在这里,我们需要介绍这几个参数的意义:top 代表从 Y 轴向下偏移 top 个像素,bottom 代表从 Y 轴向下偏移 bottom 个像素,left 和 right 代表从 X 轴向右偏移的像素数。其中 top 始终小于 bottom,left 始终小于 right。下面我们再演示一个例子:截取屏幕右下角 200×200 的图像,您只需要像下面这样调用接口:
d.screenshot(60, bound=Bound(top=1920-200, bottom=1920, left=1080-200, right=1080)).save("screenshot.png")
点击屏幕上的一个点¶
您可以通过如下接口来模拟点击屏幕。在示例中,我们点击了屏幕上坐标为 (100, 100) 的点。
d.click(Point(x=100, y=100))
点按点A并将其拖动到点B¶
通过如下接口可以实现将点 A 处的对象拖动到点 B,例如将图标拖动到文件夹等操作。
A = Point(x=100, y=100)
B = Point(x=500, y=500)
d.drag(A, B)
从点A滑动到点B¶
通过如下接口可以实现从屏幕坐标 (100, 100) 滑动到 (500, 500)。
A = Point(x=100, y=100)
B = Point(x=500, y=500)
d.swipe(A, B)
稍复杂的多点滑动¶
如下接口可以模拟多点滑动。例如,以下调用将会从 (100, 100) 滑动到 (500, 500) 并回到 (200, 200)。下面的演示中只滑动了三个点,实际上您可以提供更多的点位,甚至实现九宫格解锁。
p1 = Point(x=100, y=100)
p2 = Point(x=500, y=500)
p3 = Point(x=200, y=200)
d.swipe_points(p1, p2, p3)
打开快捷设置¶
如下调用可以打开快捷设置面板,但仅会展开一半(半开状态)。
d.open_quick_settings()
打开通知栏¶
如下调用可以打开屏幕上的通知栏。
d.open_notification()
获取页面布局¶
如下调用可以获取当前页面的 XML 布局,您也可以自行解析来支持 xpath 自动化。
d.dump_window_hierarchy()
>>> result = d.dump_window_hierarchy()
>>> result
<lamda.types.BytesIO object at 0x7add660680>
>>> result.getvalue()
b'<?xml version=\'1.0\' encoding=\'UTF-8\' standalone=\'yes\' ?>\r\n<hierarchy rotation="0">\r\n <node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false"...
等待窗口静止¶
您可以执行如下调用以等待当前窗口进入静止状态,类似于 Selenium 的 implicitly_wait。参数的单位是毫秒,5*1000 表示等待 5000 毫秒(即 5 秒)。
d.wait_for_idle(5*1000)
获取最近的 Toast¶
您可以执行如下调用以获取系统中的最近一条 Toast 消息。但请注意,仅支持通过系统 API 发送的 Toast 消息,第三方实现的类 Toast UI 消息无法获取。
d.get_last_toast()
>>> result = d.get_last_toast()
>>> print (result)
timestamp: 1700000000000
package: "com.android.settings"
message: "\346\202\250\345\267\262\345\244\204\344\272\216\345\274\200\345\217\221\350\200\205\346\250\241\345\274\217\357\274\214\346\227\240\351\234\200\350\277\233\350\241\214\346\255\244\346\223\215\344\275\234\343\200\202"
>>> print (result.message)
您已处于开发者模式,无需进行此操作。