É possível executar o driver da web Selenium (Firefox) sem uma GUI?


113

Estamos considerando atualizar nosso servidor de produção do Ubuntu- desktop 10.04 para o Ubuntu- server 12.04.

Temos vários serviços em execução em nosso sistema operacional de desktop atual, como Selenium Web Driver. Minha pergunta é: o Selenium Web Driver pode ser executado a partir de um sistema baseado em CLI?

Meu pensamento imediato é que não pode, porque depende do Firefox, mas gostaria que alguém provasse que estou errado!


Respostas:


102

O que você está procurando é um .

Sim, é possível executar o Selenium no Firefox sem controle. Aqui está uma postagem que você pode seguir.

Aqui está o resumo das etapas para configurar o 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
Isso funciona e oferece suporte a capturas de tela. Eu uso isso. Ele também funciona com o Google Chrome.
Isaac

Eu não acho que isso funcione mais (pelo menos não facilmente, porque requer um novo geckodriver muito parecido com o Chrome)
Archimedes Trajano

1
@ArchimedesTrajano Isso ainda funciona. As instruções são para criar um display virtual usando Xvfb, não para instalar e configurar o Selenium (o que requer ter geckodriverno caminho).
expz

2
Gosto de fazer isso de dentro do Python, que você pode fazer com subprocess.Popen('Xvfb...')ou os.system('Xvfb...'), mas certifique-se de fazer isso antes de importar o driver da web.
wordsforthewise

4
esse link agora está quebrado
oldboy

22

O Chrome agora tem um modo sem cabeça:

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

4
PhantomJS não está em desenvolvimento ativo. O repositório Git está arquivado.
Wojciech Jakubas

1
O Selenium também parou de oferecer suporte ao PhantomJS com a seguinte mensagem "UserWarning: o suporte do Selenium para PhantomJS foi depreciado, use versões headless do Chrome ou Firefox"
Jörg

11

Sim. Você pode usar HTMLUnitDriverpara FirefoxDriverao iniciar o webdriver. Esta é a configuração do navegador sem cabeça. Os detalhes podem ser encontrados aqui .


1
Isso suportaria funções como save_screenshot ()? coreygoldberg.blogspot.co.uk/2011/06/…
nonshatter

Ainda não tentei, mas pode ser possível porque você ainda está efetivamente criando uma IU, mas exibindo-a em uma janela 'virtual'.
grahaminn

2
HTMLUnitDriver NÃO oferece suporte para captura de tela, pois o conteúdo não é renderizado de forma alguma (Edição 1361). Uma alternativa que posso imaginar é usar getHTMLSource e mostrar a página HTML em vez de uma captura de tela.
AJ de

10

Se você deseja suporte para navegador sem interface, então há outra abordagem que você pode adotar.

https://github.com/detro/ghostdriver

Foi anunciado durante a Conferência Selenium e ainda está em desenvolvimento. Ele usa o PhantomJS como navegador e é muito melhor que o HTMLUnitDriver, ainda não há screenshots, mas ainda está em desenvolvimento ativo.


4

Um opcional é usar pyvirtualdisplayassim:

from pyvirtualdisplay import Display

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

#do selenium job here

display.close()

Uma versão mais curta é:

with Display() as display:
    # selenium job here

Geralmente é um encapsulado de python xvfbe, de alguma forma, mais conveniente.

A propósito, embora PhantomJSseja um navegador sem interface e nenhuma janela será aberta se você usá-lo, parece que PhantomJSainda precisa de um ambiente gui para funcionar.

Recebi o código de erro -6 quando uso em PhantomJS()vez de Firefox()no modo sem cabeça (console conectado à massa). Porém está tudo ok no ambiente de trabalho.


3

ATUALIZAÇÃO: Você não precisa mais do XVFB para rodar o Firefox sem cabeça. Firefox v55 + no Linux e Firefox v56 + no Windows / Mac agora oferece suporte à execução sem comando.

Eu adicionei alguma documentação de como usar aqui:

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


1
Os comentários não são para discussão extensa; esta conversa foi movida para o chat .
Bhargav Rao

Isso não funcionou para mim. Não tenho certeza, mas acho que XVFB ainda é necessário.
Max Malysh

Tenho usado navegadores sem cabeça no Firefox e no Chrome há vários anos. A interface WebDriver para Selenium agora suporta até mesmo um parâmetro setHeadless.
Nicholas DiPiazza


1

Esteja ciente de que o webclient HtmlUnitDriver é de thread único e o Ghostdriver possui apenas 40% das funcionalidades para ser um WebDriver.

No entanto, o Ghostdriver foi executado corretamente para os testes e tenho problemas para conectá-lo ao hub WebDriver.


Isso fornece alguma informação nova que as outras respostas não fornecem?
Austin Henley

0

Sim, você pode executar scripts de teste sem um navegador, mas você deve executá-los no modo headless.


0

talvez você precise definir a dimensão do tamanho da janela. Assim como:

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')

se também não estiver funcionando, tente aumentar a dimensão do tamanho da janela.


0

Instale e execute o Firefox em contêiner:

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

Conecte usando webdriver.Remote:

driver = webdriver.Remote('http://localhost:4444/wd/hub', DesiredCapabilities.FIREFOX)
driver.set_window_size(1280, 1024)
driver.get('https://www.google.com')
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.