Python 从循环中打开多个显示 windows

Python open multiple display windows from a loop

我今天从社区得到了一些很大的帮助,希望有人能在这个小问题上为我指明正确的方向。

我有一个循环,我正在尝试加载多个不同的网页,但此时同一个网页在不同的 window.

中打开

如何在单独的显示器中打开它们?有没有办法给显示器贴上标签?

for d in data["screen"]:
   screen_list["code"]))
    display = Display(visible=1, size=(800, 600))
    display.start()
    driver = webdriver.Chrome()
    driver.get("https://" + d["server"] + "/test/")

已编辑

为了改进答案,我编写了一个快速脚本来尝试加载显示给不同网页的两个不同显示,但它会在同一个 window

中加载两个网页
import sys
import os
from selenium import webdriver
from pyvirtualdisplay import Display
from selenium.webdriver.common.keys import Keys



display = Display(visible=1, size=(800, 600))
display.start()
driver = webdriver.Chrome()
driver.get("https://news.bbc.co.uk")

display2 = Display(visible=1, size=(800, 600))
display2.start()
driver2 = webdriver.Chrome()
driver2.get("https://www.google.com")

已编辑

我认为问题是脚本在一个端口上打开了一个 xephyr 会话,然后 chrome 驱动程序将只与那个会话对话,所以你能为每个 driver.get("") 打开多个 xephyr 会话吗要求?

好的,我在这里重现了这个问题。当我发现这个问题时,我差点给自己打耳光,因为一旦所有部分都放在一起就很明显了。 问题是您在第一个之后启动的显示没有连接到您的 "real" X 服务器 。他们正在相互联系。事情是这样的:

  1. 您创建一个显示并在其上调用 start() 方法。此 start 方法启动一个新的 Xephyr 实例并有助于更改 DISPLAY 环境,以便连接到 X 的后续进程连接到新的 Xephyr 实例。

  2. 您启动 Chrome,它连接到新的 Xephyr 实例。耶!

  3. 您创建了一个新显示,主动连接到第一个 Xephyr 实例而不是您的 "real" X 服务器。由于它与第一个 Xephyr 具有相同的尺寸,因此它占据了第一个显示器的整个 space 并完全阻挡了先前创建的 Chrome 浏览器的视图。看起来你只有一个 Xephyr 运行 但实际上有两个 运行(例如可以使用 ps 来确定)。

  4. 新的 Chrome 实例出现在嵌入式显示中。您有两个 Chrome 运行 的实例,但看不到较早的实例。

您需要做的是在创建新的 Display 之前,将 DISPLAY 重置为开始创建显示之前的状态。这是有效的代码:

import sys
import os
from selenium import webdriver
from pyvirtualdisplay import Display
from selenium.webdriver.common.keys import Keys

orig = os.environ["DISPLAY"]

display = Display(visible=1, size=(800, 600))
display.start()
driver = webdriver.Chrome()
driver.get("https://news.bbc.co.uk")

# You have to do this between each new Display.
os.environ["DISPLAY"] = orig

display2 = Display(visible=1, size=(800, 600))
display2.start()
driver2 = webdriver.Chrome()
driver2.get("https://www.google.com")