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 будут подключаться. Он настроен не так, как вы ожидаете.

Вот что происходит с вашим кодом:

  1. Вы создаете экземпляр FirefoxBinary, Если вы прочитаете исходный код, вы увидите, что при создании объекта этого класса он создает копию os.environ (окружающая среда).

  2. Вы создаете дисплей с pyvirtualdisplay.Display и использовать его в качестве менеджера контекста. Когда вы вводите контекст, дисплей изменяется os.environ так что пока действует контекст, DISPLAY Переменная окружения установлена ​​так, что X-клиенты будут подключаться к новому дисплею вместо того, что DISPLAY был до того, как контекст вступил в силу.

  3. Вы создаете свой драйвер. Когда вы используете Chrome, все в порядке, потому что Chrome получит его DISPLAY переменная из модифицированной среды. Однако, когда вы используете Firefox, он будет использовать DISPLAY среда из среды, которая была скопирована на первом этапе. Эта среда содержит значение DISPLAY который предшествует изменению, описанному в предыдущем шаге, поэтому он не подключается к созданному вами новому дисплею.

Другие вопросы по тегам