当前位置: 首页 > 面试题库 >

由Selenium启动的Firefox将忽略pyvirtualdisplay创建的显示

仲孙雅达
2023-03-14
问题内容

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())。


问题答案:

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决定了Firefox和Chrome的连接位置。它的设置方式与您期望的设置方式不同。

这是您的代码发生的情况:

  1. 您创建的实例FirefoxBinary。如果您阅读源代码,将会看到在创建此类的对象时, 它会复制os.environ(环境)

  2. 您可以pyvirtualdisplay.Display使用创建一个显示并将其用作上下文管理器。当你进入的背景下,显示器会改变os.environ,这样只要上下文中的效果,DISPLAY环境变量被设置成X客户端将连接到新的显示,而不是什么DISPLAY之前 的背景下生效。

  3. 您创建您的驱动程序。使用Chrome时,一切都很好,因为Chrome将从DISPLAY修改后的环境中获取其变量。但是,当您使用Firefox时,它将使用 第一步中复制DISPLAY环境 中的环境。 这个环境包括一个值DISPLAY之前 在上一步骤中所描述的变化,所以它不会连接到您创建的新的显示。



 类似资料:
  • Mapstruct使用我自己的无参数方法作为List的工厂(而不是构造函数) 我试着映射一些对象树,应该逐级构建。我有一种硬编码根节点的方法和另一种方法,用于将实体映射到节点。所以我有一个生成根名称列表的方法,和映射的抽象方法。 } 所以在生成的代码中,“childrenNames”看起来像@Override public List childrenNames(List children){if(

  • 今天我重新开始做一个旧的rails项目。一个让我抓狂的问题是我无法运行javascript测试用例,尽管我记得在我离开项目时它们都通过了。我正在使用 selenium webdriver 2.25.0水豚1.1.2cucumber1.2.1 无法干净地启动Firefox,参数:[“-silent”](Selenium::WebDriver::Error::WebDriverError) 我想这是因

  • 我们有一个使用Spring Boot JPA/Hibernate构建的服务。 我在不同的jars包中有两个同名的类。 使用Eclipse运行应用程序会导致重复导入问题,因此我在其中一个实体中添加了以下内容: 它解决了Eclipse中的问题,我可以很好地运行应用程序。但是,当使用java -jar运行Spring Boot生成的jar时,问题又回来了: 看起来@Entity(name)属性被完全忽略

  • 我已经使用selenium webdriver创建了新的firefox配置文件,就像在web驱动程序文档中一样。我也创建了firebug扩展,但当时我无法访问firefox xpcom功能。有什么方法可以做到这一点吗?我在firefox控制台中发现以下错误。

  • 我有一张桌子在下面 我想写一个查询组由album_id,它会给下面的结果 我已经尝试过了,但是它的grouping NULL列也是,我希望所有的行都是NULL,并且groupby album_id都不是NULL。 我已经跟踪了这个链接-但不要为我工作 谢谢

  • 问题内容: 在将selenium2.35与firefox的早期版本一起使用之前,我将其更新为firefox 26.0。我的测试以前运行良好,但现在最终出现以下错误。 我试图降级firefox的版本,但是无法从mozilla站点获得任何以前的版本。 我也尝试了所有selenium版本2.36、2.37、2.38、2.39,但它们似乎都与firefox 26.0不兼容。一旦我尝试将selenium2.