Last active
March 16, 2018 15:48
-
-
Save netraagal/be6034613abb89a5765e0cd218db35a9 to your computer and use it in GitHub Desktop.
Behat, MinkExtension & Selenium2 Driver - functions to wait
This file contains 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
<?php | |
/** | |
* some functions to make a pause (minutes, seconds or milliseconds) | |
* The last one is a little more tricky as she will stop the Scenario to wait for the end of the loading of the | |
* scripts behind (you must be cautious if a script is created to run all the time) | |
* | |
* @author netraagal | |
*/ | |
namespace App\Features; | |
use Behat\Mink\Driver\Selenium2Driver; | |
use \Exception; | |
class TimerFeatureContext extends MinkContext implements SnippetAcceptingContext | |
{ | |
/** | |
* waitMinutes | |
* | |
* @When /^(?:|I )wait (?:|for )(?P<time>\d+) minutes?$/ | |
* | |
* @param int $time number of minutes to wait | |
* @return FeatureContext | |
*/ | |
public function waitMinutes(int $time): self | |
{ | |
sleep(60 * $time); | |
return $this; | |
} | |
/** | |
* waitSeconds | |
* | |
* @When /^(?:|I )wait (?:|for )(?P<time>\d+) seconds?$/ | |
* | |
* @param int $time number of seconds to wait | |
* @return FeatureContext | |
*/ | |
public function waitSeconds(int $time): self | |
{ | |
sleep($time); | |
return $this; | |
} | |
/** | |
* waitMilliseconds | |
* | |
* @When /^(?:|I )wait (?:|for )(?P<time>\d+) milliseconds?$/ | |
* | |
* @param int $time number of milliseconds to wait | |
* @return FeatureContext | |
*/ | |
public function waitMilliseconds(int $time): self | |
{ | |
sleep($time / 1000); | |
return $this; | |
} | |
/** | |
* waitLoading | |
* Not the author but the function is to much based on what he has done to not be named | |
* @author Gildas Quéméner <[email protected]> | |
* | |
* @When /^(?:|I )wait (?:|for )(?:|end of )loading$/ | |
* | |
* @return FeatureContext | |
*/ | |
public function waitLoading(): self | |
{ | |
$session = $this->getSession(); | |
if (!$session->getDriver() instanceof Selenium2Driver) | |
return $this; | |
$time = 15000; | |
$conditions = [ | |
"document.readyState == 'complete'", | |
"typeof $ != 'undefined'", | |
"!$.active", | |
]; | |
$condition = implode(' && ', $conditions); | |
$this->waitMilliseconds(100); | |
$session->wait($time, $condition); | |
if (!$session->evaluateScript($condition)) { | |
throw new Exception(sprintf( | |
'Timeout of %d reached when checking on "%s"', | |
$time, | |
$condition | |
)); | |
} | |
foreach ($conditions as $condition) { | |
$result = $this->getSession()->evaluateScript($condition); | |
if (!$result) { | |
throw new Exception(sprintf( | |
'Timeout of %d reached when checking on "%s"', | |
$time, | |
$condition | |
)); | |
} | |
} | |
return $this; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment