gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 20:21:42 25 4
gpt4 key购买 nike

在创建我的 WebDriver 实例之前,我使用 pyvirtualdisplay 开始显示。如果我使用 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 先于在上一步中描述的更改,因此它不会连接到您创建的新显示。

关于python - 由 Selenium 启动的 Firefox 忽略由 pyvirtualdisplay 创建的显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27202131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com