Здесь более чистое решение. Переопределить все классы, связанные с созданием сеанса. Класс сеанса - это место, где сеанс закрыт, поэтому метод stop () необходимо переопределить.
TODO: добавить параметры для управления поведением, если и когда держать окно браузера открытым или нет.
Переопределяет 5 классов: PHPUnit_Extensions_Selenium2TestCase, PHPUnit_Extensions_Selenium2TestCase_Driver, PHPUnit_Extensions_Selenium2TestCase_Session, PHPUnit_Extensions_Selenium2TestCase_Sege_Sense_Session_Session_SessionSrateSrateSrateSrate
Создано 2 файла начальной загрузки, 1 для общих сеансов браузера, 1 для изолированных сеансов браузера.
Показан 1 пример теста.
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');
//$this->setBrowser('firefox');
$this->setBrowserUrl('...');
}
public function tearDown()
{
}
public function testPageExists()
{
$this->url('/');
// test if browser window stays open when test fails
$this->assertTrue(false);
}
}