Skip to content

Commit ceba322

Browse files
committed
Decoupled the DriverInterface from the NodeElement
This avoids a circular dependency. The driver interface now returns an array of XPath for found elements, and Element::find() instantiates the NodeElement for them. The driver is now the low level API which does not depend on any other part of Mink (but used by other parts).
1 parent 6e33d31 commit ceba322

9 files changed

Lines changed: 361 additions & 95 deletions

File tree

src/Behat/Mink/Driver/CoreDriver.php

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
namespace Behat\Mink\Driver;
1212

1313
use Behat\Mink\Exception\UnsupportedDriverActionException;
14-
use Behat\Mink\Session;
1514

1615
/**
1716
* Core driver.
@@ -21,14 +20,6 @@
2120
*/
2221
abstract class CoreDriver implements DriverInterface
2322
{
24-
/**
25-
* {@inheritdoc}
26-
*/
27-
public function setSession(Session $session)
28-
{
29-
throw new UnsupportedDriverActionException('Setting the session is not supported by %s', $this);
30-
}
31-
3223
/**
3324
* {@inheritdoc}
3425
*/

src/Behat/Mink/Driver/DriverInterface.php

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,8 @@
1010

1111
namespace Behat\Mink\Driver;
1212

13-
use Behat\Mink\Element\NodeElement;
1413
use Behat\Mink\Exception\DriverException;
1514
use Behat\Mink\Exception\UnsupportedDriverActionException;
16-
use Behat\Mink\Session;
1715

1816
/**
1917
* Driver interface.
@@ -22,13 +20,6 @@
2220
*/
2321
interface DriverInterface
2422
{
25-
/**
26-
* Sets driver's current session.
27-
*
28-
* @param Session $session
29-
*/
30-
public function setSession(Session $session);
31-
3223
/**
3324
* Starts driver.
3425
*
@@ -270,7 +261,7 @@ public function getWindowName();
270261
*
271262
* @param string $xpath
272263
*
273-
* @return NodeElement[]
264+
* @return string[] An array of XPath queries for the found elements
274265
*
275266
* @throws UnsupportedDriverActionException When operation not supported by the driver
276267
* @throws DriverException When the operation cannot be done

src/Behat/Mink/Element/Element.php

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,24 @@ abstract class Element implements ElementInterface
3939
*/
4040
private $xpathManipulator;
4141

42+
/**
43+
* @var ElementFactory
44+
*/
45+
private $elementFactory;
46+
4247
/**
4348
* Initialize element.
4449
*
4550
* @param DriverInterface $driver
4651
* @param SelectorsHandler $selectorsHandler
52+
* @param ElementFactory $elementFactory
4753
*/
48-
public function __construct(DriverInterface $driver, SelectorsHandler $selectorsHandler)
54+
public function __construct(DriverInterface $driver, SelectorsHandler $selectorsHandler, ElementFactory $elementFactory)
4955
{
5056
$this->xpathManipulator = new Manipulator();
5157
$this->driver = $driver;
5258
$this->selectorsHandler = $selectorsHandler;
59+
$this->elementFactory = $elementFactory;
5360
}
5461

5562
/**
@@ -110,7 +117,7 @@ public function find($selector, $locator)
110117
{
111118
$items = $this->findAll($selector, $locator);
112119

113-
return count($items) ? current($items) : null;
120+
return count($items) ? $items[0] : null;
114121
}
115122

116123
/**
@@ -130,7 +137,13 @@ public function findAll($selector, $locator)
130137
$xpath = $this->selectorsHandler->selectorToXpath($selector, $locator);
131138
$xpath = $this->xpathManipulator->prepend($xpath, $this->getXpath());
132139

133-
return $this->getDriver()->find($xpath);
140+
$elements = array();
141+
142+
foreach ($this->getDriver()->find($xpath) as $elementXpath) {
143+
$elements[] = $this->elementFactory->createNodeElement($elementXpath, $this->driver, $this->selectorsHandler);
144+
}
145+
146+
return $elements;
134147
}
135148

136149
/**
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Mink package.
5+
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
6+
*
7+
* For the full copyright and license information, please view the LICENSE
8+
* file that was distributed with this source code.
9+
*/
10+
11+
namespace Behat\Mink\Element;
12+
13+
use Behat\Mink\Driver\DriverInterface;
14+
use Behat\Mink\Selector\SelectorsHandler;
15+
16+
/**
17+
* Factory for element node.
18+
*
19+
* @author Christophe Coevoet <stof@notk.org>
20+
*/
21+
class ElementFactory
22+
{
23+
public function createNodeElement($xpath, DriverInterface $driver, SelectorsHandler $selectorsHandler)
24+
{
25+
return new NodeElement($xpath, $driver, $selectorsHandler, $this);
26+
}
27+
}

src/Behat/Mink/Element/NodeElement.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,16 @@ class NodeElement extends TraversableElement
2626
/**
2727
* Initializes node element.
2828
*
29-
* @param string $xpath element xpath
29+
* @param string $xpath element xpath
3030
* @param DriverInterface $driver
3131
* @param SelectorsHandler $selectorsHandler
32+
* @param ElementFactory $elementFactory
3233
*/
33-
public function __construct($xpath, DriverInterface $driver, SelectorsHandler $selectorsHandler)
34+
public function __construct($xpath, DriverInterface $driver, SelectorsHandler $selectorsHandler, ElementFactory $elementFactory)
3435
{
3536
$this->xpath = $xpath;
3637

37-
parent::__construct($driver, $selectorsHandler);
38+
parent::__construct($driver, $selectorsHandler, $elementFactory);
3839
}
3940

4041
/**

src/Behat/Mink/Session.php

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
namespace Behat\Mink;
1212

1313
use Behat\Mink\Driver\DriverInterface;
14+
use Behat\Mink\Element\ElementFactory;
1415
use Behat\Mink\Selector\SelectorsHandler;
1516
use Behat\Mink\Element\DocumentElement;
1617

@@ -25,23 +26,32 @@ class Session
2526
private $page;
2627
private $selectorsHandler;
2728

29+
/**
30+
* @var Element\ElementFactory
31+
*/
32+
private $elementFactory;
33+
2834
/**
2935
* Initializes session.
3036
*
31-
* @param DriverInterface $driver
32-
* @param SelectorsHandler $selectorsHandler
37+
* @param DriverInterface $driver
38+
* @param SelectorsHandler|null $selectorsHandler
39+
* @param ElementFactory|null $elementFactory
3340
*/
34-
public function __construct(DriverInterface $driver, SelectorsHandler $selectorsHandler = null)
41+
public function __construct(DriverInterface $driver, SelectorsHandler $selectorsHandler = null, ElementFactory $elementFactory = null)
3542
{
36-
$driver->setSession($this);
37-
3843
if (null === $selectorsHandler) {
3944
$selectorsHandler = new SelectorsHandler();
4045
}
4146

47+
if (null === $elementFactory) {
48+
$elementFactory = new ElementFactory();
49+
}
50+
4251
$this->driver = $driver;
4352
$this->selectorsHandler = $selectorsHandler;
44-
$this->page = new DocumentElement($driver, $selectorsHandler);
53+
$this->elementFactory = $elementFactory;
54+
$this->page = new DocumentElement($driver, $selectorsHandler, $elementFactory);
4555
}
4656

4757
/**

0 commit comments

Comments
 (0)