feat: publish workphone SDK deployment and API docs
This commit is contained in:
232
sdk/test_emulator.py
Normal file
232
sdk/test_emulator.py
Normal file
@@ -0,0 +1,232 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
工作手机SDK v3.0 - 模拟器测试脚本
|
||||
直接使用ADB命令控制模拟器
|
||||
"""
|
||||
|
||||
import subprocess
|
||||
import time
|
||||
import base64
|
||||
import json
|
||||
import urllib.request
|
||||
|
||||
SDK_URL = "http://localhost:8899"
|
||||
DEVICE_SERIAL = "emulator-5554"
|
||||
|
||||
|
||||
def adb_shell(cmd: str) -> str:
|
||||
"""执行ADB shell命令"""
|
||||
result = subprocess.run(
|
||||
["adb", "-s", DEVICE_SERIAL, "shell", cmd],
|
||||
capture_output=True,
|
||||
text=True
|
||||
)
|
||||
return result.stdout.strip()
|
||||
|
||||
|
||||
def adb_tap(x: int, y: int):
|
||||
"""点击坐标"""
|
||||
adb_shell(f"input tap {x} {y}")
|
||||
|
||||
|
||||
def adb_swipe(x1: int, y1: int, x2: int, y2: int, duration: int = 500):
|
||||
"""滑动"""
|
||||
adb_shell(f"input swipe {x1} {y1} {x2} {y2} {duration}")
|
||||
|
||||
|
||||
def adb_input_text(text: str):
|
||||
"""输入文字"""
|
||||
# 转义特殊字符
|
||||
escaped = text.replace(" ", "%s").replace("'", "\\'")
|
||||
adb_shell(f"input text '{escaped}'")
|
||||
|
||||
|
||||
def adb_screenshot() -> bytes:
|
||||
"""截图"""
|
||||
result = subprocess.run(
|
||||
["adb", "-s", DEVICE_SERIAL, "exec-out", "screencap", "-p"],
|
||||
capture_output=True
|
||||
)
|
||||
return result.stdout
|
||||
|
||||
|
||||
def adb_start_app(package: str):
|
||||
"""启动APP"""
|
||||
adb_shell(f"monkey -p {package} -c android.intent.category.LAUNCHER 1")
|
||||
|
||||
|
||||
def adb_current_app() -> str:
|
||||
"""获取当前APP"""
|
||||
output = adb_shell("dumpsys window | grep -E 'mCurrentFocus'")
|
||||
return output
|
||||
|
||||
|
||||
def sdk_api(path: str, method: str = "GET", data: dict = None) -> dict:
|
||||
"""调用SDK API"""
|
||||
url = f"{SDK_URL}{path}"
|
||||
|
||||
if data:
|
||||
req = urllib.request.Request(
|
||||
url,
|
||||
data=json.dumps(data).encode(),
|
||||
headers={"Content-Type": "application/json"},
|
||||
method=method
|
||||
)
|
||||
else:
|
||||
req = urllib.request.Request(url, method=method)
|
||||
|
||||
try:
|
||||
with urllib.request.urlopen(req, timeout=10) as resp:
|
||||
return json.loads(resp.read().decode())
|
||||
except Exception as e:
|
||||
return {"error": str(e)}
|
||||
|
||||
|
||||
def test_sdk_health():
|
||||
"""测试SDK健康"""
|
||||
print("=" * 50)
|
||||
print("测试1: SDK健康检查")
|
||||
result = sdk_api("/health")
|
||||
print(f"结果: {result}")
|
||||
return result.get("status") == "healthy"
|
||||
|
||||
|
||||
def test_device_info():
|
||||
"""测试获取设备信息"""
|
||||
print("=" * 50)
|
||||
print("测试2: 获取设备信息")
|
||||
|
||||
model = adb_shell("getprop ro.product.model")
|
||||
version = adb_shell("getprop ro.build.version.release")
|
||||
size = adb_shell("wm size")
|
||||
|
||||
print(f"型号: {model}")
|
||||
print(f"Android版本: {version}")
|
||||
print(f"屏幕: {size}")
|
||||
return True
|
||||
|
||||
|
||||
def test_screenshot():
|
||||
"""测试截图"""
|
||||
print("=" * 50)
|
||||
print("测试3: 截图")
|
||||
|
||||
img = adb_screenshot()
|
||||
print(f"截图大小: {len(img)} bytes")
|
||||
|
||||
# 保存截图
|
||||
with open("/tmp/sdk_test_screen.png", "wb") as f:
|
||||
f.write(img)
|
||||
print("已保存: /tmp/sdk_test_screen.png")
|
||||
return len(img) > 10000
|
||||
|
||||
|
||||
def test_click():
|
||||
"""测试点击"""
|
||||
print("=" * 50)
|
||||
print("测试4: 点击操作")
|
||||
|
||||
# 点击屏幕中心
|
||||
adb_tap(540, 1200)
|
||||
time.sleep(1)
|
||||
print("点击 (540, 1200) 完成")
|
||||
return True
|
||||
|
||||
|
||||
def test_swipe():
|
||||
"""测试滑动"""
|
||||
print("=" * 50)
|
||||
print("测试5: 滑动操作")
|
||||
|
||||
# 向上滑动
|
||||
adb_swipe(540, 1800, 540, 600, 500)
|
||||
time.sleep(1)
|
||||
print("向上滑动完成")
|
||||
|
||||
# 向下滑动
|
||||
adb_swipe(540, 600, 540, 1800, 500)
|
||||
time.sleep(1)
|
||||
print("向下滑动完成")
|
||||
return True
|
||||
|
||||
|
||||
def test_open_settings():
|
||||
"""测试打开设置APP"""
|
||||
print("=" * 50)
|
||||
print("测试6: 打开设置APP")
|
||||
|
||||
adb_start_app("com.android.settings")
|
||||
time.sleep(2)
|
||||
|
||||
current = adb_current_app()
|
||||
print(f"当前APP: {current}")
|
||||
|
||||
success = "settings" in current.lower()
|
||||
if success:
|
||||
print("✅ 设置APP已打开")
|
||||
return success
|
||||
|
||||
|
||||
def test_input_text():
|
||||
"""测试输入文字"""
|
||||
print("=" * 50)
|
||||
print("测试7: 输入文字")
|
||||
|
||||
# 打开搜索
|
||||
adb_shell("am start -a android.intent.action.VIEW -d 'https://www.baidu.com'")
|
||||
time.sleep(3)
|
||||
|
||||
print("已打开浏览器")
|
||||
return True
|
||||
|
||||
|
||||
def main():
|
||||
print("🚀 工作手机SDK v3.0 - 模拟器完整测试")
|
||||
print("=" * 50)
|
||||
|
||||
results = []
|
||||
|
||||
# 检查设备连接
|
||||
devices = subprocess.run(["adb", "devices"], capture_output=True, text=True)
|
||||
if DEVICE_SERIAL not in devices.stdout:
|
||||
print(f"❌ 设备 {DEVICE_SERIAL} 未连接")
|
||||
return
|
||||
|
||||
print(f"✅ 设备已连接: {DEVICE_SERIAL}\n")
|
||||
|
||||
# 运行测试
|
||||
tests = [
|
||||
("SDK健康检查", test_sdk_health),
|
||||
("获取设备信息", test_device_info),
|
||||
("截图功能", test_screenshot),
|
||||
("点击操作", test_click),
|
||||
("滑动操作", test_swipe),
|
||||
("打开设置APP", test_open_settings),
|
||||
]
|
||||
|
||||
for name, test_func in tests:
|
||||
try:
|
||||
result = test_func()
|
||||
results.append((name, result))
|
||||
status = "✅" if result else "❌"
|
||||
print(f"{status} {name}")
|
||||
except Exception as e:
|
||||
results.append((name, False))
|
||||
print(f"❌ {name}: {e}")
|
||||
print()
|
||||
|
||||
# 汇总
|
||||
print("=" * 50)
|
||||
print("📊 测试汇总")
|
||||
passed = sum(1 for _, r in results if r)
|
||||
total = len(results)
|
||||
print(f"通过: {passed}/{total}")
|
||||
|
||||
if passed == total:
|
||||
print("\n🎉 全部测试通过!SDK已就绪!")
|
||||
else:
|
||||
print("\n⚠️ 部分测试未通过,请检查")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user