Firefox, запущенный Selenium, игнорирует экран, созданный pyvirtualdisplay.
Я начинаю показ с pyvirtualdisplay
перед созданием моего WebDriver
пример. Если я использую Chrome, он работает без проблем: Chrome обнаруживается в экземпляре Xephyr, который pyvirtualdisplay
создает. Однако, когда я использую 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()
).
1 ответ
Решение
Переместите свое творение 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 будут подключаться. Он настроен не так, как вы ожидаете.
Вот что происходит с вашим кодом:
Вы создаете экземпляр
FirefoxBinary
, Если вы прочитаете исходный код, вы увидите, что при создании объекта этого класса он создает копиюos.environ
(окружающая среда).Вы создаете дисплей с
pyvirtualdisplay.Display
и использовать его в качестве менеджера контекста. Когда вы вводите контекст, дисплей изменяетсяos.environ
так что пока действует контекст,DISPLAY
Переменная окружения установлена так, что X-клиенты будут подключаться к новому дисплею вместо того, чтоDISPLAY
был до того, как контекст вступил в силу.Вы создаете свой драйвер. Когда вы используете Chrome, все в порядке, потому что Chrome получит его
DISPLAY
переменная из модифицированной среды. Однако, когда вы используете Firefox, он будет использоватьDISPLAY
среда из среды, которая была скопирована на первом этапе. Эта среда содержит значениеDISPLAY
который предшествует изменению, описанному в предыдущем шаге, поэтому он не подключается к созданному вами новому дисплею.