使用PyAutoGUI与Docker Firefox自动化时无法遵循显示约束问题
问题:PyAutoGUI未识别Docker容器的显示,返回主机屏幕坐标
环境:搭载Retina显示屏的M1 MacBook Pro + Docker Desktop
部署情况
使用以下命令部署jlesage/firefox镜像:
docker run -d \ --name firefox \ -p 5800:5800 \ -p 5900:5900 \ -e DISPLAY_WIDTH=1024 \ -e DISPLAY_HEIGHT=768 \ -e DISPLAY=:0 \ -v /Users/vw/DEV/docker/scripts:/scripts \ -e VNC_PASSWORD=password \ jlesage/firefox
部署后可通过VNC正常访问容器内的Firefox。
问题现象
编写PyAutoGUI脚本尝试查找并点击Facebook按钮:
import os import pyautogui import time # Ensure the script uses the Docker container's display os.environ["DISPLAY"] = ":0" # Delay to allow setup time.sleep(3) try: # Locate the image within the Docker display location = pyautogui.locateCenterOnScreen('Facebook.png', confidence=0.8) if location: x, y = location # Constrain search to 1024x768 if 0 <= x < 1024 and 0 <= y < 768: print(f"Image found at: {location}") pyautogui.click(location) else: print(f"Image found outside bounds (1024x768): {location}") else: print("Image not found on the screen.") except Exception as e: print(f"An error occurred: {e}")
运行后得到错误:Image found outside bounds (1024x768): Point(x=np.int64(1743), y=np.int64(1145)),说明脚本实际识别的是Mac主机的Retina屏幕坐标,而非容器内的1024x768显示。
解决方法
必须在Docker容器内部运行脚本
主机的DISPLAY=:0指向的是Mac自身的Retina显示屏,和容器内的X11显示完全独立。在主机上运行脚本,pyautogui会默认抓取主机屏幕,自然返回主机的高分辨率坐标。进入容器并安装依赖
容器默认没有Python和PyAutoGUI相关库,需要先安装:# 进入容器终端 docker exec -it firefox bash # 更新包列表并安装依赖 apt update && apt install -y python3 python3-pip python3-opencv # 安装PyAutoGUI pip3 install pyautogui在容器内运行脚本
挂载的脚本目录在容器内是/scripts,直接运行:python3 /scripts/your_script_name.py可选:简化脚本的DISPLAY设置
容器内部已经通过环境变量设置了DISPLAY=:0,脚本里可以去掉os.environ["DISPLAY"] = ":0"这一行,避免冗余。
内容的提问来源于stack exchange,提问作者vwdewaal
相关产品推荐
相关产品推荐

