держать браузер селен открытым с помощью phpunit / selenium - PullRequest
7 голосов
/ 09 мая 2011

при сбое тестов браузер, на котором выполнялись тесты селена, закрывается.это бесполезно при попытке отладки.я знаю, что у меня есть опция снимка экрана при неудаче, но это не помогает без всего контекста.с доступным браузером, я могу нанести ответный удар и проверить, что происходит.

есть ли способ сохранить браузер открытым, даже если подтверждение не выполнено или элементы не найдены?

Ответы [ 6 ]

10 голосов
/ 02 августа 2011

выяснил это случайно через много недель.

при запуске сервера используйте опцию -browserSessionReuse в конце.это будет держать одну сессию браузера открытой во время тестов, а не закрываться при сбое

1 голос
/ 17 февраля 2018

Простое решение состоит в том, чтобы установить для свойства сеанса $ Stop значение true в методе test setUp (). Поскольку собственность является частной, мы должны использовать API Reflection.

    function setUp() {

        ....

        // Set the private property $stopped of session to true, so the window is not closed on error or at the end of tests
        $myClassReflection = new \ReflectionClass( get_class( $this->prepareSession() ) );
        $secret            = $myClassReflection->getProperty( 'stopped' );
        $secret->setAccessible( true );
        $secret->setValue( $this->prepareSession(), true );

        ...
}
1 голос
/ 16 декабря 2011

Относительно ответа о -browserSessionReuse на https://stackoverflow.com/a/6904808/654026, имейте в виду, что вам придется иметь дело с очисткой файлов cookie между выполнением тестов.В противном случае вы можете столкнуться с трудностями при отладке ошибок.

1 голос
/ 10 мая 2011

Возможно, вы вызываете selenium.stop () в конце теста.Вы должны закомментировать эту строку кода и убедиться, что ваш объект селена не уничтожен в конце теста.Это будет держать окно открытым.На этот же вопрос был дан ответ здесь

0 голосов
/ 19 июня 2016

Здесь более чистое решение. Переопределить все классы, связанные с созданием сеанса. Класс сеанса - это место, где сеанс закрыт, поэтому метод 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);
    }
}
0 голосов
/ 18 июня 2016

После долгих часов попыток создать относительно чистый обходной путь, я теперь прибег к очень грязному, но очень легкому хаку. Исходный код phpunit \ selenium сложно переопределить, было бы неплохо, если бы для создания объектов Session использовались фабрики. Я пытался взломать создание объекта путем переопределения и проксирования объектов, но все еще не мог заставить его работать. Наконец, я не хотел тратить больше времени на это и пошел по самому простому и грязному пути, то есть взломал код классов PHPUnit_Extensions_Selenium2TestCase_Session и PHPUnit_Extensions_Selenium2TestCase. В PHPUnit_Extensions_Selenium2TestCase вставлен статический экземпляр $ _instance, который можно использовать для проверки наличия условия сбоя теста. В PHPUnit_Extensions_Selenium2TestCase_Session перехватил метод stop () и запросил статус TestCase. Работает как шарм, но грязно грязно грязно.

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

PHPUnit_Extensions_Selenium2TestCase_Session:

public function stop()
{
    if ($this->stopped || $this->hasFailedTests()) {
        return;
    }
    ....
}

private function hasFailedTests()
{
    $status = PHPUnit_Extensions_Selenium2TestCase::getInstance()->getStatus();
    return $status == \PHPUnit_Runner_BaseTestRunner::STATUS_ERROR
    || $status == \PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...