在 docker 容器内运行 pyautogui 脚本来控制主机屏幕

问题描述 投票:0回答:1

在工作中,我们使用 docker 容器在带有触摸屏的定制 Linux 机器上运行我们的脚本。我是那里的 QA,我想创建一些自动化测试,应该执行虚拟触摸点击。

我的问题是,Linux 机器只有基本的软件包,安装新的软件包非常棘手。另外,为了不弄乱操作系统本身,我也想在 docker 容器内使用我的自动化脚本。这也让我有机会使用不同的软件包进行测试。

我想使用

pyautogui
来模拟触摸屏上的输入(我知道这并不像听起来那么容易是有原因的)。目前,我一直致力于让 docker 容器访问屏幕。当我运行一个简单的测试脚本时,我收到这两条错误消息

Traceback (most recent call last):
  File "/usr/local/lib/python3.12/site-packages/Xlib/support/unix_connect.py", line 76, in get_socket
    s.connect('/tmp/.X11-unix/X%d' % dno)
ConnectionRefusedError: [Errno 111] Connection refused
Xlib.error.DisplayConnectionError: Can't connect to display ":0": [Errno 111] Connection refused

所以我知道问题出在X11的限制上。我正在尝试在网上找到的不同解决方案,但没有一个有效。我的下一步是更多地了解

X11
及其工作原理,但这可能需要一些时间。

也许你们中的一些人有解决方案或更好的方法来做到这一点。如果我混淆了与这些主题相关的一些名称,我也深表歉意。

我的

Dockerfile
看起来像这样:

FROM ubuntu:latest as notebook

WORKDIR /automation_test
COPY /src /automation_test/src

RUN apt update && apt-get update
RUN apt -y install python3 python3-pip
RUN pip install --upgrade pip
RUN pip install -r src/requirements.txt
RUN apt-get -y install -y wget
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \ 
    && echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list
RUN apt-get update && apt-get -y install google-chrome-stable
RUN apt-get -y install x11-apps
RUN apt-get -y install xauth
RUN apt-get -y install openbox
RUN mkdir /root/.Xauthority
RUN HOST=cctv
RUN DISPLAY_NUMBER=$(echo $DISPLAY | cut -d. -f1 | cut -d: -f2)
RUN AUTH_COOKIE=$(xauth list | grep "$(hostname)/unix:${DISPLAY_NUMBER} " | awk '{print $3}')
RUN xauth add ${HOST}/unix: ${DISPLAY_NUMBER} MIT-MAGIC-COOKIE-1 ${AUTH_COOKIE}
...

和我的

docker-compose.yaml
像这样:

version: '3.6'

x-base: &base
    ipc: host
    pid: host
    privileged: true
    network_mode: host
    volumes:
      - ./src/results:/automation_test/src/results
      - ./src/tmp:/automation_test/src/tmp
      - /tmp/.X11-unix:/tmp/.X11-unix
    environment:
      - DISPLAY=${DISPLAY}
    extra_hosts:
      - "host.docker.internal:host-gateway"


services:

  notebook:
    <<: *base
    image: notebook
    container_name: notebook
    build: 
      context: .
      target: notebook
    command: ["/bin/bash"]

Disclaimer:
这些文件中的大部分内容都是我尝试过的解决方案,但没有奏效。这就是它看起来有点丑陋和凌乱的原因。我目前使用的是 Ubuntu 基础镜像。将来我只想使用 python 图像作为基础。

python linux docker x11 pyautogui
1个回答
0
投票

你可以像这样进行x转发:

#!/usr/bin/env bash

dir=$(mktemp -d); cd $dir

echo 'import pyautogui;pyautogui.write("Hello, World!")' > test.py 

docker build -t x-forwarding -f - . << EOF
FROM python
WORKDIR /app
COPY test.py ./
RUN pip install pyautogui python-xlib
EOF

docker run -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY\
    --name x-forwarding --rm x-forwarding python test.py

一旦成功,您就可以将其集成到您的 docker-compose 工作流程中。

© www.soinside.com 2019 - 2024. All rights reserved.