Appium UiAutomator2驱动:平台相关的mobil
2023-08-13 本文已影响0人
Domibaba
除了标准的W3C API
接口,Uiautomator2
还提供了一系列扩展接口来支持Android
平台相关的操作。本文所有测试代码的前提是已经安装Appium
和相关环境(例如JDK
、Android SDK
、AVD
模拟器),可以参考Appium
环境搭建。
剪切板管理
1 设置剪切板内容
接口参数说明:
参数名称 | 参数类型 | 参数是否必须提供 | 描述 | 举例说明 |
---|---|---|---|---|
content |
bytearray |
yes |
待设置的剪切板内容,要转换成字节编码 | hello appium |
content_type |
string |
no |
剪切板内容的类型,目前Android 上只支持plaintext (填其他值会抛出异常),也是该接口默认值。 |
plaintext |
label |
string |
no |
标签参数,只有Android 系统才支持,默认值是空 |
None |
举例:Python
下提供了两个接口,set_clipboard
和set_clipboard_text
,两个接口区别在于set_clipboard_text
入参的内容是string
类型,转换成bytes
类型后,以content_type
为plaintext
对set_clipboard
进行调用的版本。
# -*- coding: utf-8 -*-
import pytest
import base64
from appium import webdriver
from appium.options.android import UiAutomator2Options
from appium.webdriver.appium_service import AppiumService
from appium.webdriver.clipboard_content_type import ClipboardContentType
# 开启服务端
APPIUM_HOST = '127.0.0.1'
APPIUM_PORT = 4723
@pytest.fixture(scope="session")
def start_appium_service():
server = AppiumService()
server.start(args=['--address', APPIUM_HOST, '-p', str(APPIUM_PORT)], timeout_ms=60000)
yield server
server.stop()
# 创建客户端到服务端的会话
def create_appium_session_by_api(custom_opts = None, appium_host = APPIUM_HOST, appium_port = APPIUM_PORT):
options = UiAutomator2Options()
if custom_opts is not None:
options.load_capabilities(custom_opts)
return webdriver.Remote(f'http://{appium_host}:{appium_port}', options=options)
def test_set_clipboard(start_appium_service):
custom_opts = {
"appium:avd": "testPhone",
}
driver = create_appium_session_by_api(custom_opts)
data = "hello appium"
driver.set_clipboard(data.encode('utf-8')) # 注意要将string类型转换成bytes类型
driver.quit()
执行完后,在模拟器上可以看到剪切板的内容。
2 获取剪切板内容
接口参数说明:
参数名称 | 参数类型 | 参数是否必须提供 | 描述 | 举例说明 |
---|---|---|---|---|
content_type |
string |
no |
剪切板内容的类型,目前Android 上只支持plaintext (填其他值会抛出异常),也是该接口默认值。 |
plaintext |
该接口返回的是被测设备剪贴板经过base64
编码后的内容。
举例:Python
下提供了两个接口,get_clipboard
和get_clipboard_text
,两个接口区别在于:get_clipboard
返回的是字节编码流,而get_clipboard_text
是使用content_type
为plaintext
对get_clipboard
进行调用,并且将获取到的字节编码流使用decode("utf-8")
进行解码的版本。
def test_get_clipboard(start_appium_service):
custom_opts = {
"appium:avd": "testPhone",
}
driver = create_appium_session_by_api(custom_opts)
data = "hello android"
driver.set_clipboard_text(data) # 类型是string
content_bytes = driver.get_clipboard(ClipboardContentType.PLAINTEXT)
assert content_bytes.decode('UTF-8') == data
assert driver.get_clipboard_text() == data
driver.quit()