手机操作
更新时间 2026-07-10 09:15:57
最近更新时间: 2026-07-10 09:15:57
前提条件
在控制台完成手机沙箱模板创建
在执行下文所有代码前,请先按照环境变量设置部分,完成环境变量设置,并将在控制台创建的手机沙箱模版名称填入下列代码的 template 参数中。
手机操作
您可以通过 Appium 来连接并操作手机沙箱,通过novnc_url观察手机界面,实现自动化测试和操作。
下面的代码演示了如何通过 Appium 连接手机沙箱,并进行基本的操作(如打开手机中的设置页面、滑动屏幕、截图等)。更多用法请参考 Appium 官方文档 和 Python Client SDK 文档。
import time
from pathlib import Path
from appium import webdriver
from appium.options.android import UiAutomator2Options
from appium.webdriver.appium_connection import AppiumConnection
from e2b import Sandbox
from dotenv import load_dotenv
import requests
# 加载环境变量
load_dotenv()
# 创建一个手机沙箱,template 需要换为您在控制台创建的沙箱工具名称
sandbox = Sandbox.create(template="mymobiletpl", timeout=600)
print(f"手机沙箱已创建: {sandbox.sandbox_id}")
# 拼接vnc websocket地址
websockify_url = f"wss://{sandbox.get_host(9001)}/novnc/websockify?access_token={sandbox._envd_access_token}"
print(f"VNC 地址: {websockify_url}")
# 拼接novnc地址
novnc_url = f"https://{sandbox.get_host(9001)}/novnc/?autoconnect=true&resize=scale&access_token={sandbox._envd_access_token}&path=websockify%3Faccess_token%3D{sandbox._envd_access_token}"
print(f"NoVNC 地址: {novnc_url}")
# 配置 Appium Driver
def create_appium_driver(sandbox, port: int = 9001, **options_kwargs):
options = UiAutomator2Options()
options.platform_name = options_kwargs.pop('platform_name', 'Android')
options.automation_name = options_kwargs.pop('automation_name', 'UiAutomator2')
options.new_command_timeout = 300
for key, value in options_kwargs.items():
setattr(options, key, value)
# 设置认证 header
AppiumConnection.extra_headers['X-Access-Token'] = sandbox._envd_access_token
return webdriver.Remote(
command_executor=f"https://{sandbox.get_host(port)}/appium",
options=options
)
# 等待 Appium 服务就绪
def wait_for_appium():
print("等待 Appium 服务就绪...")
for i in range(30):
try:
resp = requests.get(
f"https://{sandbox.get_host(9001)}/health",
timeout=5,
)
if resp.status_code == 200:
print(f"Appium 服务已就绪:{resp.status_code}")
return True
else:
print(f"Appium 服务未就绪...")
except requests.exceptions.RequestException as e:
print(f"Appium 服务未就绪...")
time.sleep(2)
print("Appium 服务启动超时")
return False
# 等待Appium服务就绪
wait_for_appium()
# 创建 Appium driver
driver = create_appium_driver(sandbox)
print(f"Appium 已连接,窗口大小: {driver.get_window_size()}")
print("\n 按 HOME 键回到桌面...")
driver.press_keycode(3)
time.sleep(2)
print("\n 打开settings应用...")
driver.activate_app("com.android.settings")
time.sleep(2)
print("\n 向上滑动 5 秒...")
# 从屏幕下向上滑动
start_x, start_y = 200, 200
end_x, end_y = 200, 800
driver.swipe(start_x, start_y, end_x, end_y, duration=5000)
time.sleep(2)
print("\n 开始截图...")
screenshot_dir = Path(__file__).parent / "screenshot"
screenshot_dir.mkdir(parents=True, exist_ok=True)
timestamp = time.strftime("%Y%m%d_%H%M%S")
screenshot_path = screenshot_dir / f"mobile_screenshot_{timestamp}.png"
driver.save_screenshot(str(screenshot_path))
print(f"\n 截图已保存: {screenshot_path}")
# 关闭
driver.quit()
sandbox.kill()