Created
May 4, 2015 00:09
-
-
Save lenybernard/6f6c2678a9a2594f923b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/Behat/MinkExtension/Context/MinkContext.php b/src/Behat/MinkExtension/Context/MinkContext.php | |
index 90ea038..8d6537b 100644 | |
--- a/src/Behat/MinkExtension/Context/MinkContext.php | |
+++ b/src/Behat/MinkExtension/Context/MinkContext.php | |
@@ -238,22 +238,34 @@ class MinkContext extends RawMinkContext implements TranslatableContext | |
/** | |
* Checks, that page contains specified text. | |
+ * @param string $text the text to check | |
+ * @param integer $timeout in milliseconds | |
* | |
* @Then /^(?:|I )should see "(?P<text>(?:[^"]|\\")*)"$/ | |
*/ | |
- public function assertPageContainsText($text) | |
+ public function assertPageContainsText($text, $timeout = 10000) | |
{ | |
- $this->assertSession()->pageTextContains($this->fixStepArgument($text)); | |
+ $element = $this->findAfterAjax($this->getSession()->getPage(), $text, $timeout); | |
+ if (!$element) { | |
+ $message = sprintf('The text "%s" was not found anywhere in the text of the current page.', $text); | |
+ throw new \Behat\Mink\Exception\ResponseTextException($message, $this->getSession()); | |
+ } | |
} | |
/** | |
- * Checks, that page doesn't contain specified text. | |
+ * Checks, that page does not contain specified text. | |
+ * @param string $text the text to check | |
+ * @param integer $timeout in milliseconds | |
* | |
* @Then /^(?:|I )should not see "(?P<text>(?:[^"]|\\")*)"$/ | |
*/ | |
- public function assertPageNotContainsText($text) | |
+ public function assertPageNotContainsText($text, $timeout = 10000) | |
{ | |
- $this->assertSession()->pageTextNotContains($this->fixStepArgument($text)); | |
+ $element = $this->findAfterAjax($this->getSession()->getPage(), $text, $timeout); | |
+ if ($element && $element->isVisible()) { | |
+ $message = sprintf('The text "%s" was found in the text of the current page although it should not.', $text); | |
+ throw new \Behat\Mink\Exception\ResponseTextException($message, $this->getSession()); | |
+ } | |
} | |
/** | |
@@ -297,16 +309,6 @@ class MinkContext extends RawMinkContext implements TranslatableContext | |
} | |
/** | |
- * 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$/ | |
@@ -483,4 +485,66 @@ class MinkContext extends RawMinkContext implements TranslatableContext | |
{ | |
return str_replace('\\"', '"', $argument); | |
} | |
+ | |
+ /** | |
+ * Checks, that element with specified CSS contains specified text. | |
+ * @param string $element the element where search | |
+ * @param string $text the text to check | |
+ * @param integer $timeout in milliseconds | |
+ * | |
+ * @Then /^(?:|I )should see "(?P<text>(?:[^"]|\\")*)" in the "(?P<element>[^"]*)" element$/ | |
+ * | |
+ * @return null|boolean | |
+ */ | |
+ public function assertElementContainsText($element, $text, $timeout = 5000) | |
+ { | |
+ if ($timeout <= 0) { | |
+ $message = sprintf('The element "%s" was not found in the page.', $element); | |
+ throw new \Behat\Mink\Exception\ResponseTextException($message, $this->getSession()); | |
+ } | |
+ $selectorType = 'css'; | |
+ | |
+ $node = $this->getSession()->getPage()->find($selectorType, $element); | |
+ | |
+ if (is_object($node)) { | |
+ $item = $this->findAfterAjax($node, $text); | |
+ if (!$item) { | |
+ $this->assertElementContainsText($element, $text, 0); | |
+ } | |
+ } else { | |
+ $this->getSession()->wait(100); | |
+ | |
+ return $this->assertElementContainsText($element, $text, $timeout - 100); | |
+ } | |
+ } | |
+ | |
+ /** | |
+ * Try to select element, return null after 15 sec | |
+ * @param string $element the element where search | |
+ * @param string $value the value to check | |
+ * @param integer $timeout in milliseconds | |
+ * | |
+ * @return boolean | |
+ */ | |
+ public function findAfterAjax($element, $value, $timeout = 5000) | |
+ { | |
+ if ($timeout <= 0) { | |
+ return false; | |
+ } | |
+ | |
+ // Hack to be able to get an element case insensitively... | |
+ $alphabetLower = '"'.implode('', range('a', 'z')).'"'; | |
+ $alphabetUpper = '"'.implode('', range('A', 'Z')).'"'; | |
+ | |
+ $item = $element->find('xpath', '/descendant-or-self::*[contains(translate(text(), '.$alphabetUpper.', '.$alphabetLower.'), translate("'.$value.'", '.$alphabetUpper.', '.$alphabetLower.'))]'); | |
+ | |
+ if ($item) { | |
+ return $item; | |
+ } else { | |
+ $this->getSession()->wait(100); | |
+ | |
+ return $this->findAfterAjax($element, $value, $timeout - 100); | |
+ } | |
+ | |
+ } | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment