配套动画视频在《7. Langchain 打开App再截图:启停3步闭环》,源代码在《评论区置顶》。
上一节能截当前屏幕了,但自动化里更常见的是:先打开目标 App,再截首屏,最后把应用关掉。这一节就把「启动 → 截图 → 关闭」收成一条闭环。
整体流程是这样的:先把 .env 里的 HDC_PATH 注入 PATH,再读设备配置和应用包名;然后连接真机、打开应用,等首屏出来并截图。文件为空也算失败,但无论成败都要关掉应用;成功则保存到 screenshots。
先说文件顶部。Hypium 的 connect_device 只认系统 PATH 里的 hdc,不会读 HDC_PATH。所以在 import 之后先调用 load_dotenv() 读入 .env,再把其中的 HDC_PATH(toolchains 目录)写进 PATH。后面连真机、截图才能找到 hdc:
from dotenv import load_dotenv
load_dotenv()
hdc = os.getenv('HDC_PATH', '')
if hdc and Path(hdc).exists():
os.environ['PATH'] = hdc + os.pathsep + os.environ.get('PATH', '')
连真机交给 _setup_driver:从 device_config.json 读取设备信息,用 connect_device 连上真机,再包装成 UiDriver。没传 sn 时默认用配置里第 1 台设备。没有 driver,后面的 start_app / stop_app 都调不了:
def _setup_driver(device_sn=None):
config_path = os.path.join(..., 'config', 'device_config.json')
with open(config_path, 'r', encoding='utf-8') as f:
config_data = json.load(f)
if not device_sn:
if config_data.get('devices'):
device_sn = config_data['devices'][0]['sn']
if device_sn:
device = connect_device(device_sn=device_sn)
else:
device = connect_device()
return UiDriver(device)
闭环入口是 open_app_screenshot_close。一进来先从配置里取出要启动的应用:bundle_name、ability_name;再确定截图保存路径,默认是 testcases/screenshots/app_screenshot.png:
def open_app_screenshot_close(screenshot_path: str = None):
target = config.get('target_app', {})
bundle_name = target.get('bundle_name', 'com.example.myapp')
ability_name = target.get('ability_name', 'EntryAbility')
if not screenshot_path:
screenshot_path = os.path.join(base_dir, 'testcases',
'screenshots', 'app_screenshot.png')
接着用 _setup_driver 拿到 driver,再 start_app 把应用拉到前台,sleep(3) 等首屏渲染完。这样后面截到的才是 App 界面,而不是桌面:
driver = _setup_driver()
result_path = None
try:
driver.start_app(bundle_name, ability_name)
print(f"[启动] 应用已启动:{bundle_name}")
time.sleep(3)
截图直接调用已有的 _do_take_screenshot,不要重写截图逻辑。成功返回文件路径,失败(含空文件)返回 None:
result_path = _do_take_screenshot(screenshot_path)
if result_path:
print(f"[截图] 成功:{result_path}")
else:
print("[截图] 失败")
stop_app 必须放在 finally 里:截图成功要关,失败也要关,避免应用留在前台。关掉后再短等 1 秒,最后 return result_path:
finally:
try:
driver.stop_app(bundle_name)
print(f"[关闭] 应用已关闭:{bundle_name}")
time.sleep(1)
except Exception as e:
print(f"[关闭] 应用关闭失败:{e}")
return result_path
配套动画视频在《7. Langchain 打开App再截图:启停3步闭环》,源代码在《评论区置顶》。
跑通这条闭环后,Agent 就能按「开 App → 截屏 → 关 App」稳定拿到界面截图,也为后面出报告准备好素材。