diff --git a/lib/tests/behat/behat_general.php b/lib/tests/behat/behat_general.php index b4e446508ca..6c52a44c4b2 100644 --- a/lib/tests/behat/behat_general.php +++ b/lib/tests/behat/behat_general.php @@ -63,6 +63,12 @@ class behat_general extends behat_base { */ const PAGE_LOAD_DETECTION_STRING = 'new_page_not_loaded_since_behat_started_watching'; + /** + * @var $pageloaddetectionrunning boolean Used to ensure that page load detection was started before a page reload + * was checked for. + */ + private $pageloaddetectionrunning = false; + /** * Opens Moodle homepage. * @@ -1240,13 +1246,18 @@ class behat_general extends behat_base { throw new DriverException('Page load detection requires JavaScript.'); } - if ($this->getSession()->getPage()->find('xpath', $this->get_page_load_xpath())) { + $session = $this->getSession(); + + if ($this->pageloaddetectionrunning || $session->getPage()->find('xpath', $this->get_page_load_xpath())) { // If we find this node at this point we are already watching for a reload and the behat steps // are out of order. We will treat this as an error - really it needs to be fixed as it indicates a problem. - throw new ExpectationException('Page load expectation error: page reloads are already been watched for.'); + throw new ExpectationException( + 'Page load expectation error: page reloads are already been watched for.', $session); } - $this->getSession()->evaluateScript( + $this->pageloaddetectionrunning = true; + + $session->evaluateScript( 'var span = document.createElement("span"); span.setAttribute("data-rel", "' . self::PAGE_LOAD_DETECTION_STRING . '"); span.setAttribute("style", "display: none;"); @@ -1260,15 +1271,24 @@ class behat_general extends behat_base { * @Given /^a new page should have loaded since I started watching$/ */ public function a_new_page_should_have_loaded_since_i_started_watching() { + $session = $this->getSession(); + + // Make sure page load tracking was started. + if (!$this->pageloaddetectionrunning) { + throw new ExpectationException( + 'Page load expectation error: page load tracking was not started.', $session); + } + // As the node is inserted by code above it is either there or not, and we do not need spin and it is safe // to use the native API here which is great as exception handling (the alternative is slow). - if ($this->getSession()->getPage()->find('xpath', $this->get_page_load_xpath())) { + if ($session->getPage()->find('xpath', $this->get_page_load_xpath())) { // We don't want to find this node, if we do we have an error. throw new ExpectationException( - 'Page load expectation error: a new page has not been loaded when it should have been.', - $this->getSession() - ); + 'Page load expectation error: a new page has not been loaded when it should have been.', $session); } + + // Cancel the tracking of pageloaddetectionrunning. + $this->pageloaddetectionrunning = false; } /** @@ -1278,6 +1298,12 @@ class behat_general extends behat_base { * @Given /^a new page should not have loaded since I started watching$/ */ public function a_new_page_should_not_have_loaded_since_i_started_watching() { + // Make sure page load tracking was started. + if (!$this->pageloaddetectionrunning) { + throw new ExpectationException( + 'Page load expectation error: page load tracking was not started.', $session); + } + // We use our API here as we can use the exception handling provided by it. $this->find( 'xpath',