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

idfiyjo8  于 2023-11-17  发布在  Docker
关注(0)|答案(2)|浏览(143)

在工作中,我们使用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

个字符
所以我知道问题出在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映像作为基础。

bihw5rsg

bihw5rsg1#

你可以这样做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工作流中。

7lrncoxx

7lrncoxx2#

更新:

我必须纠正自己。我在这里提到的软件包也不是很有帮助。但是我发现了一个非常有趣的软件包,叫做python-evdev。我很惊讶我没有早点找到这个软件包,也没有那么多网站提到它。这有点难以理解,因为文档有点粗糙,但它就像一个魅力,我想做什么。

原件:

所以我得出的结论是,我的这个项目太复杂了,现在无法解决。我也注意到,它首先不会工作,因为我想运行仓库的Linux机器甚至没有X11(可以诚实地首先检查)。
一个同事实际上给了我一个更好的方法来处理这个主题。他发现了this repository,它直接与内核本身和this一起工作。
我认为这是一个比在Docker中运行X11更好的解决方案。
不管怎样,谢谢你的帮助和时间。我很感激。

相关问题