keeping selenium browser open with phpunit/selenium

后端 未结 6 2002
我在风中等你
我在风中等你 2020-12-30 13:33

when the tests fail, the browser that the selenium tests were running on closes. this is unhelpful when trying to debug. i know i have the option of a screen shot upon failu

6条回答
  •  难免孤独
    2020-12-30 14:08

    Here a cleaner solution. Overridden all classes involved with session creation. Session class is where the session is closed, so the stop() method needed to be overridden.

    TODO: add parameters to control behaviour, if and when to keep browser window open or not.

    Overridden 5 classes: PHPUnit_Extensions_Selenium2TestCase, PHPUnit_Extensions_Selenium2TestCase_Driver, PHPUnit_Extensions_Selenium2TestCase_Session, PHPUnit_Extensions_Selenium2TestCase_SessionStrategy_Isolated, PHPUnit_Extensions_Selenium2TestCase_SessionStrategy_Shared. Created 2 bootstrap files, 1 for shared browser sessions, 1 for isolated browser sessions. Showing 1 example test.

    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);
        }
    }
    

提交回复
热议问题