added MinkDictionary trait
This commit is contained in:
27
README.md
27
README.md
@@ -53,7 +53,7 @@ activate `MinkExtension`:
|
|||||||
Usage
|
Usage
|
||||||
-----
|
-----
|
||||||
|
|
||||||
After installing extension, there would be 3 usage options available for you:
|
After installing extension, there would be 4 usage options available for you:
|
||||||
|
|
||||||
* Subcontexting/extending `Behat\MinkExtension\Context\RawMinkContext` in your feature suite.
|
* Subcontexting/extending `Behat\MinkExtension\Context\RawMinkContext` in your feature suite.
|
||||||
This will give you ability to use preconfigured `Mink` instance altogether with some
|
This will give you ability to use preconfigured `Mink` instance altogether with some
|
||||||
@@ -66,6 +66,9 @@ After installing extension, there would be 3 usage options available for you:
|
|||||||
* Subcontexting/extending `Behat\MinkExtension\Context\MinkContext` in your feature suite.
|
* Subcontexting/extending `Behat\MinkExtension\Context\MinkContext` in your feature suite.
|
||||||
Exactly like previous option, but also provides lot of predefined step definitions out
|
Exactly like previous option, but also provides lot of predefined step definitions out
|
||||||
of the box.
|
of the box.
|
||||||
|
* If you're on the php 5.4+, you can simply use `Behat\MinkExtension\Context\MinkDictionary`
|
||||||
|
trait inside your `FeatureContext` or any of its subcontexts. This trait will provide
|
||||||
|
all the needed methods, hooks and definitions for you to start.
|
||||||
* Implementing `Behat\MinkExtension\Context\MinkAwareContextInterface` with your context or its
|
* Implementing `Behat\MinkExtension\Context\MinkAwareContextInterface` with your context or its
|
||||||
subcontexts.
|
subcontexts.
|
||||||
This will give you more customization options. Also, you can use this mechanism on multiple
|
This will give you more customization options. Also, you can use this mechanism on multiple
|
||||||
@@ -97,6 +100,28 @@ class FeatureContext extends MinkContext
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Dictionary usage example:
|
||||||
|
|
||||||
|
``` php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Behat\Behat\Context\BehatContext;
|
||||||
|
use Behat\MinkExtension\Context\MinkDictionary;
|
||||||
|
|
||||||
|
class FeatureContext extends BehatContext
|
||||||
|
{
|
||||||
|
use MinkDictionary;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Then /^I wait for the suggestion box to appear$/
|
||||||
|
*/
|
||||||
|
public function iWaitForTheSuggestionBoxToAppear()
|
||||||
|
{
|
||||||
|
$this->getSession()->wait(5000, "$('.suggestions-results').children().length > 0");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
Copyright
|
Copyright
|
||||||
---------
|
---------
|
||||||
|
|
||||||
|
|||||||
@@ -47,7 +47,20 @@ class MinkAwareContextInitializer implements ContextInitializerInterface
|
|||||||
*/
|
*/
|
||||||
public function supports(ContextInterface $context)
|
public function supports(ContextInterface $context)
|
||||||
{
|
{
|
||||||
return $context instanceof MinkAwareContextInterface;
|
// if context/subcontext implements MinkAwareContextInterface
|
||||||
|
if ($context instanceof MinkAwareContextInterface) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if context/subcontext uses MinkDictionary trait
|
||||||
|
$refl = new \ReflectionObject($context);
|
||||||
|
if (method_exists($refl, 'getTraitNames')) {
|
||||||
|
if (in_array('Behat\\MinkExtension\\Context\\MinkDictionary', $refl->getTraitNames())) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -4,7 +4,8 @@ namespace Behat\MinkExtension\Context;
|
|||||||
|
|
||||||
use Behat\Gherkin\Node\TableNode;
|
use Behat\Gherkin\Node\TableNode;
|
||||||
|
|
||||||
use Behat\Behat\Context\TranslatedContextInterface;
|
use Behat\Behat\Context\TranslatedContextInterface,
|
||||||
|
Behat\Behat\Event\ScenarioEvent;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This file is part of the Behat\MinkExtension.
|
* This file is part of the Behat\MinkExtension.
|
||||||
@@ -22,6 +23,31 @@ use Behat\Behat\Context\TranslatedContextInterface;
|
|||||||
*/
|
*/
|
||||||
class MinkContext extends RawMinkContext implements TranslatedContextInterface
|
class MinkContext extends RawMinkContext implements TranslatedContextInterface
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* @BeforeScenario
|
||||||
|
*/
|
||||||
|
public function prepareMinkSessions($event)
|
||||||
|
{
|
||||||
|
$scenario = $event instanceof ScenarioEvent ? $event->getScenario() : $event->getOutline();
|
||||||
|
$session = $this->getMinkParameter('default_session');
|
||||||
|
|
||||||
|
foreach ($scenario->getTags() as $tag) {
|
||||||
|
if ('javascript' === $tag) {
|
||||||
|
$session = $this->getMinkParameter('javascript_session');
|
||||||
|
} elseif (preg_match('/^mink\:(.+)/', $tag, $matches)) {
|
||||||
|
$session = $matches[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($scenario->hasTag('insulated')) {
|
||||||
|
$this->getMink()->stopSessions();
|
||||||
|
} else {
|
||||||
|
$this->getMink()->resetSessions();
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->getMink()->setDefaultSessionName($session);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Opens specified page.
|
* Opens specified page.
|
||||||
*
|
*
|
||||||
@@ -165,8 +191,8 @@ class MinkContext extends RawMinkContext implements TranslatedContextInterface
|
|||||||
{
|
{
|
||||||
$field = $this->fixStepArgument($field);
|
$field = $this->fixStepArgument($field);
|
||||||
|
|
||||||
if (isset($this->minkParameters['files_path']) && $this->minkParameters['files_path']) {
|
if ($this->getMinkParameter('files_path')) {
|
||||||
$path = $this->minkParameters['files_path'].DIRECTORY_SEPARATOR.$path;
|
$path = $this->getMinkParameter('files_path').DIRECTORY_SEPARATOR.$path;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->getSession()->getPage()->attachFileToField($field, $path);
|
$this->getSession()->getPage()->attachFileToField($field, $path);
|
||||||
@@ -392,13 +418,13 @@ class MinkContext extends RawMinkContext implements TranslatedContextInterface
|
|||||||
*/
|
*/
|
||||||
public function showLastResponse()
|
public function showLastResponse()
|
||||||
{
|
{
|
||||||
if (null === $this->minkParameters['show_cmd']) {
|
if (null === $this->getMinkParameter('show_cmd')) {
|
||||||
throw new \RuntimeException('Set "show_cmd" parameter in behat.yml to be able to open page in browser (ex.: "show_cmd: firefox %s")');
|
throw new \RuntimeException('Set "show_cmd" parameter in behat.yml to be able to open page in browser (ex.: "show_cmd: firefox %s")');
|
||||||
}
|
}
|
||||||
|
|
||||||
$filename = rtrim($this->minkParameters['show_tmp_dir'], DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.uniqid().'.html';
|
$filename = rtrim($this->getMinkParameter('show_tmp_dir'), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.uniqid().'.html';
|
||||||
file_put_contents($filename, $this->getSession()->getPage()->getContent());
|
file_put_contents($filename, $this->getSession()->getPage()->getContent());
|
||||||
system(sprintf($this->minkParameters['show_cmd'], escapeshellarg($filename)));
|
system(sprintf($this->getMinkParameter('show_cmd'), escapeshellarg($filename)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -407,6 +433,16 @@ class MinkContext extends RawMinkContext implements TranslatedContextInterface
|
|||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function getTranslationResources()
|
public function getTranslationResources()
|
||||||
|
{
|
||||||
|
return $this->getMinkTranslationResources();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns list of definition translation resources paths for this dictionary.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getMinkTranslationResources()
|
||||||
{
|
{
|
||||||
return glob(__DIR__.'/../../../../i18n/*.xliff');
|
return glob(__DIR__.'/../../../../i18n/*.xliff');
|
||||||
}
|
}
|
||||||
@@ -421,7 +457,7 @@ class MinkContext extends RawMinkContext implements TranslatedContextInterface
|
|||||||
*/
|
*/
|
||||||
protected function locatePath($path)
|
protected function locatePath($path)
|
||||||
{
|
{
|
||||||
$startUrl = rtrim($this->minkParameters['base_url'], '/') . '/';
|
$startUrl = rtrim($this->getMinkParameter('base_url'), '/') . '/';
|
||||||
|
|
||||||
return 0 !== strpos($path, 'http') ? $startUrl . ltrim($path, '/') : $path;
|
return 0 !== strpos($path, 'http') ? $startUrl . ltrim($path, '/') : $path;
|
||||||
}
|
}
|
||||||
|
|||||||
546
src/Behat/MinkExtension/Context/MinkDictionary.php
Normal file
546
src/Behat/MinkExtension/Context/MinkDictionary.php
Normal file
@@ -0,0 +1,546 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Behat\MinkExtension\Context;
|
||||||
|
|
||||||
|
use Behat\Gherkin\Node\TableNode;
|
||||||
|
|
||||||
|
use Behat\Behat\Event\ScenarioEvent;
|
||||||
|
|
||||||
|
use Behat\Mink\Mink,
|
||||||
|
Behat\Mink\WebAssert;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Behat\MinkExtension.
|
||||||
|
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mink steps dictionary for Behat BDD tool.
|
||||||
|
*
|
||||||
|
* @author Konstantin Kudryashov <ever.zet@gmail.com>
|
||||||
|
*/
|
||||||
|
trait MinkDictionary
|
||||||
|
{
|
||||||
|
private $mink;
|
||||||
|
private $minkParameters;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets Mink instance.
|
||||||
|
*
|
||||||
|
* @param Mink $mink Mink session manager
|
||||||
|
*/
|
||||||
|
public function setMink(Mink $mink)
|
||||||
|
{
|
||||||
|
$this->mink = $mink;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns Mink instance.
|
||||||
|
*
|
||||||
|
* @return Mink
|
||||||
|
*/
|
||||||
|
public function getMink()
|
||||||
|
{
|
||||||
|
return $this->mink;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets parameters provided for Mink.
|
||||||
|
*
|
||||||
|
* @param array $parameters
|
||||||
|
*/
|
||||||
|
public function setMinkParameters(array $parameters)
|
||||||
|
{
|
||||||
|
$this->minkParameters = $parameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns specific mink parameter.
|
||||||
|
*
|
||||||
|
* @param string $name
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function getMinkParameter($name)
|
||||||
|
{
|
||||||
|
return isset($this->minkParameters[$name]) ? $this->minkParameters[$name] : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns Mink session.
|
||||||
|
*
|
||||||
|
* @param string|null $name name of the session OR active session will be used
|
||||||
|
*
|
||||||
|
* @return Session
|
||||||
|
*/
|
||||||
|
public function getSession($name = null)
|
||||||
|
{
|
||||||
|
return $this->getMink()->getSession($name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns Mink session assertion tool.
|
||||||
|
*
|
||||||
|
* @param string|null $name name of the session OR active session will be used
|
||||||
|
*
|
||||||
|
* @return WebAssert
|
||||||
|
*/
|
||||||
|
public function assertSession($name = null)
|
||||||
|
{
|
||||||
|
return $this->getMink()->assertSession($name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @BeforeScenario
|
||||||
|
*/
|
||||||
|
public function prepareMinkSessions($event)
|
||||||
|
{
|
||||||
|
$scenario = $event instanceof ScenarioEvent ? $event->getScenario() : $event->getOutline();
|
||||||
|
$session = $this->getMinkParameter('default_session');
|
||||||
|
|
||||||
|
foreach ($scenario->getTags() as $tag) {
|
||||||
|
if ('javascript' === $tag) {
|
||||||
|
$session = $this->getMinkParameter('javascript_session');
|
||||||
|
} elseif (preg_match('/^mink\:(.+)/', $tag, $matches)) {
|
||||||
|
$session = $matches[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($scenario->hasTag('insulated')) {
|
||||||
|
$this->getMink()->stopSessions();
|
||||||
|
} else {
|
||||||
|
$this->getMink()->resetSessions();
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->getMink()->setDefaultSessionName($session);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opens specified page.
|
||||||
|
*
|
||||||
|
* @Given /^(?:|I )am on "(?P<page>[^"]+)"$/
|
||||||
|
* @When /^(?:|I )go to "(?P<page>[^"]+)"$/
|
||||||
|
*/
|
||||||
|
public function visit($page)
|
||||||
|
{
|
||||||
|
$this->getSession()->visit($this->locatePath($page));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reloads current page.
|
||||||
|
*
|
||||||
|
* @When /^(?:|I )reload the page$/
|
||||||
|
*/
|
||||||
|
public function reload()
|
||||||
|
{
|
||||||
|
$this->getSession()->reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Moves backward one page in history.
|
||||||
|
*
|
||||||
|
* @When /^(?:|I )move backward one page$/
|
||||||
|
*/
|
||||||
|
public function back()
|
||||||
|
{
|
||||||
|
$this->getSession()->back();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Moves forward one page in history
|
||||||
|
*
|
||||||
|
* @When /^(?:|I )move forward one page$/
|
||||||
|
*/
|
||||||
|
public function forward()
|
||||||
|
{
|
||||||
|
$this->getSession()->forward();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Presses button with specified id|name|title|alt|value.
|
||||||
|
*
|
||||||
|
* @When /^(?:|I )press "(?P<button>(?:[^"]|\\")*)"$/
|
||||||
|
*/
|
||||||
|
public function pressButton($button)
|
||||||
|
{
|
||||||
|
$button = $this->fixStepArgument($button);
|
||||||
|
$this->getSession()->getPage()->pressButton($button);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clicks link with specified id|title|alt|text.
|
||||||
|
*
|
||||||
|
* @When /^(?:|I )follow "(?P<link>(?:[^"]|\\")*)"$/
|
||||||
|
*/
|
||||||
|
public function clickLink($link)
|
||||||
|
{
|
||||||
|
$link = $this->fixStepArgument($link);
|
||||||
|
$this->getSession()->getPage()->clickLink($link);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fills in form field with specified id|name|label|value.
|
||||||
|
*
|
||||||
|
* @When /^(?:|I )fill in "(?P<field>(?:[^"]|\\")*)" with "(?P<value>(?:[^"]|\\")*)"$/
|
||||||
|
* @When /^(?:|I )fill in "(?P<value>(?:[^"]|\\")*)" for "(?P<field>(?:[^"]|\\")*)"$/
|
||||||
|
*/
|
||||||
|
public function fillField($field, $value)
|
||||||
|
{
|
||||||
|
$field = $this->fixStepArgument($field);
|
||||||
|
$value = $this->fixStepArgument($value);
|
||||||
|
$this->getSession()->getPage()->fillField($field, $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fills in form fields with provided table.
|
||||||
|
*
|
||||||
|
* @When /^(?:|I )fill in the following:$/
|
||||||
|
*/
|
||||||
|
public function fillFields(TableNode $fields)
|
||||||
|
{
|
||||||
|
foreach ($fields->getRowsHash() as $field => $value) {
|
||||||
|
$this->fillField($field, $value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Selects option in select field with specified id|name|label|value.
|
||||||
|
*
|
||||||
|
* @When /^(?:|I )select "(?P<option>(?:[^"]|\\")*)" from "(?P<select>(?:[^"]|\\")*)"$/
|
||||||
|
*/
|
||||||
|
public function selectOption($select, $option)
|
||||||
|
{
|
||||||
|
$select = $this->fixStepArgument($select);
|
||||||
|
$option = $this->fixStepArgument($option);
|
||||||
|
$this->getSession()->getPage()->selectFieldOption($select, $option);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Selects additional option in select field with specified id|name|label|value.
|
||||||
|
*
|
||||||
|
* @When /^(?:|I )additionally select "(?P<option>(?:[^"]|\\")*)" from "(?P<select>(?:[^"]|\\")*)"$/
|
||||||
|
*/
|
||||||
|
public function additionallySelectOption($select, $option)
|
||||||
|
{
|
||||||
|
$select = $this->fixStepArgument($select);
|
||||||
|
$option = $this->fixStepArgument($option);
|
||||||
|
$this->getSession()->getPage()->selectFieldOption($select, $option, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks checkbox with specified id|name|label|value.
|
||||||
|
*
|
||||||
|
* @When /^(?:|I )check "(?P<option>(?:[^"]|\\")*)"$/
|
||||||
|
*/
|
||||||
|
public function checkOption($option)
|
||||||
|
{
|
||||||
|
$option = $this->fixStepArgument($option);
|
||||||
|
$this->getSession()->getPage()->checkField($option);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unchecks checkbox with specified id|name|label|value.
|
||||||
|
*
|
||||||
|
* @When /^(?:|I )uncheck "(?P<option>(?:[^"]|\\")*)"$/
|
||||||
|
*/
|
||||||
|
public function uncheckOption($option)
|
||||||
|
{
|
||||||
|
$option = $this->fixStepArgument($option);
|
||||||
|
$this->getSession()->getPage()->uncheckField($option);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attaches file to field with specified id|name|label|value.
|
||||||
|
*
|
||||||
|
* @When /^(?:|I )attach the file "(?P<path>[^"]*)" to "(?P<field>(?:[^"]|\\")*)"$/
|
||||||
|
*/
|
||||||
|
public function attachFileToField($field, $path)
|
||||||
|
{
|
||||||
|
$field = $this->fixStepArgument($field);
|
||||||
|
|
||||||
|
if ($this->getMinkParameter('files_path')) {
|
||||||
|
$path = $this->getMinkParameter('files_path').DIRECTORY_SEPARATOR.$path;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->getSession()->getPage()->attachFileToField($field, $path);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks, that current page PATH is equal to specified.
|
||||||
|
*
|
||||||
|
* @Then /^(?:|I )should be on "(?P<page>[^"]+)"$/
|
||||||
|
*/
|
||||||
|
public function assertPageAddress($page)
|
||||||
|
{
|
||||||
|
$this->assertSession()->addressEquals($this->locatePath($page));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks, that current page PATH matches regular expression.
|
||||||
|
*
|
||||||
|
* @Then /^the (?i)url(?-i) should match (?P<pattern>\/([^\/]|\\\/)*\/)$/
|
||||||
|
*/
|
||||||
|
public function assertUrlRegExp($pattern)
|
||||||
|
{
|
||||||
|
$this->assertSession()->addressMatches($pattern);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks, that current page response status is equal to specified.
|
||||||
|
*
|
||||||
|
* @Then /^the response status code should be (?P<code>\d+)$/
|
||||||
|
*/
|
||||||
|
public function assertResponseStatus($code)
|
||||||
|
{
|
||||||
|
$this->assertSession()->statusCodeEquals($code);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks, that current page response status is not equal to specified.
|
||||||
|
*
|
||||||
|
* @Then /^the response status code should not be (?P<code>\d+)$/
|
||||||
|
*/
|
||||||
|
public function assertResponseStatusIsNot($code)
|
||||||
|
{
|
||||||
|
$this->assertSession()->statusCodeNotEquals($code);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks, that page contains specified text.
|
||||||
|
*
|
||||||
|
* @Then /^(?:|I )should see "(?P<text>(?:[^"]|\\")*)"$/
|
||||||
|
*/
|
||||||
|
public function assertPageContainsText($text)
|
||||||
|
{
|
||||||
|
$this->assertSession()->pageTextContains($this->fixStepArgument($text));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks, that page doesn't contain specified text.
|
||||||
|
*
|
||||||
|
* @Then /^(?:|I )should not see "(?P<text>(?:[^"]|\\")*)"$/
|
||||||
|
*/
|
||||||
|
public function assertPageNotContainsText($text)
|
||||||
|
{
|
||||||
|
$this->assertSession()->pageTextNotContains($this->fixStepArgument($text));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks, that page contains text matching specified pattern.
|
||||||
|
*
|
||||||
|
* @Then /^(?:|I )should see text matching (?P<pattern>"(?:[^"]|\\")*")$/
|
||||||
|
*/
|
||||||
|
public function assertPageMatchesText($pattern)
|
||||||
|
{
|
||||||
|
$this->assertSession()->pageTextMatches($this->fixStepArgument($text));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks, that page doesn't contain text matching specified pattern.
|
||||||
|
*
|
||||||
|
* @Then /^(?:|I )should not see text matching (?P<pattern>"(?:[^"]|\\")*")$/
|
||||||
|
*/
|
||||||
|
public function assertPageNotMatchesText($pattern)
|
||||||
|
{
|
||||||
|
$this->assertSession()->pageTextNotMatches($this->fixStepArgument($text));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks, that HTML response contains specified string.
|
||||||
|
*
|
||||||
|
* @Then /^the response should contain "(?P<text>(?:[^"]|\\")*)"$/
|
||||||
|
*/
|
||||||
|
public function assertResponseContains($text)
|
||||||
|
{
|
||||||
|
$this->assertSession()->responseContains($this->fixStepArgument($text));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks, that HTML response doesn't contain specified string.
|
||||||
|
*
|
||||||
|
* @Then /^the response should not contain "(?P<text>(?:[^"]|\\")*)"$/
|
||||||
|
*/
|
||||||
|
public function assertResponseNotContains($text)
|
||||||
|
{
|
||||||
|
$this->assertSession()->responseNotContains($this->fixStepArgument($text));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks, that element with specified CSS contains specified text.
|
||||||
|
*
|
||||||
|
* @Then /^(?:|I )should see "(?P<text>(?:[^"]|\\")*)" in the "(?P<element>[^"]*)" element$/
|
||||||
|
*/
|
||||||
|
public function assertElementContainsText($element, $text)
|
||||||
|
{
|
||||||
|
$this->assertSession()->elementTextContains('css', $element, $this->fixStepArgument($text));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks, that element with specified CSS doesn't contain specified text.
|
||||||
|
*
|
||||||
|
* @Then /^(?:|I )should not see "(?P<text>(?:[^"]|\\")*)" in the "(?P<element>[^"]*)" element$/
|
||||||
|
*/
|
||||||
|
public function assertElementNotContainsText($element, $text)
|
||||||
|
{
|
||||||
|
$this->assertSession()->elementTextNotContains('css', $element, $this->fixStepArgument($text));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks, that element with specified CSS contains specified HTML.
|
||||||
|
*
|
||||||
|
* @Then /^the "(?P<element>[^"]*)" element should contain "(?P<value>(?:[^"]|\\")*)"$/
|
||||||
|
*/
|
||||||
|
public function assertElementContains($element, $value)
|
||||||
|
{
|
||||||
|
$this->assertSession()->elementContains('css', $element, $this->fixStepArgument($value));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks, that element with specified CSS exists on page.
|
||||||
|
*
|
||||||
|
* @Then /^(?:|I )should see an? "(?P<element>[^"]*)" element$/
|
||||||
|
*/
|
||||||
|
public function assertElementOnPage($element)
|
||||||
|
{
|
||||||
|
$this->assertSession()->elementExists('css', $element);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks, that element with specified CSS doesn't exist on page.
|
||||||
|
*
|
||||||
|
* @Then /^(?:|I )should not see an? "(?P<element>[^"]*)" element$/
|
||||||
|
*/
|
||||||
|
public function assertElementNotOnPage($element)
|
||||||
|
{
|
||||||
|
$this->assertSession()->elementNotExists('css', $element);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks, that form field with specified id|name|label|value has specified value.
|
||||||
|
*
|
||||||
|
* @Then /^the "(?P<field>(?:[^"]|\\")*)" field should contain "(?P<value>(?:[^"]|\\")*)"$/
|
||||||
|
*/
|
||||||
|
public function assertFieldContains($field, $value)
|
||||||
|
{
|
||||||
|
$this->assertSession()->fieldValueEquals($field, $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks, that form field with specified id|name|label|value doesn't have specified value.
|
||||||
|
*
|
||||||
|
* @Then /^the "(?P<field>(?:[^"]|\\")*)" field should not contain "(?P<value>(?:[^"]|\\")*)"$/
|
||||||
|
*/
|
||||||
|
public function assertFieldNotContains($field, $value)
|
||||||
|
{
|
||||||
|
$this->assertSession()->fieldValueNotEquals($field, $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks, that checkbox with specified in|name|label|value is checked.
|
||||||
|
*
|
||||||
|
* @Then /^the "(?P<checkbox>(?:[^"]|\\")*)" checkbox should be checked$/
|
||||||
|
*/
|
||||||
|
public function assertCheckboxChecked($checkbox)
|
||||||
|
{
|
||||||
|
$this->assertSession()->checkboxChecked($checkbox);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks, that checkbox with specified in|name|label|value is unchecked.
|
||||||
|
*
|
||||||
|
* @Then /^the "(?P<checkbox>(?:[^"]|\\")*)" checkbox should not be checked$/
|
||||||
|
*/
|
||||||
|
public function assertCheckboxNotChecked($checkbox)
|
||||||
|
{
|
||||||
|
$this->assertSession()->checkboxNotChecked($checkbox);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks, that (?P<num>\d+) CSS elements exist on the page
|
||||||
|
*
|
||||||
|
* @Then /^(?:|I )should see (?P<num>\d+) "(?P<element>[^"]*)" elements?$/
|
||||||
|
*/
|
||||||
|
public function assertNumElements($num, $element)
|
||||||
|
{
|
||||||
|
$this->assertSession()->elementsCount('css', $element);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints last response to console.
|
||||||
|
*
|
||||||
|
* @Then /^print last response$/
|
||||||
|
*/
|
||||||
|
public function printLastResponse()
|
||||||
|
{
|
||||||
|
$this->printDebug(
|
||||||
|
$this->getSession()->getCurrentUrl()."\n\n".
|
||||||
|
$this->getSession()->getPage()->getContent()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opens last response content in browser.
|
||||||
|
*
|
||||||
|
* @Then /^show last response$/
|
||||||
|
*/
|
||||||
|
public function showLastResponse()
|
||||||
|
{
|
||||||
|
if (null === $this->getMinkParameter('show_cmd')) {
|
||||||
|
throw new \RuntimeException('Set "show_cmd" parameter in behat.yml to be able to open page in browser (ex.: "show_cmd: firefox %s")');
|
||||||
|
}
|
||||||
|
|
||||||
|
$filename = rtrim($this->getMinkParameter('show_tmp_dir'), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.uniqid().'.html';
|
||||||
|
file_put_contents($filename, $this->getSession()->getPage()->getContent());
|
||||||
|
system(sprintf($this->getMinkParameter('show_cmd'), escapeshellarg($filename)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns list of definition translation resources paths.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getTranslationResources()
|
||||||
|
{
|
||||||
|
return $this->getMinkTranslationResources();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns list of definition translation resources paths for this dictionary.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getMinkTranslationResources()
|
||||||
|
{
|
||||||
|
return glob(__DIR__.'/../../../../i18n/*.xliff');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Locates url, based on provided path.
|
||||||
|
* Override to provide custom routing mechanism.
|
||||||
|
*
|
||||||
|
* @param string $path
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function locatePath($path)
|
||||||
|
{
|
||||||
|
$startUrl = rtrim($this->getMinkParameter('base_url'), '/') . '/';
|
||||||
|
|
||||||
|
return 0 !== strpos($path, 'http') ? $startUrl . ltrim($path, '/') : $path;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns fixed step argument (with \\" replaced back to ").
|
||||||
|
*
|
||||||
|
* @param string $argument
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function fixStepArgument($argument)
|
||||||
|
{
|
||||||
|
return str_replace('\\"', '"', $argument);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,8 +2,7 @@
|
|||||||
|
|
||||||
namespace Behat\MinkExtension\Context;
|
namespace Behat\MinkExtension\Context;
|
||||||
|
|
||||||
use Behat\Behat\Context\BehatContext,
|
use Behat\Behat\Context\BehatContext;
|
||||||
Behat\Behat\Event\ScenarioEvent;
|
|
||||||
|
|
||||||
use Behat\Mink\Mink,
|
use Behat\Mink\Mink,
|
||||||
Behat\Mink\WebAssert;
|
Behat\Mink\WebAssert;
|
||||||
@@ -25,7 +24,7 @@ use Behat\Mink\Mink,
|
|||||||
class RawMinkContext extends BehatContext implements MinkAwareContextInterface
|
class RawMinkContext extends BehatContext implements MinkAwareContextInterface
|
||||||
{
|
{
|
||||||
private $mink;
|
private $mink;
|
||||||
protected $minkParameters;
|
private $minkParameters;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets Mink instance.
|
* Sets Mink instance.
|
||||||
@@ -37,6 +36,16 @@ class RawMinkContext extends BehatContext implements MinkAwareContextInterface
|
|||||||
$this->mink = $mink;
|
$this->mink = $mink;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns Mink instance.
|
||||||
|
*
|
||||||
|
* @return Mink
|
||||||
|
*/
|
||||||
|
public function getMink()
|
||||||
|
{
|
||||||
|
return $this->mink;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets parameters provided for Mink.
|
* Sets parameters provided for Mink.
|
||||||
*
|
*
|
||||||
@@ -48,13 +57,15 @@ class RawMinkContext extends BehatContext implements MinkAwareContextInterface
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns Mink instance.
|
* Returns specific mink parameter.
|
||||||
*
|
*
|
||||||
* @return Mink
|
* @param string $name
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public function getMink()
|
public function getMinkParameter($name)
|
||||||
{
|
{
|
||||||
return $this->mink;
|
return isset($this->minkParameters[$name]) ? $this->minkParameters[$name] : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -80,29 +91,4 @@ class RawMinkContext extends BehatContext implements MinkAwareContextInterface
|
|||||||
{
|
{
|
||||||
return $this->getMink()->assertSession($name);
|
return $this->getMink()->assertSession($name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @BeforeScenario
|
|
||||||
*/
|
|
||||||
public function prepareMinkSessions($event)
|
|
||||||
{
|
|
||||||
$scenario = $event instanceof ScenarioEvent ? $event->getScenario() : $event->getOutline();
|
|
||||||
$session = $this->minkParameters['default_session'];
|
|
||||||
|
|
||||||
foreach ($scenario->getTags() as $tag) {
|
|
||||||
if ('javascript' === $tag) {
|
|
||||||
$session = $this->minkParameters['javascript_session'];
|
|
||||||
} elseif (preg_match('/^mink\:(.+)/', $tag, $matches)) {
|
|
||||||
$session = $matches[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($scenario->hasTag('insulated')) {
|
|
||||||
$this->getMink()->stopSessions();
|
|
||||||
} else {
|
|
||||||
$this->getMink()->resetSessions();
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->getMink()->setDefaultSessionName($session);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user