rlib
rlib

Reputation: 7867

Selenium headless does not run on CentOS 7 with Perl, "no display specified"

I try to run headless Selenium on CentOS7:

# cat /etc/os-release 
NAME="Red Hat Enterprise Linux Server"
VERSION="7.2 (Maipo)"

I installed Xvfb and run it as

# /usr/bin/Xvfb :99

I installed firefox:

# firefox -v
Mozilla Firefox 38.5.0

and run it to check if it can be run at all:

# export DISPLAY=:99
# firefox

This is the output:

# firefox
Xlib:  extension "RANDR" missing on display ":99".
console.error: 
  [CustomizableUI]
  Custom widget with id loop-button does not return a valid node
console.error: 
  [CustomizableUI]
  Custom widget with id loop-button does not return a valid node
GLib-GIO-Message: Using the 'memory' GSettings backend.  Your settings will not be saved or shared with other applications.

Firefox seems to be running after that command:

# ps aux | grep firefox
root     29476  7.3 14.9 852356 152256 pts/3   Sl+  10:30   0:03 /usr/lib64/firefox/firefox

EDIT Yes, it's running. Taking screenshot from the Xvfb by

DISPLAY=:99 import -window root -crop 1264x948+0+0  /tmp/screenshot.jpg

I can see enter image description here

Now the problematic part.

I installed Selenium Remote Driver for perl

# cpanm Selenium::Remote::Driver

Then I ran standalone selenium driver:

# java -jar selenium-server-standalone-2.49.0.jar 

Now I run test script:

#!/usr/bin/perl
use strict;
use warnings;
use Selenium::Remote::Driver;
my $driver = Selenium::Remote::Driver->new(browser_name=>'firefox');
$driver->get('http://www.google.com');
print $driver->get_title();
$driver->quit();

After 45 second I get error from the driver:

Could not create new session: Unable to connect to host 127.0.0.1 on port 7055 after 45000 ms. Firefox console output:
Error: no display specified
 at (eval 89) line 510.

Seems like firefox launched by the driver does not see DISPLAY environment variable. I try to add it from the script:

#!/usr/bin/perl
use strict;
use warnings;
use Selenium::Remote::Driver;
$ENV{DISPLAY}=":99";
my $driver = Selenium::Remote::Driver->new(browser_name=>'firefox');
$driver->get('http://www.google.com');
print $driver->get_title();
$driver->quit();

It does not help, the previous error remains. What do I do?

EDIT2

I tried the current setup with Python. All works.

# pip install selenium

And used the following test script:

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

driver = webdriver.Firefox()
driver.get("http://www.python.org")
f = open('ptn-sel.txt', 'w')
f.write(driver.title)
driver.close()
f.close()

I understand it's problem of Perl driver.... Any suggestions?

Upvotes: 2

Views: 1887

Answers (1)

Etan Reisner
Etan Reisner

Reputation: 81002

Is python using the standalone server or running firefox itself?

If perl is using the server and the server is spawning firefox then you need $DISPLAY set in the server processes environment not the script's environment. (By running export DISPLAY=:99; java -jar selenium-server-standalone-2.49.0.jaror similar.)

If you don't want to use the standalone server at all then Selenium::Firefox looks like it might be interesting.

Upvotes: 3

Related Questions