diff --git a/lib/behat/classes/behat_session_trait.php b/lib/behat/classes/behat_session_trait.php index 2def65d9b65..4d1a39fff26 100644 --- a/lib/behat/classes/behat_session_trait.php +++ b/lib/behat/classes/behat_session_trait.php @@ -1355,4 +1355,25 @@ EOF; return $this->evaluate_script($script); } + + /** + * Set the timeout factor for the remaining lifetime of the session. + * + * @param int $factor A multiplication factor to use when calculating the timeout + */ + public function set_test_timeout_factor(int $factor = 1): void { + $driver = $this->getSession()->getDriver(); + + if (!$driver instanceof \OAndreyev\Mink\Driver\WebDriver) { + // This is a feature of the OAndreyev MinkWebDriver. + return; + } + + // Use `get_real_timeout` to multiply the timeout by the global behat_increasetimeout value, and again by the + // factor specified. + $this->getSession()->getDriver()->setTimeouts([ + // The standard script timeout is 30000 ms. (aka, 30 seconds). + 'script' => self::get_real_timeout(30) * 1000 * $factor, + ]); + } } diff --git a/lib/tests/behat/behat_general.php b/lib/tests/behat/behat_general.php index effa94ce047..36075385a0d 100644 --- a/lib/tests/behat/behat_general.php +++ b/lib/tests/behat/behat_general.php @@ -2065,4 +2065,15 @@ EOF; $localurl = new moodle_url($localurl); $this->getSession()->visit($this->locate_path($localurl->out_as_local_url(false))); } + + /** + * Increase the webdriver timeouts. + * + * This should be reset between scenarios, or can be called again to decrease the timeouts. + * + * @Given I mark this test as slow setting a timeout factor of :factor + */ + public function i_mark_this_test_as_long_running(int $factor = 2): void { + $this->set_test_timeout_factor($factor); + } } diff --git a/lib/tests/behat/behat_hooks.php b/lib/tests/behat/behat_hooks.php index 36f6a7eb353..5458a382214 100644 --- a/lib/tests/behat/behat_hooks.php +++ b/lib/tests/behat/behat_hooks.php @@ -303,13 +303,7 @@ EOF; protected function start_session(): void { $this->getSession()->start(); - if ($this->running_javascript()) { // Goutte driver doesn't implement this. - $this->getSession()->getDriver()->setTimeouts([ - // The standard script timeout is 30000 ms. (aka, 30 seconds). - // Use `get_real_timeout` to multiply this by the behat increased timeout factor. - 'script' => self::get_real_timeout(30) * 1000, - ]); - } + $this->set_test_timeout_factor(1); } /**