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@12: $script = preg_replace('/^return\s+/', '', $script); Chris@12: Chris@12: $script = $this->fixSelfExecutingFunction($script); Chris@12: Chris@12: 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@12: if ($result) { Chris@12: // No need to wait any longer when the condition is met already. Chris@12: return TRUE; Chris@12: } Chris@0: usleep(100000); Chris@0: } while (microtime(true) < $end && !$result); Chris@0: Chris@0: return (bool)$result; Chris@0: } Chris@0: Chris@12: /** Chris@12: * Fixes self-executing functions to allow evaluating them. Chris@12: * Chris@12: * The self-executing function must be wrapped in braces to work. Chris@12: * Chris@12: * @param string $script Chris@12: * Chris@12: * @return string Chris@12: */ Chris@12: private function fixSelfExecutingFunction($script) Chris@12: { Chris@12: if (preg_match('/^function[\s\(]/', $script)) { Chris@12: $script = preg_replace('/;$/', '', $script); Chris@12: $script = '(' . $script . ')'; Chris@12: } Chris@12: Chris@12: return $script; Chris@12: } Chris@0: }