Python从循环中打开多个显示窗口

时间:2015-05-11 12:51:28

标签: python selenium selenium-webdriver pyvirtualdisplay

我今天得到了社区的一些帮助,希望有人可以让我在这个小小的方向上找到正确的方向。

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

如何在单独显示中打开它们?有没有办法标记显示?

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

1 个答案:

答案 0 :(得分:2)

好的,我在这里重现了这个问题。当我发现这个问题时,我几乎打了一巴掌,因为一旦所有的碎片在一起,它就显而易见了。 问题是,您在第一个显示之后开始的显示没有连接到您的"真实" X服务器。他们彼此联系。这里发生了什么:

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

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

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

  4. 新的Chrome实例会显示在嵌入式显示屏中。您有两个Chrome运行实例,但无法看到早期版本。

  5. 您需要做的是在创建新的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")