Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Commit

Permalink
Merge branch 'release/0.3.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
everzet committed May 16, 2011
2 parents faa9007 + 72e1a54 commit 4912e72
Show file tree
Hide file tree
Showing 8 changed files with 246 additions and 172 deletions.
5 changes: 5 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
0.3.0 / 2011-05-17

* Rewritten from scratch Mink drivers handler. Now it's sessions handler. And Mink now
sessions-centric tool. See examples in readme. Much cleaner API now.

0.2.4 / 2011-05-12
==================

Expand Down
36 changes: 21 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,32 +10,38 @@ Usage
<?php

use Behat\Mink\Mink,
Behat\Mink\Session,
Behat\Mink\Driver\GoutteDriver,
Behat\Mink\Driver\SahiDriver;

$startUrl = 'http://example.com';

// init Mink and register drivers
$mink = new Mink();
$mink->registerDriver('goutte', new GoutteDriver($startUrl), true); // last argument === isDefault
$mink->registerDriver('javascript', new SahiDriver($startUrl, 'firefox'));
$mink->registerDriver('symfony2', new GoutteDriver($startUrl, $container->get('client')));
$mink->registerDriver('custom', new MyCustomDriver($startUrl));

// run in default driver ("goutte" is default driver - last argument to registerDriver())
$mink->switchToDefaultDriver();
$mink = new Mink(
'goutte1' => new Session(new GoutteDriver($startUrl)),
'goutte2' => new Session(new GoutteDriver($startUrl)),
'javascript' => new Session(new SahiDriver($startUrl, 'firefox')),
'custom' => new Session(new MyCustomDriver($startUrl))
);

// set active session name
$mink->setActiveSessionName('goutte2');

// call getSession without argument will always return active session if has one (goutte2 here)
$mink->getSession()->getPage()->findLink('Downloads')->click();
echo $mink->getSession()->getPage()->getContent();

// run in javascript (Sahi) driver
$mink->switchToDriver('javascript');
$mink->getSession()->getPage()->findLink('Downloads')->click();
echo $mink->getSession()->getPage()->getContent();
$mink->getSession('javascript')->getPage()->findLink('Downloads')->click();
echo $mink->getSession('javascript')->getPage()->getContent();

// run in custom driver
$mink->switchToDriver('custom');
$mink->getSession()->getPage()->findLink('Downloads')->click();
echo $mink->getSession()->getPage()->getContent();
$mink->getSession('custom')->getPage()->findLink('Downloads')->click();
echo $mink->getSession('custom')->getPage()->getContent();

// mix sessions
$mink->getSession('goutte1')->getPage()->findLink('Chat')->click();
$mink->getSession('goutte2')->getPage()->findLink('Chat')->click();
```

Existing Sahi session usage
Expand All @@ -47,7 +53,7 @@ Everytime Mink inits SahiDriver - it tries to connect to the browser with specif
<?php

$client = new \Behat\SahiClient\Client(new \Behat\SahiClient\Connection('SAHI_SID'));
$mink->registerDriver('javascript', new SahiDriver($startUrl, 'firefox', $client));
$mink->registerSession('javascript', new Session(new SahiDriver($startUrl, 'firefox', $client)));
```

`SAHI_SID` could be any unique string.
Expand Down
28 changes: 15 additions & 13 deletions src/Behat/Mink/Integration/MinkEnvironment.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use Behat\Behat\Environment\Environment;

use Behat\Mink\Mink,
Behat\Mink\Session,
Behat\Mink\Driver\GoutteDriver,
Behat\Mink\Driver\SahiDriver;

Expand Down Expand Up @@ -35,7 +36,7 @@ public function __construct()
{
$world = $this;

$world->drivers = array();
$world->sessions = array();
$world->getPathTo = function($path) use($world) {
$startUrl = rtrim($world->getParameter('start_url'), '/') . '/';

Expand All @@ -54,7 +55,7 @@ public function getMink()

if (null === $mink) {
$mink = new Mink();
$this->registerMinkDrivers($mink);
$this->registerMinkSessions($mink);
}

return $mink;
Expand All @@ -63,45 +64,46 @@ public function getMink()
/**
* Returns current Mink session.
*
* @param string|null name of the session OR active session will be used
*
* @return Behat\Mink\Session
*/
public function getSession()
public function getSession($name = null)
{
return $this->getMink()->getSession();
return $this->getMink()->getSession($name);
}

/**
* Registers drivers on mink.
* Registers sessions on mink.
*
* @param Behat\Mink\Mink $mink
*/
private function registerMinkDrivers(Mink $mink)
private function registerMinkSessions(Mink $mink)
{
if (null === $this->getParameter('start_url')) {
throw new \InvalidArgumentException('Specify start_url environment parameter');
}
$startUrl = $this->getParameter('start_url');
$defaultDriver = $this->getParameter('default_driver') ?: 'goutte';
$browser = $this->getParameter('browser') ?: 'firefox';
$startUrl = $this->getParameter('start_url');
$browser = $this->getParameter('browser') ?: 'firefox';

$config = $this->getParameter('goutte', array());
$goutte = new GoutteClient(
isset($config['zend_config']) ? $config['zend_config'] : array(),
isset($config['server_parameters']) ? $config['server_parameters'] : array()
);
$mink->registerDriver('goutte', new GoutteDriver($startUrl, $goutte), 'goutte' === $defaultDriver);
$mink->registerSession('goutte', new Session(new GoutteDriver($startUrl, $goutte)));

$config = $this->getParameter('sahi', array());
$client = new SahiClient(new SahiConnection(
isset($config['sid']) ? $config['sid'] : uniqid(),
isset($config['host']) ? $config['host'] : 'localhost',
isset($config['port']) ? $config['port'] : 9999
));
$mink->registerDriver('sahi', new SahiDriver($startUrl, $browser, $client), 'sahi' === $defaultDriver);
$mink->registerSession('sahi', new Session(new SahiDriver($startUrl, $browser, $client)));


foreach ($this->drivers as $alias => $driver) {
$mink->registerDriver($alias, $driver, $driver === $this->getDefaultDriverName());
foreach ($this->sessions as $name => $session) {
$mink->registerSession($name, $session);
}
}
}
19 changes: 10 additions & 9 deletions src/Behat/Mink/Integration/support/hooks.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,20 @@
$scenario = $event instanceof ScenarioEvent ? $event->getScenario() : $event->getOutline();
$environment = $event->getEnvironment();

$driver = null;
$session = null;
foreach ($scenario->getTags() as $tag) {
if ('javascript' === $tag) {
$driver = 'sahi';
$session = 'sahi';
} elseif (preg_match('/^mink\:([^\n]+)/', $tag, $matches)) {
$driver = $matches[1];
$session = $matches[1];
}
}
if (null !== $driver) {
$environment->getMink()->switchToDriver($driver);
} else {
$environment->getMink()->switchToDefaultDriver();
}

$environment->getMink()->resetDriver();
$environment->getMink()->setActiveSessionName(
$session ?: ($environment->getParameter('default_driver') ?: 'goutte')
);

if ($environment->getSession()->isStarted()) {
$environment->getSession()->reset();
}
});
129 changes: 57 additions & 72 deletions src/Behat/Mink/Mink.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,134 +20,119 @@
*/
class Mink
{
private $selectorsHandler;
private $defaultDriverName;
private $currentDriverName;
private $drivers = array();
private $activeSessionName;
private $sessions = array();

/**
* Initializes mink.
*
* @param Behat\Mink\Selector\SelectorsHandler $selectorsHandler
*/
public function __construct(SelectorsHandler $selectorsHandler = null)
public function __construct(array $sessions = array())
{
if (null === $selectorsHandler) {
$selectorsHandler = new SelectorsHandler();
foreach ($sessions as $name => $session) {
$this->registerSession($name, $session);
}

$this->selectorsHandler = $selectorsHandler;
}

/**
* Stops all started drivers.
* Stops all started sessions.
*/
public function __destruct()
{
$this->stopDrivers();
$this->stopSessions();
}

/**
* Registers new driver.
* Registers new session.
*
* @param string $name driver alias name
* @param Behat\Mink\Driver\DriverInterface $driver driver instance
* @param Boolean $isDefault should this driver be the default one?
* @param string $name session alias name
* @param Behat\Mink\Session $session session instance
*/
public function registerDriver($name, DriverInterface $driver, $isDefault = false)
public function registerSession($name, Session $session)
{
$name = strtolower($name);

$this->drivers[$name] = $driver;

if ($isDefault) {
$this->defaultDriverName = $name;
}
$this->sessions[$name] = $session;
}

/**
* Switches mink to specific driver.
* Checks whether session with specified name is registered.
*
* @param string $name
*
* @param string $name driver alias name
* @return Boolean
*/
public function switchToDriver($name)
public function hasSession($name)
{
$name = strtolower($name);

if (!isset($this->drivers[$name])) {
throw new \InvalidArgumentException(sprintf('Driver "%s" is not registered.', $name));
}

if (null !== $this->currentDriverName && $name === $this->currentDriverName) {
return;
}

$this->currentDriverName = $name;
return isset($this->sessions[strtolower($name)]);
}

/**
* Switches mink to default driver.
* Sets active session name to use.
*
* @param null|string $name name of the registered session
*/
public function switchToDefaultDriver()
public function setActiveSessionName($name)
{
if (null === $this->defaultDriverName) {
throw new \RuntimeException('Default driver is not defined.');
}
$name = strtolower($name);

$this->switchToDriver($this->defaultDriverName);
}
if (!isset($this->sessions[$name])) {
throw new \InvalidArgumentException(sprintf('session "%s" is not registered.', $name));
}

/**
* Resets driver (between tests for example).
*/
public function resetDriver()
{
$this->getDriver()->reset();
$this->activeSessionName = $name;
}

/**
* Stop all started drivers.
* Returns currently active session name or null if none.
*
* @return null|string
*/
public function stopDrivers()
public function getActiveSessionName()
{
foreach ($this->drivers as $driver) {
if ($driver->isStarted()) {
$driver->stop();
}
}
return $this->activeSessionName;
}

/**
* Returns mink session, initialized with current (or default) driver.
* Returns registered session by it's name or active one.
*
* @param string $name session name
*
* @return Behat\Mink\Session
*/
public function getSession()
public function getSession($name = null)
{
static $session;
$name = strtolower($name) ?: $this->activeSessionName;

if (null === $name) {
throw new \InvalidArgumentException('specify session name to get');
}

if (null === $session || $session->getDriver() !== $this->getDriver()) {
$session = new Session($this->getDriver(), $this->selectorsHandler);
if (!isset($this->sessions[$name])) {
throw new \InvalidArgumentException(sprintf('session "%s" is not registered.', $name));
}

$session = $this->sessions[$name];

// start session if needed
if (!$session->isStarted()) {
$session->start();
$this->activeSessionName = $name;
}

return $session;
}

/**
* Returns current (or default) driver.
*
* @return Behat\Mink\Driver\DriverInterface
* Stop all started sessions.
*/
private function getDriver()
public function stopSessions()
{
if (null === $this->currentDriverName) {
$this->switchToDefaultDriver();
}

if (!$this->drivers[$this->currentDriverName]->isStarted()) {
$this->drivers[$this->currentDriverName]->start();
foreach ($this->sessions as $session) {
if ($session->isStarted()) {
$session->stop();
}
}

return $this->drivers[$this->currentDriverName];
}
}
Loading

0 comments on commit 4912e72

Please sign in to comment.