Можно ли запустить веб-драйвер selenium (Firefox) без графического интерфейса?


113

Мы рассматриваем возможность обновления нашего производственного сервера с Ubuntu- desktop 10.04 до Ubuntu- server 12.04.

У нас есть различные службы, работающие на нашей текущей настольной ОС, такие как Selenium Web Driver. У меня вопрос: можно ли запустить Selenium Web Driver из системы на основе cli?

Я сразу же подумал, что это невозможно, потому что он полагается на Firefox, но я бы хотел, чтобы кто-нибудь доказал, что я неправ!


Ответы:


102

Вы ищете .

Да, можно запустить Selenium в Firefox без головы. Вот сообщение, за которым вы можете следить.

Вот краткие инструкции по настройке Xvfb

#install Xvfb
sudo apt-get install xvfb

#set display number to :99
Xvfb :99 -ac &
export DISPLAY=:99    

#you are now having an X display by Xvfb

5
Это работает и поддерживает скриншоты. Я использую это. Он также работает с Google Chrome.
Исаак

Я не думаю, что это больше работает (по крайней мере, нелегко, потому что для этого требуется новый geckodriver, как это делал хром)
Архимед Траджано

1
@ArchimedesTrajano Это все еще работает. Инструкции предназначены для создания виртуального дисплея с использованием Xvfb, а не для установки и настройки Selenium (для чего требуется наличие geckodriverна пути).
expz

2
Мне нравится делать это из Python, что вы можете сделать с помощью subprocess.Popen('Xvfb...')или os.system('Xvfb...'), но обязательно сделайте это перед импортом webdriver.
поводу

4
эта ссылка теперь не работает
oldboy

22

В Chrome теперь есть безголовый режим:

op = webdriver.ChromeOptions()
op.add_argument('headless')
driver = webdriver.Chrome(options=op)

4
PhantomJS в настоящее время не находится в активной разработке. Репозиторий Git заархивирован.
Войцех Якубас

1
Selenium также прекратил поддержку PhantomJS со следующим сообщением «UserWarning: поддержка Selenium для PhantomJS устарела, пожалуйста, используйте вместо него безголовые версии Chrome или Firefox»
Йорг

11

Да. Вы можете использовать HTMLUnitDriverвместо этого FirefoxDriverпри запуске webdriver. Это настройка безголового браузера. Подробности можно найти здесь .


1
Будет ли это поддерживать такие функции, как save_screenshot ()? coreygoldberg.blogspot.co.uk/2011/06/...
nonshatter

Не пробовал, но это возможно, потому что вы фактически все еще создаете пользовательский интерфейс, но показываете его в «виртуальном» окне.
Grahaminn

2
HTMLUnitDriver НЕ будет поддерживать снимок экрана, так как контент вообще не отображается (ошибка 1361). Я могу придумать альтернативу - использовать getHTMLSource и показывать HTML-страницу, а не снимок экрана.
AJ

10

Если вам нужна поддержка безголового браузера, вы можете принять другой подход.

https://github.com/detro/ghostdriver

Об этом было объявлено на конференции Selenium, и он все еще находится в разработке. Он использует PhantomJS в качестве браузера и намного лучше, чем HTMLUnitDriver, пока нет скриншотов, но он все еще находится в активной разработке.


4

Необязательно использовать pyvirtualdisplayвот так:

from pyvirtualdisplay import Display

display = Display(visible=0, size=[800, 600])
display.start()

#do selenium job here

display.close()

Более короткая версия:

with Display() as display:
    # selenium job here

Обычно это инкапсуляция Python xvfb, и в чем-то более удобная.

Кстати, хотя PhantomJSэто безголовый браузер, и при его использовании никакое окно не будет открываться, кажется, что для работы PhantomJSвсе еще требуется среда графического интерфейса.

У меня появляется код ошибки -6, когда я использую PhantomJS()вместо Firefox()безголового режима (консоль, подключенная к шпатлевке). Однако в среде рабочего стола все в порядке.


3

ОБНОВЛЕНИЕ: вам больше не нужен XVFB для запуска безголового Firefox. Firefox v55 + в Linux и Firefox v56 + в Windows / Mac теперь поддерживает автономное выполнение.

Я добавил сюда некоторую практическую документацию:

https://developer.mozilla.org/en-US/Firefox/Headless_mode#Selenium_in_Java


1
Комментарии не подлежат расширенному обсуждению; этот разговор был перемещен в чат .
Бхаргав Рао

У меня это не сработало. Я не уверен, но думаю, что XVFB все еще требуется.
Макс Малыш

Я использую безголовые браузеры в Firefox и Chrome уже несколько лет. Интерфейс WebDriver для Selenium теперь даже поддерживает параметр setHeadless.
Николас ДиПиацца,


1

Имейте в виду, что веб-клиент HtmlUnitDriver является однопоточным, а Ghostdriver имеет только 40% функциональных возможностей, чтобы быть WebDriver.

Тем не менее, Ghostdriver работает правильно для тестов, и у меня проблемы с подключением его к концентратору WebDriver.


Предоставляет ли это какую-либо новую информацию, которой нет в других ответах?
Остин Хенли,

0

Да, вы можете запускать тестовые скрипты без браузера, но вы должны запускать их в автономном режиме.


0

возможно, вам нужно установить размер окна. как:

options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--window-size=1920x1080');

browser = webdriver.Chrome(options=options,executable_path = './chromedriver')

если тоже не работает, попробуйте увеличить размер окна.


0

Установите и запустите контейнерный Firefox:

docker pull selenium/standalone-firefox
docker run --rm -d -p 4444:4444 --shm-size=2g selenium/standalone-firefox

Подключитесь, используя webdriver.Remote:

driver = webdriver.Remote('http://localhost:4444/wd/hub', DesiredCapabilities.FIREFOX)
driver.set_window_size(1280, 1024)
driver.get('https://www.google.com')
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.