python - 如何将 pyautogui 连接到虚拟显示器?

标签 python multiprocessing pyautogui xvfb pyvirtualdisplay

如何在多线程模式下将 pyautogui 连接到显示器?

在我的代码示例中,pyautogui 始终可以访问上部显示屏。

是否可以在每个显示器上进行 pyautogui 控制?

import os
from selenium import webdriver
from pyvirtualdisplay import Display
import Xlib.display
# ...

# let's say i run this function in two threads
def do_work(data):
    v_display = Display(visible=0, size=(900, 600))
    v_display.start()

    # How can i attach v_display to the pyautogui?
    import pyautogui

    print(v_display)
    # https://stackoverflow.com/questions/35798478/how-i-can-attach-the-mouse-movement-pyautogui-to-pyvirtualdisplay-with-seleniu
    pyautogui._pyautogui_x11._display = Xlib.display.Display(os.environ['DISPLAY'])

    print(pyautogui._pyautogui_x11._display)

    chrome_options = Options()
    chrome_options.add_argument('--user-data-dir='+str(data['profile']))
    chrome_options.add_argument("--start-maximized")


    driver = webdriver.Chrome('chromedriver', chrome_options=chrome_options)

    driver.get('https://my_resource.co/?'+data['param'])


    pyautogui.click(x=880, y=580)
    # Click always goes through the upper display
    # I also tried to take screenshots they are always the same

    # ...

    driver.quit()
    v_display.stop()

输出:

<Display cmd_param=['Xvfb', '-br', '-nolisten', 'tcp', '-screen', '0', '900x600x24', ':1086'] cmd=['Xvfb', '-br', '-nolisten', 'tcp', '-screen', '0', '900x600x24', ':1086'] oserror=None return_code=None stdout="None" stderr="None" timeout_happened=False>
<Display cmd_param=['Xvfb', '-br', '-nolisten', 'tcp', '-screen', '0', '900x600x24', ':1087'] cmd=['Xvfb', '-br', '-nolisten', 'tcp', '-screen', '0', '900x600x24', ':1087'] oserror=None return_code=None stdout="None" stderr="None" timeout_happened=False>
<Xlib.display.Display object at 0x7f4f5493aa90>
<Xlib.display.Display object at 0x7f4f5493a8d0>

附注
我知道如何通过 selenium 进行点击,但我确实需要 pyautogui 事件。

最佳答案

这很难做到 - 但有一些巧妙的解决方法:

感谢Abhishek Vaid :

要 headless 运行 PYAUTOGUI,您需要使用 Xdisplay 创建一个 docker,并向 PYAUTOGUI 提供虚拟显示的路径来执行此操作。基本上,它将在后端运行显示内存,而无需实际显示。服务器可部署。

希望这对您有用(代码可以在上面的链接中找到,但我还没有测试过)...

关于python - 如何将 pyautogui 连接到虚拟显示器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57078828/

相关文章:

asp.net - 如何在 ASP.NET 中运行 .py (Python) 文件?

python - 使用map或split(pyspark)后如何查看RDD的内容?

Python - 在多处理调用之前修改的全局变量作为原始状态传递

python - PyAutoGUIlocateOnScreen 方法中 minSearchTime 参数的目标是什么?

python - Pyautogui 键盘命令不适用于菜单栏分配

python - 有没有办法隐藏 pyautogui.press() 的操作?

Python 正则表达式搜索 : repeated digit n times

python - 滚动平均 pandas DataFrame 的所有值

多处理器机器上的 Java 堆和 GC?

Python 多处理脚本看似无误地卡住