3

今天我从社区中得到了一些很大的帮助,希望有人能在这个小家伙上让我朝着正确的方向前进。

我有一个循环,我试图加载许多不同的网页,但目前同一个网页正在不同的窗口中打开。

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

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/")

已编辑

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

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 会话吗?

4

1 回答 1

4

好的,我在这里重现了这个问题。当我发现这个问题时,我差点给自己一巴掌,因为一旦所有的部分都在一起就很明显了。问题是您在第一个之后启动的显示器没有连接到您的“真实”X 服务器。他们正在相互连接。这是发生的事情:

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

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

  3. 你创建了一个新的显示,它强制连接到第一个 Xephyr 实例,而不是你的“真正的”X 服务器。由于它与第一个 Xephyr 具有相同的尺寸,因此它占据了第一个显示器的整个空间,并且完全阻挡了之前创建的 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")
于 2015-05-12T16:50:52.720 回答