É 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!

não estilhaçante
fonte

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
Grahaminn
fonte
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)
Stéphane Bruckert
fonte
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 .

AJ
fonte
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.

zona haroon
fonte
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.

郑文勋
fonte
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

Nicholas DiPiazza
fonte
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.

guillemhs
fonte
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.

Vinee-the-Pooh
fonte
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.

U2647
fonte
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')
Max Malysh
fonte