Firefox, начатый Selenium, игнорирует отображение, созданное pyvirtualdisplay

Я pyvirtualdisplay экран с pyvirtualdisplay перед созданием экземпляра WebDriver . Если я использую Chrome, он работает без проблем: Chrome появляется в экземпляре pyvirtualdisplay создает 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() ).

One Solution collect form web for “Firefox, начатый Selenium, игнорирует отображение, созданное pyvirtualdisplay”

Решение

Переместите создание объекта 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 - лучший язык программирования в мире.