3 * Selenium server manager
7 * Copyright (C) 2010 Dan Nessett <dnessett@yahoo.com>
8 * http://citizendium.org/
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License along
21 * with this program; if not, write to the Free Software Foundation, Inc.,
22 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 * http://www.gnu.org/copyleft/gpl.html
28 class SeleniumServerManager
{
29 private $SeleniumStartServer = false;
31 private $SeleniumServerPid = 'NaN';
32 private $SeleniumServerPort = 4444;
33 private $SeleniumServerStartTimeout = 10; // 10 secs.
34 private $SeleniumServerExecPath;
36 public function __construct( $startServer,
39 $this->OS
= (string)PHP_OS
;
41 if ( isset( $startServer ) ) {
42 $this->SeleniumStartServer
= $startServer;
45 if ( isset( $serverPort ) ) {
46 $this->SeleniumServerPort
= $serverPort;
49 if ( isset( $serverExecPath ) ) {
50 $this->SeleniumServerExecPath
= $serverExecPath;
56 // Getters for certain private attributes. No setters, since they
57 // should not change after the manager object is created.
59 public function getSeleniumStartServer() {
60 return $this->SeleniumStartServer
;
63 public function getSeleniumServerPort() {
64 return $this->SeleniumServerPort
;
67 public function getSeleniumServerPid() {
68 return $this->SeleniumServerPid
;
71 // Changing value of SeleniumStartServer allows starting server after
72 // creation of the class instance. Only allow setting SeleniumStartServer
73 // to true, since after server is started, it is shut down by stop().
75 public function setSeleniumStartServer( $startServer ) {
76 if ( $startServer == true ) {
77 $this->SeleniumStartServer
= true;
81 // return values are: 1) started - server started, 2) failed -
82 // server not started, 3) running - instructed to start server, but
83 // server already running
85 public function start() {
87 if ( !$this->SeleniumStartServer
) {
91 // commented out cases are untested
93 switch ( $this->OS
) {
95 # case' CYGWIN_NT-5.1':
105 return $this->startServerOnUnix();
111 return $this->startServerOnWindows();
120 public function stop() {
122 // commented out cases are untested
124 switch ( $this->OS
) {
126 # case' CYGWIN_NT-5.1':
136 return $this->stopServerOnUnix();
142 return $this->stopServerOnWindows();
151 private function startServerOnUnix() {
154 $user = $_ENV['USER'];
155 // @todo FIXME: This should be a little more generalized :)
156 if ( PHP_OS
== 'Darwin' ) {
157 // Mac OS X's ps barfs on the 'w' param, but doesn't need it.
163 $psCommand = sprintf( $ps, escapeshellarg( $user ) );
164 exec( $psCommand . " | grep -i selenium-server", $output );
166 // Start server. If there is already a server running,
169 if ( isset( $this->SeleniumServerExecPath
) ) {
171 foreach ( $output as $string ) {
172 $found +
= preg_match(
173 '~^(.*)java(.+)-jar(.+)selenium-server~',
178 // Didn't find the selenium server. Start it up.
179 // First set up comamand line suffix.
180 // NB: $! is pid of last job run in background
181 // The echo guarentees it is put into $op when
182 // the exec command is run.
184 $commandSuffix = ' > /dev/null 2>&1' . ' & echo $!';
185 $portText = ' -port ' . $this->SeleniumServerPort
;
186 $command = "java -jar " .
187 escapeshellarg( $this->SeleniumServerExecPath
) .
188 $portText . $commandSuffix;
189 exec( $command, $op );
192 $this->SeleniumServerPid
= $pid;
194 $this->SeleniumServerPid
= 'NaN';
195 // Server start failed.
198 // Wait for the server to startup and listen
199 // on its port. Note: this solution kinda
200 // stinks, since it uses a wait loop - dnessett
202 wfSuppressWarnings();
204 $cnt <= $this->SeleniumServerStartTimeout
;
206 $fp = fsockopen( 'localhost',
207 $this->SeleniumServerPort
,
208 $errno, $errstr, 0 );
212 // Server start succeeded.
219 echo ( "Starting Selenium server timed out.\n" );
222 // server already running.
228 // No Server execution path defined.
232 private function startServerOnWindows() {
237 private function stopServerOnUnix() {
239 if ( !empty( $this->SeleniumServerPid
) &&
240 $this->SeleniumServerPid
!= 'NaN'
242 exec( "kill -9 " . $this->SeleniumServerPid
);
249 private function stopServerOnWindows() {