Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions phpstan.dist.neon
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ parameters:
- src
- tests
checkMissingIterableValueType: false
treatPhpDocTypesAsCertain: false
ignoreErrors:
- '#^Method Behat\\Mink\\Tests\\[^:]+Test(Case)?\:\:test\w*\(\) has no return type specified\.$#'
- '#^Method Behat\\Mink\\Tests\\[^:]+Test(Case)?\:\:provide\w*\(\) has no return type specified\.$#'
Expand Down
29 changes: 5 additions & 24 deletions src/Element/Element.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
use Behat\Mink\Driver\DriverInterface;
use Behat\Mink\Exception\ElementNotFoundException;
use Behat\Mink\Selector\SelectorsHandler;
use Behat\Mink\Selector\Xpath\Manipulator;
use Behat\Mink\Session;

/**
Expand All @@ -36,14 +35,9 @@ abstract class Element implements ElementInterface
private $driver;

/**
* @var SelectorsHandler
* @var ElementFinder
*/
private $selectorsHandler;

/**
* @var Manipulator
*/
private $xpathManipulator;
private $elementFinder;

/**
* Initialize element.
Expand All @@ -52,11 +46,10 @@ abstract class Element implements ElementInterface
*/
public function __construct(Session $session)
{
$this->xpathManipulator = new Manipulator();
$this->session = $session;

$this->driver = $session->getDriver();
$this->selectorsHandler = $session->getSelectorsHandler();
$this->elementFinder = $session->getElementFinder();
}

/**
Expand Down Expand Up @@ -94,7 +87,7 @@ protected function getSelectorsHandler()
{
@trigger_error(sprintf('The method %s is deprecated as of 1.7 and will be removed in 2.0', __METHOD__), E_USER_DEPRECATED);

return $this->selectorsHandler;
return $this->session->getSelectorsHandler();
}

/**
Expand Down Expand Up @@ -153,19 +146,7 @@ public function find($selector, $locator)
*/
public function findAll($selector, $locator)
{
if ('named' === $selector) {
$items = $this->findAll('named_exact', $locator);
if (empty($items)) {
$items = $this->findAll('named_partial', $locator);
}

return $items;
}

$xpath = $this->selectorsHandler->selectorToXpath($selector, $locator);
$xpath = $this->xpathManipulator->prepend($xpath, $this->getXpath());

return $this->getDriver()->find($xpath);
return $this->elementFinder->findAll($selector, $locator, $this->getXpath());
}

/**
Expand Down
71 changes: 71 additions & 0 deletions src/Element/ElementFinder.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
<?php

/*
* This file is part of the Mink package.
* (c) Konstantin Kudryashov <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Behat\Mink\Element;

use Behat\Mink\Driver\DriverInterface;
use Behat\Mink\Selector\SelectorsHandler;
use Behat\Mink\Selector\Xpath\Manipulator;

/**
* @final
*/
class ElementFinder
{
/**
* @var DriverInterface
*/
private $driver;
/**
* @var SelectorsHandler
*/
private $selectorsHandler;
/**
* @var Manipulator
*/
private $xpathManipulator;

public function __construct(DriverInterface $driver, SelectorsHandler $selectorsHandler = null, Manipulator $xpathManipulator = null)
{
$this->driver = $driver;
$this->selectorsHandler = $selectorsHandler ?? new SelectorsHandler();
$this->xpathManipulator = $xpathManipulator ?? new Manipulator();
}

/**
* @param string|array $locator
*
* @return NodeElement[]
*/
public function findAll(string $selector, $locator, string $parentXpath)
{
if ('named' === $selector) {
$items = $this->findAll('named_exact', $locator, $parentXpath);
if (empty($items)) {
$items = $this->findAll('named_partial', $locator, $parentXpath);
}

return $items;
}

$xpath = $this->selectorsHandler->selectorToXpath($selector, $locator);
$xpath = $this->xpathManipulator->prepend($xpath, $parentXpath);

return $this->driver->find($xpath);
}

/**
* @internal
*/
public function getSelectorsHandler(): SelectorsHandler
{
return $this->selectorsHandler;
}
}
38 changes: 25 additions & 13 deletions src/Session.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
namespace Behat\Mink;

use Behat\Mink\Driver\DriverInterface;
use Behat\Mink\Element\ElementFinder;
use Behat\Mink\Selector\SelectorsHandler;
use Behat\Mink\Element\DocumentElement;

Expand All @@ -30,27 +31,28 @@ class Session
*/
private $page;
/**
* @var SelectorsHandler
* @var ElementFinder
*/
private $selectorsHandler;
private $elementFinder;

/**
* Initializes session.
*
* @param DriverInterface $driver
* @param SelectorsHandler|null $selectorsHandler
* @param ElementFinder|SelectorsHandler|null $elementFinder
*/
public function __construct(DriverInterface $driver, SelectorsHandler $selectorsHandler = null)
public function __construct(DriverInterface $driver, $elementFinder = null)
{
$driver->setSession($this);

if (null === $selectorsHandler) {
$selectorsHandler = new SelectorsHandler();
if ($elementFinder instanceof SelectorsHandler) {
$elementFinder = new ElementFinder($driver, $elementFinder);
} elseif ($elementFinder === null) {
$elementFinder = new ElementFinder($driver);
} elseif (!$elementFinder instanceof ElementFinder) {
throw new \TypeError(sprintf('Argument #2 of %s expects %s|%s|null, %s given.', __METHOD__, ElementFinder::class, SelectorsHandler::class, \is_object($elementFinder) ? get_class($elementFinder) : gettype($elementFinder)));
}

$this->driver = $driver;
$this->selectorsHandler = $selectorsHandler;
$this->elementFinder = $elementFinder;
$this->page = new DocumentElement($this);

$driver->setSession($this);
}

/**
Expand Down Expand Up @@ -140,14 +142,24 @@ public function getPage()
return $this->page;
}

/**
* @internal
*/
public function getElementFinder(): ElementFinder
{
return $this->elementFinder;
}

/**
* Returns selectors handler.
*
* @return SelectorsHandler
*
* @internal since 1.11
*/
public function getSelectorsHandler()
{
return $this->selectorsHandler;
return $this->elementFinder->getSelectorsHandler();
}

/**
Expand Down
Loading