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
26 class SeleniumServerManager
{
27 private $SeleniumStartServer = false;
29 private $SeleniumServerPid = 'NaN';
30 private $SeleniumServerPort = 4444;
31 private $SeleniumServerStartTimeout = 10; // 10 secs.
32 private $SeleniumServerExecPath;
34 public function __construct( $startServer,
37 $this->OS
= (string)PHP_OS
;
39 if ( isset( $startServer ) ) {
40 $this->SeleniumStartServer
= $startServer;
43 if ( isset( $serverPort ) ) {
44 $this->SeleniumServerPort
= $serverPort;
47 if ( isset( $serverExecPath ) ) {
48 $this->SeleniumServerExecPath
= $serverExecPath;
54 // Getters for certain private attributes. No setters, since they
55 // should not change after the manager object is created.
57 public function getSeleniumStartServer() {
58 return $this->SeleniumStartServer
;
61 public function getSeleniumServerPort() {
62 return $this->SeleniumServerPort
;
65 public function getSeleniumServerPid() {
66 return $this->SeleniumServerPid
;
69 // Changing value of SeleniumStartServer allows starting server after
70 // creation of the class instance. Only allow setting SeleniumStartServer
71 // to true, since after server is started, it is shut down by stop().
73 public function setSeleniumStartServer( $startServer ) {
74 if ( $startServer == true ) {
75 $this->SeleniumStartServer
= true;
79 // return values are: 1) started - server started, 2) failed -
80 // server not started, 3) running - instructed to start server, but
81 // server already running
83 public function start() {
85 if ( !$this->SeleniumStartServer
) {
89 // commented out cases are untested
91 switch ( $this->OS
) {
93 # case' CYGWIN_NT-5.1':
103 return $this->startServerOnUnix();
109 return $this->startServerOnWindows();
118 public function stop() {
120 // commented out cases are untested
122 switch ( $this->OS
) {
124 # case' CYGWIN_NT-5.1':
134 return $this->stopServerOnUnix();
140 return $this->stopServerOnWindows();
149 private function startServerOnUnix() {
152 $user = $_ENV['USER'];
153 // @todo FIXME: This should be a little more generalized :)
154 if ( PHP_OS
== 'Darwin' ) {
155 // Mac OS X's ps barfs on the 'w' param, but doesn't need it.
161 $psCommand = sprintf( $ps, escapeshellarg( $user ) );
162 exec( $psCommand . " | grep -i selenium-server", $output );
164 // Start server. If there is already a server running,
167 if ( isset( $this->SeleniumServerExecPath
) ) {
169 foreach ( $output as $string ) {
170 $found +
= preg_match(
171 '~^(.*)java(.+)-jar(.+)selenium-server~',
176 // Didn't find the selenium server. Start it up.
177 // First set up comamand line suffix.
178 // NB: $! is pid of last job run in background
179 // The echo guarentees it is put into $op when
180 // the exec command is run.
182 $commandSuffix = ' > /dev/null 2>&1' . ' & echo $!';
183 $portText = ' -port ' . $this->SeleniumServerPort
;
184 $command = "java -jar " .
185 escapeshellarg( $this->SeleniumServerExecPath
) .
186 $portText . $commandSuffix;
187 exec( $command, $op );
190 $this->SeleniumServerPid
= $pid;
192 $this->SeleniumServerPid
= 'NaN';
193 // Server start failed.
196 // Wait for the server to startup and listen
197 // on its port. Note: this solution kinda
198 // stinks, since it uses a wait loop - dnessett
200 wfSuppressWarnings();
202 $cnt <= $this->SeleniumServerStartTimeout
;
204 $fp = fsockopen( 'localhost',
205 $this->SeleniumServerPort
,
206 $errno, $errstr, 0 );
210 // Server start succeeded.
217 echo "Starting Selenium server timed out.\n";
220 // server already running.
226 // No Server execution path defined.
230 private function startServerOnWindows() {
235 private function stopServerOnUnix() {
237 if ( !empty( $this->SeleniumServerPid
) &&
238 $this->SeleniumServerPid
!= 'NaN'
240 exec( "kill -9 " . $this->SeleniumServerPid
);
247 private function stopServerOnWindows() {