如何将pyautogui附加到虚拟显示器?
How to attach pyautogui to the virtual display?
如何在多线程模式下将 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)
#
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>
P.S.
我知道如何通过 selenium
进行点击,但我恰好需要 pyautogui
个事件。
来自 https://pyautogui.readthedocs.io/en/latest/ 的 pyautogui 文档:
Q: Does PyAutoGUI work on multi-monitor setups.
A: No, right now PyAutoGUI only handles the primary monitor.
这很棘手 - 但有一些巧妙的解决方法:
"为了 运行 PYAUTOGUI headless 你需要使用 Xdisplay 制作一个 docker 并为 PYAUTOGUI 提供虚拟显示的路径。基本上它会有显示后端内存 运行 而实际上没有显示器。服务器可部署。"
希望这对你有用(代码可以在上面的 link 找到,不过我还没有测试过)...
如何在多线程模式下将 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)
#
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>
P.S.
我知道如何通过 selenium
进行点击,但我恰好需要 pyautogui
个事件。
来自 https://pyautogui.readthedocs.io/en/latest/ 的 pyautogui 文档:
Q: Does PyAutoGUI work on multi-monitor setups.
A: No, right now PyAutoGUI only handles the primary monitor.
这很棘手 - 但有一些巧妙的解决方法:
"为了 运行 PYAUTOGUI headless 你需要使用 Xdisplay 制作一个 docker 并为 PYAUTOGUI 提供虚拟显示的路径。基本上它会有显示后端内存 运行 而实际上没有显示器。服务器可部署。"
希望这对你有用(代码可以在上面的 link 找到,不过我还没有测试过)...