Skip to content

Commit fb7a887

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 e473395 commit fb7a887

10 files changed

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

@@ -31,21 +31,21 @@ class Session
3131
*
3232
* @param DriverInterface $driver
3333
* @param SelectorsHandler|null $selectorsHandler
34-
* @param ElementFactory|null $elementFactory
34+
* @param ElementFinder|null $elementFinder
3535
*/
36-
public function __construct(DriverInterface $driver, SelectorsHandler $selectorsHandler = null, ElementFactory $elementFactory = null)
36+
public function __construct(DriverInterface $driver, SelectorsHandler $selectorsHandler = null, ElementFinder $elementFinder = null)
3737
{
3838
if (null === $selectorsHandler) {
3939
$selectorsHandler = new SelectorsHandler();
4040
}
4141

42-
if (null === $elementFactory) {
43-
$elementFactory = new ElementFactory();
42+
if (null === $elementFinder) {
43+
$elementFinder = new ElementFinder($driver, $selectorsHandler);
4444
}
4545

4646
$this->driver = $driver;
4747
$this->selectorsHandler = $selectorsHandler;
48-
$this->page = new DocumentElement($driver, $selectorsHandler, $elementFactory);
48+
$this->page = new DocumentElement($driver, $elementFinder);
4949
}
5050

5151
/**

0 commit comments

Comments
 (0)