在创建我的pyvirtualdisplay实例之前,我使用WebDriver启动一个显示。如果我使用Chrome,它没有任何问题: Chrome显示在pyvirtualdisplay创建的Xephyr实例中。然而,当我使用Firefox时,会出现Xephyr实例,但是Firefox会出现在它之外。
下面是完全再现问题的代码:
from selenium import webdriver
from selenium.webdriver.firefox.webdriver import FirefoxBinary
import pyvirtualdisplay
binary = FirefoxBinary()
with pyvirtualdisplay.Display(visible=True):
if True: # Set to False to use Chrome...
driver = webdriver.Firefox(None, binary)
else:
driver = webdriver.Chrome()
driver.get("http://www.google.com")
driver.quit()上面的代码是一个更复杂的代码的最小版本(这解释了看似无用的FirefoxBinary())。
发布于 2014-11-29 12:18:54
解决方案
将FirefoxBinary对象的创建移动到由pyvirtualdisplay.Display管理的上下文中
from selenium import webdriver
from selenium.webdriver.firefox.webdriver import FirefoxBinary
import pyvirtualdisplay
with pyvirtualdisplay.Display(visible=True):
if True: # Set to False to use Chrome...
binary = FirefoxBinary()
driver = webdriver.Firefox(None, binary)
else:
driver = webdriver.Chrome()
driver.get("http://www.google.com")
driver.quit()解释
问题是幕后发生了什么。名为DISPLAY的环境变量决定了火狐和Chrome的连接位置。它不是以你期望的方式设置的。
下面是您的代码发生的情况:
FirefoxBinary实例。如果您阅读源代码,您将看到,当创建该类的一个对象时,它将生成一个os.environ (环境)的副本。pyvirtualdisplay.Display创建一个显示,并将其用作上下文管理器。当您输入上下文时,显示会更改os.environ,以便只要上下文生效,就会设置DISPLAY环境变量,以便X客户端将连接到新的显示器,而不是上下文生效前的DISPLAY。DISPLAY变量。然而,当您使用火狐时,它将使用第一步复制的环境中的DISPLAY环境。此环境包含一个DISPLAY值,该值在上一步中描述的更改之前,因此它不会连接到您创建的新显示器。https://stackoverflow.com/questions/27202131
复制相似问题