Here's a cleaner solution. All classes associated with session creation are redefined. A session class is a session close, so the stop () method must be redefined.
TODO: Add options to control behavior if and when to leave the browser window open or not.
Overridden 5 classes: PHPUnit_Extensions_Selenium2TestCase, PHPUnit_Extensions_Selenium2TestCase_Driver, PHPUnit_Extensions_Selenium2TestCase_Session, PHPUnit_Extensions_Selenium2TestCase_SessionStrategy_Isium_itium_estition_test_test_test_test_sion Created 2 boot files, 1 for shared browser sessions, 1 for isolated browser sessions. Shows 1 test example.
OkxSelenium2TestCase:
namespace OKInfoTech\PhpUnit\Selenium; abstract class OkxSelenium2TestCase extends \PHPUnit_Extensions_Selenium2TestCase { private static $_instance; public static function getInstance() { return self::$_instance; } public function __construct($name = NULL, array $data = array(), $dataName = '') { self::$_instance = $this; parent::__construct($name, $data, $dataName); $params = array( 'host' => 'localhost', 'port' => 4444, 'browser' => NULL, 'browserName' => NULL, 'desiredCapabilities' => array(), 'seleniumServerRequestsTimeout' => 60 ); $this->setUpSessionStrategy($params); } protected function setUpSessionStrategy($params) { parent::setUpSessionStrategy($params); if (isset($params['sessionStrategy'])) { $strat = $params['sessionStrategy']; switch ($strat) { case "isolated": self::$browserSessionStrategy = new OkxSelenium2TestCase_SessionStrategy_Isolated; break; case "shared": self::$browserSessionStrategy = new OkxSelenium2TestCase_SessionStrategy_Shared(new OkxSelenium2TestCase_SessionStrategy_Isolated); break; } } else { self::$browserSessionStrategy = new OkxSelenium2TestCase_SessionStrategy_Isolated; } $this->localSessionStrategy = self::$browserSessionStrategy; } }
OkxSelenium2TestCase_Driver:
namespace OKInfoTech\PhpUnit\Selenium; class OkxSelenium2TestCase_Driver extends \PHPUnit_Extensions_Selenium2TestCase_Driver { private $seleniumServerUrl; private $seleniumServerRequestsTimeout; public function __construct(\PHPUnit_Extensions_Selenium2TestCase_URL $seleniumServerUrl, $timeout = 60) { $this->seleniumServerUrl = $seleniumServerUrl; $this->seleniumServerRequestsTimeout = $timeout; parent::__construct($seleniumServerUrl, $timeout); } public function startSession(array $desiredCapabilities, \PHPUnit_Extensions_Selenium2TestCase_URL $browserUrl) { $sessionCreation = $this->seleniumServerUrl->descend("/wd/hub/session"); $response = $this->curl('POST', $sessionCreation, array( 'desiredCapabilities' => $desiredCapabilities )); $sessionPrefix = $response->getURL(); $timeouts = new \PHPUnit_Extensions_Selenium2TestCase_Session_Timeouts( $this, $sessionPrefix->descend('timeouts'), $this->seleniumServerRequestsTimeout * 1000 ); return new OkxSelenium2TestCase_Session( $this, $sessionPrefix, $browserUrl, $timeouts ); } }
OkxSelenium2TestCase_Session:
namespace OKInfoTech\PhpUnit\Selenium; class OkxSelenium2TestCase_Session extends \PHPUnit_Extensions_Selenium2TestCase_Session { public function stop() { if ($this->hasFailedTests()) { return; } parent::stop(); } private function hasFailedTests() { $status = OkxSelenium2TestCase::getInstance()->getStatus(); return $status == \PHPUnit_Runner_BaseTestRunner::STATUS_ERROR || $status == \PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE; } }
OkxSelenium2TestCase_SessionStrategy_Isolated:
namespace OKInfoTech\PhpUnit\Selenium; class OkxSelenium2TestCase_SessionStrategy_Isolated extends \PHPUnit_Extensions_Selenium2TestCase_SessionStrategy_Isolated { public function session(array $parameters) { $seleniumServerUrl = \PHPUnit_Extensions_Selenium2TestCase_URL::fromHostAndPort($parameters['host'], $parameters['port']); $driver = new OkxSelenium2TestCase_Driver($seleniumServerUrl, $parameters['seleniumServerRequestsTimeout']); $capabilities = array_merge($parameters['desiredCapabilities'], array( 'browserName' => $parameters['browserName'] )); $session = $driver->startSession($capabilities, $parameters['browserUrl']); return $session; } }
OkxSelenium2TestCase_SessionStrategy_Shared:
namespace OKInfoTech\PhpUnit\Selenium; class OkxSelenium2TestCase_SessionStrategy_Shared extends \PHPUnit_Extensions_Selenium2TestCase_SessionStrategy_Shared { }
bootstrapIsolated.php:
require_once dirname(dirname(dirname(__DIR__))) . '/vendor/autoload.php'; spl_autoload_register( function ($class) { static $classes = NULL; static $path = NULL; if ($classes === NULL) { $classes = [ 'okinfotech\phpunit\selenium\okxselenium2testcase' => 'okinfotech/phpunit-selenium/PHPUnit/Extensions/OkxSelenium2TestCase.php', 'okinfotech\phpunit\selenium\okxselenium2testcase_driver' => 'okinfotech/phpunit-selenium/PHPUnit/Extensions/OkxSelenium2TestCase_Driver.php', 'okinfotech\phpunit\selenium\okxselenium2testcase_session' => 'okinfotech/phpunit-selenium/PHPUnit/Extensions/OkxSelenium2TestCase_Session.php', 'okinfotech\phpunit\selenium\okxselenium2testcase_sessionstrategy_isolated' => 'okinfotech/phpunit-selenium/PHPUnit/Extensions/OkxSelenium2TestCase_SessionStrategy_Isolated.php', 'okinfotech\phpunit\selenium\okxselenium2testcase_sessionstrategy_shared' => 'okinfotech/phpunit-selenium/PHPUnit/Extensions/OkxSelenium2TestCase_SessionStrategy_Shared.php', ]; $path = dirname(dirname(dirname(dirname(__FILE__)))) . '/vendor/'; } $cn = strtolower($class); if (isset($classes[$cn])) { require $path . $classes[$cn]; } } ); use OKInfoTech\PhpUnit\Selenium\OkxSelenium2TestCase; OkxSelenium2TestCase::shareSession(false);
bootstrapShared.php:
require_once dirname(dirname(dirname(__DIR__))) . '/vendor/autoload.php'; spl_autoload_register( function ($class) { static $classes = NULL; static $path = NULL; if ($classes === NULL) { $classes = [ 'okinfotech\phpunit\selenium\okxselenium2testcase' => 'okinfotech/phpunit-selenium/PHPUnit/Extensions/OkxSelenium2TestCase.php', 'okinfotech\phpunit\selenium\okxselenium2testcase_driver' => 'okinfotech/phpunit-selenium/PHPUnit/Extensions/OkxSelenium2TestCase_Driver.php', 'okinfotech\phpunit\selenium\okxselenium2testcase_session' => 'okinfotech/phpunit-selenium/PHPUnit/Extensions/OkxSelenium2TestCase_Session.php', 'okinfotech\phpunit\selenium\okxselenium2testcase_sessionstrategy_isolated' => 'okinfotech/phpunit-selenium/PHPUnit/Extensions/OkxSelenium2TestCase_SessionStrategy_Isolated.php', 'okinfotech\phpunit\selenium\okxselenium2testcase_sessionstrategy_shared' => 'okinfotech/phpunit-selenium/PHPUnit/Extensions/OkxSelenium2TestCase_SessionStrategy_Shared.php', ]; $path = dirname(dirname(dirname(dirname(__FILE__)))) . '/vendor/'; } $cn = strtolower($class); if (isset($classes[$cn])) { require $path . $classes[$cn]; } } ); use OKInfoTech\PhpUnit\Selenium\OkxSelenium2TestCase; OkxSelenium2TestCase::shareSession(true);
Selenium02Test:
class Selenium02Test extends OkxSelenium2TestCase { public static function setUpBeforeClass() { } public static function tearDownAfterClass() { } public function setUp() { $this->setHost('...'); $this->setPort(4444); $this->setBrowser('chrome');