xref: /plugin/combo/vendor/php-webdriver/webdriver/lib/WebDriverWait.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
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