Skip to content

Commit c48d7d1

Browse files
committed
Moved the search of elements to an ElementFinder
This extracts the complex logic out of Element::findAll. The logic is better encapsulated and this keeps the collaborators of the element to a sane number. The ElementFactory introduced previously in the refactoring (mostly to allow mocking the elements properly after moving the instantiation out of the driver) is now gone. the ElementFinder is responsible for instantiating the NodeElement.
1 parent cbd8e37 commit c48d7d1

File tree

10 files changed

+384
-547
lines changed

10 files changed

+384
-547
lines changed

src/Element/Element.php

Lines changed: 7 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212

1313
use Behat\Mink\Driver\DriverInterface;
1414
use Behat\Mink\Exception\ElementNotFoundException;
15-
use Behat\Mink\Selector\SelectorsHandler;
16-
use Behat\Mink\Selector\Xpath\Manipulator;
1715

1816
/**
1917
* Base element.
@@ -30,33 +28,20 @@ abstract class Element implements ElementInterface
3028
private $driver;
3129

3230
/**
33-
* @var SelectorsHandler
31+
* @var ElementFinder
3432
*/
35-
private $selectorsHandler;
36-
37-
/**
38-
* @var Manipulator
39-
*/
40-
private $xpathManipulator;
41-
42-
/**
43-
* @var ElementFactory
44-
*/
45-
private $elementFactory;
33+
private $elementFinder;
4634

4735
/**
4836
* Initialize element.
4937
*
50-
* @param DriverInterface $driver
51-
* @param SelectorsHandler $selectorsHandler
52-
* @param ElementFactory $elementFactory
38+
* @param DriverInterface $driver
39+
* @param ElementFinder $elementFinder
5340
*/
54-
public function __construct(DriverInterface $driver, SelectorsHandler $selectorsHandler, ElementFactory $elementFactory)
41+
public function __construct(DriverInterface $driver, ElementFinder $elementFinder)
5542
{
56-
$this->xpathManipulator = new Manipulator();
5743
$this->driver = $driver;
58-
$this->selectorsHandler = $selectorsHandler;
59-
$this->elementFactory = $elementFactory;
44+
$this->elementFinder = $elementFinder;
6045
}
6146

6247
/**
@@ -125,25 +110,7 @@ public function find($selector, $locator)
125110
*/
126111
public function findAll($selector, $locator)
127112
{
128-
if ('named' === $selector) {
129-
$items = $this->findAll('named_exact', $locator);
130-
if (empty($items)) {
131-
$items = $this->findAll('named_partial', $locator);
132-
}
133-
134-
return $items;
135-
}
136-
137-
$xpath = $this->selectorsHandler->selectorToXpath($selector, $locator);
138-
$xpath = $this->xpathManipulator->prepend($xpath, $this->getXpath());
139-
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;
113+
return $this->elementFinder->findAll($selector, $locator, $this->getXpath());
147114
}
148115

149116
/**

src/Element/ElementFactory.php

Lines changed: 0 additions & 27 deletions
This file was deleted.

src/Element/ElementFinder.php

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
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+
use Behat\Mink\Selector\Xpath\Manipulator;
16+
17+
class ElementFinder
18+
{
19+
private $driver;
20+
private $selectorsHandler;
21+
private $xpathManipulator;
22+
23+
public function __construct(DriverInterface $driver, SelectorsHandler $selectorsHandler = null, Manipulator $xpathManipulator = null)
24+
{
25+
$this->driver = $driver;
26+
$this->selectorsHandler = $selectorsHandler ?: new SelectorsHandler();
27+
$this->xpathManipulator = $xpathManipulator ?: new Manipulator();
28+
}
29+
30+
/**
31+
* @param string $selector
32+
* @param string|array $locator
33+
* @param string $parentXpath
34+
*
35+
* @return NodeElement[]
36+
*/
37+
public function findAll($selector, $locator, $parentXpath)
38+
{
39+
if ('named' === $selector) {
40+
$items = $this->findAll('named_exact', $locator, $parentXpath);
41+
if (empty($items)) {
42+
$items = $this->findAll('named_partial', $locator, $parentXpath);
43+
}
44+
45+
return $items;
46+
}
47+
48+
$xpath = $this->selectorsHandler->selectorToXpath($selector, $locator);
49+
$xpath = $this->xpathManipulator->prepend($xpath, $parentXpath);
50+
51+
$elements = array();
52+
53+
foreach ($this->driver->find($xpath) as $elementXpath) {
54+
$elements[] = new NodeElement($elementXpath, $this->driver, $this);
55+
}
56+
57+
return $elements;
58+
}
59+
}

src/Element/NodeElement.php

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212

1313
use Behat\Mink\Driver\DriverInterface;
1414
use Behat\Mink\Exception\ElementNotFoundException;
15-
use Behat\Mink\Selector\SelectorsHandler;
1615

1716
/**
1817
* Page element node.
@@ -26,16 +25,15 @@ class NodeElement extends TraversableElement
2625
/**
2726
* Initializes node element.
2827
*
29-
* @param string $xpath element xpath
30-
* @param DriverInterface $driver
31-
* @param SelectorsHandler $selectorsHandler
32-
* @param ElementFactory $elementFactory
28+
* @param string $xpath element xpath
29+
* @param DriverInterface $driver
30+
* @param ElementFinder $elementFinder
3331
*/
34-
public function __construct($xpath, DriverInterface $driver, SelectorsHandler $selectorsHandler, ElementFactory $elementFactory)
32+
public function __construct($xpath, DriverInterface $driver, ElementFinder $elementFinder)
3533
{
3634
$this->xpath = $xpath;
3735

38-
parent::__construct($driver, $selectorsHandler, $elementFactory);
36+
parent::__construct($driver, $elementFinder);
3937
}
4038

4139
/**

src/Session.php

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

1313
use Behat\Mink\Driver\DriverInterface;
14-
use Behat\Mink\Element\ElementFactory;
14+
use Behat\Mink\Element\ElementFinder;
1515
use Behat\Mink\Selector\SelectorsHandler;
1616
use Behat\Mink\Element\DocumentElement;
1717

@@ -27,31 +27,31 @@ class Session
2727
private $selectorsHandler;
2828

2929
/**
30-
* @var Element\ElementFactory
30+
* @var Element\ElementFinder
3131
*/
32-
private $elementFactory;
32+
private $elementFinder;
3333

3434
/**
3535
* Initializes session.
3636
*
3737
* @param DriverInterface $driver
3838
* @param SelectorsHandler|null $selectorsHandler
39-
* @param ElementFactory|null $elementFactory
39+
* @param ElementFinder|null $elementFinder
4040
*/
41-
public function __construct(DriverInterface $driver, SelectorsHandler $selectorsHandler = null, ElementFactory $elementFactory = null)
41+
public function __construct(DriverInterface $driver, SelectorsHandler $selectorsHandler = null, ElementFinder $elementFinder = null)
4242
{
4343
if (null === $selectorsHandler) {
4444
$selectorsHandler = new SelectorsHandler();
4545
}
4646

47-
if (null === $elementFactory) {
48-
$elementFactory = new ElementFactory();
47+
if (null === $elementFinder) {
48+
$elementFinder = new ElementFinder($driver, $selectorsHandler);
4949
}
5050

5151
$this->driver = $driver;
5252
$this->selectorsHandler = $selectorsHandler;
53-
$this->elementFactory = $elementFactory;
54-
$this->page = new DocumentElement($driver, $selectorsHandler, $elementFactory);
53+
$this->elementFinder = $elementFinder;
54+
$this->page = new DocumentElement($driver, $elementFinder);
5555
}
5656

5757
/**

0 commit comments

Comments
 (0)