You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在虚拟化环境运行测试脚本:解决键鼠输入与画面捕获问题

可行虚拟化测试方案实现隔离输入与直接捕获输出

方案一:基于X11虚拟显示服务器(Xvfb + xdotool + xwd)

  • 核心逻辑:创建无界面虚拟X服务器,让应用运行在独立的虚拟显示环境中,输入和显示完全与宿主桌面隔离
  • 操作步骤:
    1. 安装依赖(Debian/Ubuntu环境):
      sudo apt install xvfb xdotool xwd
      
    2. 改造execute_shell_command函数,嵌入虚拟环境启动与测试逻辑:
      # 启动虚拟显示服务器,指定分辨率与显示编号
      Xvfb :1 -screen 0 1920x1080x24 &
      export DISPLAY=:1
      # 运行目标应用(示例为国际象棋游戏)
      python chess.py &
      # 等待应用完全启动
      sleep 3
      # 仅对虚拟环境内的目标应用模拟键鼠输入
      xdotool search --name "Chess Game" windowfocus mousemove 100 100 click 1
      # 直接捕获应用窗口的像素数据(无需屏幕全局捕获)
      xwd -id $(xdotool search --name "Chess Game") -out chess_window.xwd
      
    3. 优势:支持所有X11协议应用,输入完全隔离,无需依赖窗口聚焦状态,直接获取应用原生视觉输出
    4. 注意事项:需根据实际应用的窗口名称调整xdotool search的匹配参数;若应用需要音频,可搭配pulseaudio虚拟音频设备实现完整隔离

方案二:容器化全隔离测试(Docker + 虚拟显示)

  • 核心逻辑:将应用、测试脚本与虚拟显示环境打包进Docker容器,实现与宿主系统的完全隔离
  • 操作步骤:
    1. 创建Dockerfile:
      FROM python:3.9-slim
      RUN apt update && apt install -y xvfb xdotool xwd
      WORKDIR /app
      COPY chess.py test.py ./
      # 设置虚拟显示环境变量
      ENV DISPLAY=:1
      # 定义启动脚本,按顺序启动虚拟环境、应用与测试
      CMD ["bash", "-c", "Xvfb :1 -screen 0 1920x1080x24 & sleep 2 && python chess.py & sleep 3 && python test.py"]
      
    2. 构建并运行容器:
      docker build -t chess-test . && docker run chess-test
      
    3. 优势:跨平台兼容,测试环境可复用,输入仅作用于容器内应用,完全避免宿主环境干扰
    4. 扩展功能:如需查看容器内应用画面,可通过x11vnc导出虚拟显示流,或搭配novnc提供Web端访问入口

方案三:Wayland应用适配方案(Weston + wlrctl + grim)

  • 核心逻辑:针对Wayland协议应用,使用Weston创建无头虚拟桌面会话,实现输入隔离与原生输出捕获
  • 操作步骤:
    1. 安装依赖(Debian/Ubuntu环境):
      sudo apt install weston wlrctl grim
      
    2. 启动虚拟Wayland会话并执行测试:
      weston --backend=headless-backend.so --socket=wayland-1 &
      export WAYLAND_DISPLAY=wayland-1
      # 运行目标应用
      python chess.py &
      sleep 3
      # 聚焦目标应用并模拟键鼠输入
      wlrctl window focus "Chess Game"
      wlrctl input pointer move 100 100
      wlrctl input pointer click left
      # 直接捕获应用窗口输出为图片
      grim -o $(wlrctl window list | grep "Chess Game" | awk '{print $1}') chess_window.png
      
    3. 优势:原生支持Wayland应用,避免X11兼容性问题,输入与显示隔离彻底

通用execute_shell_command函数改造示例

import os
import time

def execute_shell_command(cmd, app_name, capture_output=True):
    # 自动检测系统显示协议(X11/Wayland)
    display_protocol = os.environ.get('XDG_SESSION_TYPE', 'x11')
    
    if display_protocol == 'x11':
        # X11环境处理流程
        os.system('Xvfb :1 -screen 0 1920x1080x24 &')
        os.environ['DISPLAY'] = ':1'
        os.system(f'{cmd} &')
        time.sleep(3)
        # 模拟键鼠输入
        os.system(f'xdotool search --name "{app_name}" windowfocus mousemove 100 100 click 1')
        if capture_output:
            os.system(f'xwd -id $(xdotool search --name "{app_name}") -out {app_name}_window.xwd')
    elif display_protocol == 'wayland':
        # Wayland环境处理流程
        os.system('weston --backend=headless-backend.so --socket=wayland-1 &')
        os.environ['WAYLAND_DISPLAY'] = 'wayland-1'
        os.system(f'{cmd} &')
        time.sleep(3)
        os.system(f'wlrctl window focus "{app_name}"')
        os.system('wlrctl input pointer move 100 100')
        os.system('wlrctl input pointer click left')
        if capture_output:
            os.system(f'grim -o $(wlrctl window list | grep "{app_name}" | awk \'{{print $1}}\') {app_name}_window.png')
    # 清理虚拟环境进程
    os.system('pkill Xvfb || pkill weston')

内容的提问来源于stack exchange,提问作者iheb salah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 12:33:25