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 服务器 。他们正在相互联系。事情是这样的:
您创建一个显示并在其上调用 start()
方法。此 start
方法启动一个新的 Xephyr 实例并有助于更改 DISPLAY
环境,以便连接到 X 的后续进程连接到新的 Xephyr 实例。
您启动 Chrome,它连接到新的 Xephyr 实例。耶!
您创建了一个新显示,主动连接到第一个 Xephyr 实例而不是您的 "real" X 服务器。由于它与第一个 Xephyr 具有相同的尺寸,因此它占据了第一个显示器的整个 space 并完全阻挡了先前创建的 Chrome 浏览器的视图。看起来你只有一个 Xephyr 运行 但实际上有两个 运行(例如可以使用 ps
来确定)。
新的 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")
我今天从社区得到了一些很大的帮助,希望有人能在这个小问题上为我指明正确的方向。
我有一个循环,我正在尝试加载多个不同的网页,但此时同一个网页在不同的 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 服务器 。他们正在相互联系。事情是这样的:
您创建一个显示并在其上调用
start()
方法。此start
方法启动一个新的 Xephyr 实例并有助于更改DISPLAY
环境,以便连接到 X 的后续进程连接到新的 Xephyr 实例。您启动 Chrome,它连接到新的 Xephyr 实例。耶!
您创建了一个新显示,主动连接到第一个 Xephyr 实例而不是您的 "real" X 服务器。由于它与第一个 Xephyr 具有相同的尺寸,因此它占据了第一个显示器的整个 space 并完全阻挡了先前创建的 Chrome 浏览器的视图。看起来你只有一个 Xephyr 运行 但实际上有两个 运行(例如可以使用
ps
来确定)。新的 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")