首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Selenium启动的Firefox忽略了pyvirtualdisplay创建的显示

Selenium启动的Firefox忽略了pyvirtualdisplay创建的显示
EN

Stack Overflow用户
提问于 2014-11-29 12:18:54
回答 1查看 3.6K关注 0票数 2

在创建我的pyvirtualdisplay实例之前,我使用WebDriver启动一个显示。如果我使用Chrome,它没有任何问题: Chrome显示在pyvirtualdisplay创建的Xephyr实例中。然而,当我使用Firefox时,会出现Xephyr实例,但是Firefox会出现在它之外。

下面是完全再现问题的代码:

代码语言:javascript
复制
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())。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-29 12:18:54

解决方案

FirefoxBinary对象的创建移动到由pyvirtualdisplay.Display管理的上下文中

代码语言:javascript
复制
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的连接位置。它不是以你期望的方式设置的。

下面是您的代码发生的情况:

  1. 您可以创建一个FirefoxBinary实例。如果您阅读源代码,您将看到,当创建该类的一个对象时,它将生成一个os.environ (环境)的副本。
  2. 您可以使用pyvirtualdisplay.Display创建一个显示,并将其用作上下文管理器。当您输入上下文时,显示会更改os.environ,以便只要上下文生效,就会设置DISPLAY环境变量,以便X客户端将连接到新的显示器,而不是上下文生效前的DISPLAY
  3. 你创造了你的司机。当您使用Chrome时,一切都很好,因为Chrome将从修改后的环境中获得它的DISPLAY变量。然而,当您使用火狐时,它将使用第一步复制的环境中的DISPLAY环境此环境包含一个DISPLAY值,该值在上一步中描述的更改之前,因此它不会连接到您创建的新显示器。
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27202131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档