1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeaunamespace Facebook\WebDriver; 4*04fd306cSNickeau 5*04fd306cSNickeauuse Facebook\WebDriver\Exception\NoSuchElementException; 6*04fd306cSNickeauuse Facebook\WebDriver\Exception\TimeoutException; 7*04fd306cSNickeau 8*04fd306cSNickeau/** 9*04fd306cSNickeau * A utility class, designed to help the user to wait until a condition turns true. 10*04fd306cSNickeau * 11*04fd306cSNickeau * @see WebDriverExpectedCondition. 12*04fd306cSNickeau */ 13*04fd306cSNickeauclass WebDriverWait 14*04fd306cSNickeau{ 15*04fd306cSNickeau /** 16*04fd306cSNickeau * @var WebDriver 17*04fd306cSNickeau */ 18*04fd306cSNickeau protected $driver; 19*04fd306cSNickeau /** 20*04fd306cSNickeau * @var int 21*04fd306cSNickeau */ 22*04fd306cSNickeau protected $timeout; 23*04fd306cSNickeau /** 24*04fd306cSNickeau * @var int 25*04fd306cSNickeau */ 26*04fd306cSNickeau protected $interval; 27*04fd306cSNickeau 28*04fd306cSNickeau public function __construct(WebDriver $driver, $timeout_in_second = null, $interval_in_millisecond = null) 29*04fd306cSNickeau { 30*04fd306cSNickeau $this->driver = $driver; 31*04fd306cSNickeau $this->timeout = isset($timeout_in_second) ? $timeout_in_second : 30; 32*04fd306cSNickeau $this->interval = $interval_in_millisecond ?: 250; 33*04fd306cSNickeau } 34*04fd306cSNickeau 35*04fd306cSNickeau /** 36*04fd306cSNickeau * Calls the function provided with the driver as an argument until the return value is not falsey. 37*04fd306cSNickeau * 38*04fd306cSNickeau * @param callable|WebDriverExpectedCondition $func_or_ec 39*04fd306cSNickeau * @param string $message 40*04fd306cSNickeau * 41*04fd306cSNickeau * @throws \Exception 42*04fd306cSNickeau * @throws NoSuchElementException 43*04fd306cSNickeau * @throws TimeoutException 44*04fd306cSNickeau * @return mixed The return value of $func_or_ec 45*04fd306cSNickeau */ 46*04fd306cSNickeau public function until($func_or_ec, $message = '') 47*04fd306cSNickeau { 48*04fd306cSNickeau $end = microtime(true) + $this->timeout; 49*04fd306cSNickeau $last_exception = null; 50*04fd306cSNickeau 51*04fd306cSNickeau while ($end > microtime(true)) { 52*04fd306cSNickeau try { 53*04fd306cSNickeau if ($func_or_ec instanceof WebDriverExpectedCondition) { 54*04fd306cSNickeau $ret_val = call_user_func($func_or_ec->getApply(), $this->driver); 55*04fd306cSNickeau } else { 56*04fd306cSNickeau $ret_val = call_user_func($func_or_ec, $this->driver); 57*04fd306cSNickeau } 58*04fd306cSNickeau if ($ret_val) { 59*04fd306cSNickeau return $ret_val; 60*04fd306cSNickeau } 61*04fd306cSNickeau } catch (NoSuchElementException $e) { 62*04fd306cSNickeau $last_exception = $e; 63*04fd306cSNickeau } 64*04fd306cSNickeau usleep($this->interval * 1000); 65*04fd306cSNickeau } 66*04fd306cSNickeau 67*04fd306cSNickeau if ($last_exception) { 68*04fd306cSNickeau throw $last_exception; 69*04fd306cSNickeau } 70*04fd306cSNickeau 71*04fd306cSNickeau throw new TimeoutException($message); 72*04fd306cSNickeau } 73*04fd306cSNickeau} 74