Skip to content

Commit abcca95

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 73b35e6 commit abcca95

10 files changed

Lines changed: 399 additions & 558 deletions

src/Element/Element.php

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

1313
use Behat\Mink\Driver\DriverInterface;
14-
use Behat\Mink\Selector\SelectorsHandler;
15-
use Behat\Mink\Selector\Xpath\Manipulator;
1614

1715
/**
1816
* Base element.
@@ -29,33 +27,20 @@ abstract class Element implements ElementInterface
2927
private $driver;
3028

3129
/**
32-
* @var SelectorsHandler
30+
* @var ElementFinder
3331
*/
34-
private $selectorsHandler;
35-
36-
/**
37-
* @var Manipulator
38-
*/
39-
private $xpathManipulator;
40-
41-
/**
42-
* @var ElementFactory
43-
*/
44-
private $elementFactory;
32+
private $elementFinder;
4533

4634
/**
4735
* Initialize element.
4836
*
49-
* @param DriverInterface $driver
50-
* @param SelectorsHandler $selectorsHandler
51-
* @param ElementFactory $elementFactory
37+
* @param DriverInterface $driver
38+
* @param ElementFinder $elementFinder
5239
*/
53-
public function __construct(DriverInterface $driver, SelectorsHandler $selectorsHandler, ElementFactory $elementFactory)
40+
public function __construct(DriverInterface $driver, ElementFinder $elementFinder)
5441
{
55-
$this->xpathManipulator = new Manipulator();
5642
$this->driver = $driver;
57-
$this->selectorsHandler = $selectorsHandler;
58-
$this->elementFactory = $elementFactory;
43+
$this->elementFinder = $elementFinder;
5944
}
6045

6146
/**
@@ -124,25 +109,7 @@ public function find($selector, $locator)
124109
*/
125110
public function findAll($selector, $locator)
126111
{
127-
if ('named' === $selector) {
128-
$items = $this->findAll('named_exact', $locator);
129-
if (empty($items)) {
130-
$items = $this->findAll('named_partial', $locator);
131-
}
132-
133-
return $items;
134-
}
135-
136-
$xpath = $this->selectorsHandler->selectorToXpath($selector, $locator);
137-
$xpath = $this->xpathManipulator->prepend($xpath, $this->getXpath());
138-
139-
$elements = array();
140-
141-
foreach ($this->getDriver()->find($xpath) as $elementXpath) {
142-
$elements[] = $this->elementFactory->createNodeElement($elementXpath, $this->driver, $this->selectorsHandler);
143-
}
144-
145-
return $elements;
112+
return $this->elementFinder->findAll($selector, $locator, $this->getXpath());
146113
}
147114

148115
/**

src/Element/ElementFactory.php

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

src/Element/ElementFinder.php

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

src/Element/NodeElement.php

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
use Behat\Mink\KeyModifier;
1515
use Behat\Mink\Driver\DriverInterface;
1616
use Behat\Mink\Exception\ElementNotFoundException;
17-
use Behat\Mink\Selector\SelectorsHandler;
1817

1918
/**
2019
* Page element node.
@@ -31,16 +30,15 @@ class NodeElement extends TraversableElement
3130
/**
3231
* Initializes node element.
3332
*
34-
* @param string $xpath element xpath
35-
* @param DriverInterface $driver
36-
* @param SelectorsHandler $selectorsHandler
37-
* @param ElementFactory $elementFactory
33+
* @param string $xpath element xpath
34+
* @param DriverInterface $driver
35+
* @param ElementFinder $elementFinder
3836
*/
39-
public function __construct($xpath, DriverInterface $driver, SelectorsHandler $selectorsHandler, ElementFactory $elementFactory)
37+
public function __construct($xpath, DriverInterface $driver, ElementFinder $elementFinder)
4038
{
4139
$this->xpath = $xpath;
4240

43-
parent::__construct($driver, $selectorsHandler, $elementFactory);
41+
parent::__construct($driver, $elementFinder);
4442
}
4543

4644
/**

src/Session.php

Lines changed: 6 additions & 6 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

@@ -40,21 +40,21 @@ class Session
4040
*
4141
* @param DriverInterface $driver
4242
* @param SelectorsHandler|null $selectorsHandler
43-
* @param ElementFactory|null $elementFactory
43+
* @param ElementFinder|null $elementFinder
4444
*/
45-
public function __construct(DriverInterface $driver, SelectorsHandler $selectorsHandler = null, ElementFactory $elementFactory = null)
45+
public function __construct(DriverInterface $driver, SelectorsHandler $selectorsHandler = null, ElementFinder $elementFinder = null)
4646
{
4747
if (null === $selectorsHandler) {
4848
$selectorsHandler = new SelectorsHandler();
4949
}
5050

51-
if (null === $elementFactory) {
52-
$elementFactory = new ElementFactory();
51+
if (null === $elementFinder) {
52+
$elementFinder = new ElementFinder($driver, $selectorsHandler);
5353
}
5454

5555
$this->driver = $driver;
5656
$this->selectorsHandler = $selectorsHandler;
57-
$this->page = new DocumentElement($driver, $selectorsHandler, $elementFactory);
57+
$this->page = new DocumentElement($driver, $elementFinder);
5858
}
5959

6060
/**

0 commit comments

Comments
 (0)