Chris@0: browser->execute($this->fixSelfExecutingFunction($script)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Evaluates a script and returns the result Chris@0: * @param string $script Chris@0: * @return mixed Chris@0: */ Chris@0: public function evaluateScript($script) { Chris@2: $script = preg_replace('/^return\s+/', '', $script); Chris@2: Chris@2: $script = $this->fixSelfExecutingFunction($script); Chris@2: Chris@2: return $this->browser->evaluate($script); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Waits some time or until JS condition turns true. Chris@0: * Chris@0: * @param integer $timeout timeout in milliseconds Chris@0: * @param string $condition JS condition Chris@0: * @return boolean Chris@0: * @throws DriverException When the operation cannot be done Chris@0: */ Chris@0: public function wait($timeout, $condition) { Chris@0: $start = microtime(true); Chris@0: $end = $start + $timeout / 1000.0; Chris@0: do { Chris@0: $result = $this->browser->evaluate($condition); Chris@2: if ($result) { Chris@2: // No need to wait any longer when the condition is met already. Chris@2: return TRUE; Chris@2: } Chris@0: usleep(100000); Chris@0: } while (microtime(true) < $end && !$result); Chris@0: Chris@0: return (bool)$result; Chris@0: } Chris@0: Chris@2: /** Chris@2: * Fixes self-executing functions to allow evaluating them. Chris@2: * Chris@2: * The self-executing function must be wrapped in braces to work. Chris@2: * Chris@2: * @param string $script Chris@2: * Chris@2: * @return string Chris@2: */ Chris@2: private function fixSelfExecutingFunction($script) Chris@2: { Chris@2: if (preg_match('/^function[\s\(]/', $script)) { Chris@2: $script = preg_replace('/;$/', '', $script); Chris@2: $script = '(' . $script . ')'; Chris@2: } Chris@2: Chris@2: return $script; Chris@2: } Chris@0: }