Como executo o Selenium no Xvfb?

91

Estou na instância EC2. Portanto, não há GUI.

$pip install selenium
$sudo apt-get install firefox xvfb

Então eu faço isso:

$Xvfb :1 -screen 0 1024x768x24 2>&1 >/dev/null &

$DISPLAY=:1 java -jar selenium-server-standalone-2.0b3.jar
05:08:31.227 INFO - Java: Sun Microsystems Inc. 19.0-b09
05:08:31.229 INFO - OS: Linux 2.6.32-305-ec2 i386
05:08:31.233 INFO - v2.0 [b3], with Core v2.0 [b3]
05:08:32.121 INFO - RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub
05:08:32.122 INFO - Version Jetty/5.1.x
05:08:32.123 INFO - Started HttpContext[/selenium-server/driver,/selenium-server/driver]
05:08:32.124 INFO - Started HttpContext[/selenium-server,/selenium-server]
05:08:32.124 INFO - Started HttpContext[/,/]
05:08:32.291 INFO - Started org.openqa.jetty.jetty.servlet.ServletHandler@1186fab
05:08:32.292 INFO - Started HttpContext[/wd,/wd]
05:08:32.295 INFO - Started SocketListener on 0.0.0.0:4444
05:08:32.295 INFO - Started org.openqa.jetty.jetty.Server@1ffb8dc

Ótimo, tudo deve funcionar agora, certo?

Quando executo meu código:

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys

browser = webdriver.Firefox() 
browser.get("http://www.yahoo.com") 

Eu entendi isso:

Error: cannot open display: :0
TIMEX
fonte
2
Se você estiver em um sistema sem o X em execução, display: 0 deve estar disponível. Tente executar o Xvfb: 0 - veja também o xvfb-run mencionado por @ema
fijiaaron
Para futuros seguidores, eu descrevi minha solução para Ubuntu Server: namekdev.net/2016/08/…
Namek

Respostas:

35

abra um terminal e execute este comando xhost +. Este comando precisa ser executado toda vez que você reiniciar sua máquina. Se tudo funcionar bem, você pode adicionar isto aos comandos de inicialização

Certifique-se também de que em seu arquivo / etc / environment há uma linha

export DISPLAY=:0.0 

Em seguida, execute seus testes para ver se o problema foi resolvido.

Todos, por favor, observem o comentário de sardatria abaixo antes de usar isso.

AJ
fonte
Você só precisa executar java -jar selenium-server-standalone-2.0b3.jar na linha de comando e, em seguida, executar seus testes
AJ
Estou em uma instância EC2, portanto não há GUI. xhost: não foi possível abrir o display ": 0.0"
TIMEX
@owa Você também precisa da variável de ambiente DISPLAY no ambiente do cliente.
Keith
10
xhost +é inseguro. Por favor não use. Se você tiver que usar o xhost, adicione a máquina específica que deseja e não + (ou seja, tudo o que for).
Sardathrion - contra o abuso de SE
170

Você pode usar PyVirtualDisplay (um wrapper Python para Xvfb) para executar testes WebDriver sem interface.

#!/usr/bin/env python

from pyvirtualdisplay import Display
from selenium import webdriver

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

# now Firefox will run in a virtual display. 
# you will not see the browser.
browser = webdriver.Firefox()
browser.get('http://www.google.com')
print browser.title
browser.quit()

display.stop()

mais informações


Você também pode usar o xvfbwrapper , que é um módulo semelhante (mas não tem dependências externas):

from xvfbwrapper import Xvfb

vdisplay = Xvfb()
vdisplay.start()

# launch stuff inside virtual display here

vdisplay.stop()

ou melhor ainda, use-o como um gerenciador de contexto:

from xvfbwrapper import Xvfb

with Xvfb() as xvfb:
    # launch stuff inside virtual display here.
    # It starts/stops in this code block.
Corey Goldberg
fonte
2
@Andrei OSX não usa X11 por padrão
sam boosalis
Usei esta resposta para fazê-lo funcionar com vagrant + PyCharm + Django no OS X: stackoverflow.com/q/29343109
chachan
Eu recebo um "navegador parece ter encerrado" quando implemento o código de exibição pyvirtual acima
gtownrower
45

A maneira mais fácil provavelmente é usar xvfb-run:

DISPLAY=:1 xvfb-run java -jar selenium-server-standalone-2.0b3.jar

xvfb-run faz toda a dança da autoridade do X para você, experimente!

ema
fonte
Isso é exatamente o que eu estava procurando. Iniciar o Xvfb sozinho não pareceu funcionar para mim, mas usar o xvfb-run funcionou. Obrigado.
Reina Abolofia
9
O DISPLAY=:1é desnecessário; xvfb-run define a variável de ambiente DISPLAY para outra coisa (geralmente :99) antes de iniciar o comando especificado (no seu caso java -jar selenium-server...)
Alex Dupuy
20

Esta é a configuração que uso:

Antes de executar os testes, execute:

exportar DISPLAY =: 99
/etc/init.d/xvfb start

E depois dos testes:

/etc/init.d/xvfb stop

O init.darquivo que uso é parecido com este:

#! / bin / bash

XVFB = / usr / bin / Xvfb
XVFBARGS = "$ DISPLAY -ac -screen 0 1024x768x16"
PIDFILE = $ {HOME} / xvfb _ $ {DISPLAY: 1} .pid
caso "$ 1" em
  começar)
    echo -n "Iniciando buffer de quadro X virtual: Xvfb"
    / sbin / start-stop-daemon --start --quiet --pidfile $ PIDFILE --make-pidfile --background --exec $ XVFB - $ XVFBARGS
    echo "."
    ;;
  Pare)
    echo -n "Parando o buffer de quadro X virtual: Xvfb"
    / sbin / start-stop-daemon --stop --quiet --pidfile $ PIDFILE
    echo "."
    ;;
  reiniciar)
    $ 0 parada
    $ 0 início
    ;;
  *)
  echo "Uso: /etc/init.d/xvfb {start | stop | restart}"
  saída 1
esac
saída 0
shang
fonte
Fiz exatamente isso e executei meu script. No entanto, ainda recebo o seguinte: Erro: não é possível abrir a tela:: 0. Além disso, preciso executar o servidor selenium java? Parece que não importa se eu o executo ou não ...
TIMEX
2
owalla, se você usa WebDriver, não precisa do Selenium Java Server.
Corey Goldberg
3

Se você usa o Maven, pode usar o xvfb-maven-plugin para iniciar o xvfb antes dos testes, executá-los usando DISPLAYa variável de ambiente relacionada e parar o xvfb depois de tudo.

Toilal
fonte