Are these adaptive MinkExtension contextual settings used for ajax requests?

In the case where we want to deal with ajax we need to add some instructions to sleep and I really don't like that, even if the end user is actually "waiting" for something, I think it should be overshadowed - ajax.

I'm really wondering why it doesn't exist yet and I've written some adaptation options and would appreciate your feedback before a possible PR:

https://gist.github.com/lenybernard/6f6c2678a9a2594f923b

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);
+        }
+
+    }
 }

      

+3


source to share


1 answer


For the curious, I didn't post the PR, but finally implemented Trait https://github.com/Troopers/BehatContexts/blob/master/src/Troopers/BehatContexts/Context/SpinMinkContextTrait.php ) to implement what the behat documentation suggests :

As Behat says:



Often times, especially when using Mink to test web applications, you will find that Behat is going faster than your web application can keep up - it will try and click links or take actions before the page has a chance to load. , and therefore the result in the case of a failed test that would otherwise pass. To alleviate this problem, we can use spin functions, try to act repeatedly, or test a condition until it fires. This article discusses application to mink, but this method is applicable to any test using Behat. Read the document

0


source







All Articles