Chris@14: Chris@14: * @author Anthon Pang Chris@14: */ Chris@14: Chris@14: namespace WebDriver; Chris@14: Chris@14: /** Chris@14: * WebDriver\Session class Chris@14: * Chris@14: * @package WebDriver Chris@14: * Chris@14: * @method string window_handle() Retrieve the current window handle. Chris@14: * @method array window_handles() Retrieve the list of all window handles available to the session. Chris@14: * @method string url() Retrieve the URL of the current page Chris@14: * @method void postUrl($jsonUrl) Navigate to a new URL Chris@14: * @method void forward() Navigates forward in the browser history, if possible. Chris@14: * @method void back() Navigates backward in the browser history, if possible. Chris@14: * @method void refresh() Refresh the current page. Chris@14: * @method mixed execute($jsonScript) Inject a snippet of JavaScript into the page for execution in the context of the currently selected frame. (synchronous) Chris@14: * @method mixed execute_async($jsonScript) Inject a snippet of JavaScript into the page for execution in the context of the currently selected frame. (asynchronous) Chris@14: * @method string screenshot() Take a screenshot of the current page. Chris@14: * @method array getCookie() Retrieve all cookies visible to the current page. Chris@14: * @method array postCookie($jsonCookie) Set a cookie. Chris@14: * @method string source() Get the current page source. Chris@14: * @method string title() Get the current page title. Chris@14: * @method void keys($jsonKeys) Send a sequence of key strokes to the active element. Chris@14: * @method string getOrientation() Get the current browser orientation. Chris@14: * @method void postOrientation($jsonOrientation) Set the current browser orientation. Chris@14: * @method string getAlert_text() Gets the text of the currently displayed JavaScript alert(), confirm(), or prompt() dialog. Chris@14: * @method void postAlert_text($jsonText) Sends keystrokes to a JavaScript prompt() dialog. Chris@14: * @method void accept_alert() Accepts the currently displayed alert dialog. Chris@14: * @method void dismiss_alert() Dismisses the currently displayed alert dialog. Chris@14: * @method void moveto($jsonCoordinates) Move the mouse by an offset of the specified element (or current mouse cursor). Chris@14: * @method void click($jsonButton) Click any mouse button (at the coordinates set by the last moveto command). Chris@14: * @method void buttondown() Click and hold the left mouse button (at the coordinates set by the last moveto command). Chris@14: * @method void buttonup() Releases the mouse button previously held (where the mouse is currently at). Chris@14: * @method void doubleclick() Double-clicks at the current mouse coordinates (set by moveto). Chris@14: * @method array execute_sql($jsonQuery) Execute SQL. Chris@14: * @method array getLocation() Get the current geo location. Chris@14: * @method void postLocation($jsonCoordinates) Set the current geo location. Chris@14: * @method boolean getBrowser_connection() Is browser online? Chris@14: * @method void postBrowser_connection($jsonState) Set browser online. Chris@14: */ Chris@14: final class Session extends Container Chris@14: { Chris@14: /** Chris@14: * @var array Chris@14: */ Chris@14: private $capabilities = null; Chris@14: Chris@14: /** Chris@14: * {@inheritdoc} Chris@14: */ Chris@14: protected function methods() Chris@14: { Chris@14: return array( Chris@14: 'window_handle' => array('GET'), Chris@14: 'window_handles' => array('GET'), Chris@14: 'url' => array('GET', 'POST'), // alternate for POST, use open($url) Chris@14: 'forward' => array('POST'), Chris@14: 'back' => array('POST'), Chris@14: 'refresh' => array('POST'), Chris@14: 'execute' => array('POST'), Chris@14: 'execute_async' => array('POST'), Chris@14: 'screenshot' => array('GET'), Chris@14: 'cookie' => array('GET', 'POST'), // for DELETE, use deleteAllCookies() Chris@14: 'source' => array('GET'), Chris@14: 'title' => array('GET'), Chris@14: 'keys' => array('POST'), Chris@14: 'orientation' => array('GET', 'POST'), Chris@14: 'alert_text' => array('GET', 'POST'), Chris@14: 'accept_alert' => array('POST'), Chris@14: 'dismiss_alert' => array('POST'), Chris@14: 'moveto' => array('POST'), Chris@14: 'click' => array('POST'), Chris@14: 'buttondown' => 'POST', Chris@14: 'buttonup' => array('POST'), Chris@14: 'doubleclick' => array('POST'), Chris@14: 'execute_sql' => array('POST'), Chris@14: 'location' => array('GET', 'POST'), Chris@14: 'browser_connection' => array('GET', 'POST'), Chris@14: Chris@14: // specific to Java SeleniumServer Chris@14: 'file' => array('POST'), Chris@14: ); Chris@14: } Chris@14: Chris@14: /** Chris@14: * {@inheritdoc} Chris@14: */ Chris@14: protected function obsoleteMethods() Chris@14: { Chris@14: return array( Chris@14: 'modifier' => array('POST'), Chris@14: 'speed' => array('GET', 'POST'), Chris@14: 'alert' => array('GET'), Chris@14: 'visible' => array('GET', 'POST'), Chris@14: ); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Open URL: /session/:sessionId/url (POST) Chris@14: * An alternative to $session->url($url); Chris@14: * Chris@14: * @param string $url Chris@14: * Chris@14: * @return \WebDriver\Session Chris@14: */ Chris@14: public function open($url) Chris@14: { Chris@14: $this->curl('POST', '/url', array('url' => $url)); Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Get browser capabilities: /session/:sessionId (GET) Chris@14: * Chris@14: * @return mixed Chris@14: */ Chris@14: public function capabilities() Chris@14: { Chris@14: if (! isset($this->capabilities)) { Chris@14: $result = $this->curl('GET', ''); Chris@14: Chris@14: $this->capabilities = $result['value']; Chris@14: } Chris@14: Chris@14: return $this->capabilities; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Close session: /session/:sessionId (DELETE) Chris@14: * Chris@14: * @return mixed Chris@14: */ Chris@14: public function close() Chris@14: { Chris@14: $result = $this->curl('DELETE', ''); Chris@14: Chris@14: return $result['value']; Chris@14: } Chris@14: Chris@14: // There's a limit to our ability to exploit the dynamic nature of PHP when it Chris@14: // comes to the cookie methods because GET and DELETE request methods are indistinguishable Chris@14: // from each other: neither takes parameters. Chris@14: Chris@14: /** Chris@14: * Get all cookies: /session/:sessionId/cookie (GET) Chris@14: * Alternative to: $session->cookie(); Chris@14: * Chris@14: * Note: get cookie by name not implemented in API Chris@14: * Chris@14: * @return mixed Chris@14: */ Chris@14: public function getAllCookies() Chris@14: { Chris@14: $result = $this->curl('GET', '/cookie'); Chris@14: Chris@14: return $result['value']; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Set cookie: /session/:sessionId/cookie (POST) Chris@14: * Alternative to: $session->cookie($cookie_json); Chris@14: * Chris@14: * @param array $cookieJson Chris@14: * Chris@14: * @return \WebDriver\Session Chris@14: */ Chris@14: public function setCookie($cookieJson) Chris@14: { Chris@14: $this->curl('POST', '/cookie', array('cookie' => $cookieJson)); Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Delete all cookies: /session/:sessionId/cookie (DELETE) Chris@14: * Chris@14: * @return \WebDriver\Session Chris@14: */ Chris@14: public function deleteAllCookies() Chris@14: { Chris@14: $this->curl('DELETE', '/cookie'); Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Delete a cookie: /session/:sessionId/cookie/:name (DELETE) Chris@14: * Chris@14: * @param string $cookieName Chris@14: * Chris@14: * @return \WebDriver\Session Chris@14: */ Chris@14: public function deleteCookie($cookieName) Chris@14: { Chris@14: $this->curl('DELETE', '/cookie/' . $cookieName); Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: /** Chris@14: * window methods: /session/:sessionId/window (POST, DELETE) Chris@14: * - $session->window() - close current window Chris@14: * - $session->window($name) - set focus Chris@14: * - $session->window($window_handle)->method() - chaining Chris@14: * Chris@14: * @return \WebDriver\Window|\WebDriver\Session Chris@14: */ Chris@14: public function window() Chris@14: { Chris@14: // close current window Chris@14: if (func_num_args() === 0) { Chris@14: $this->curl('DELETE', '/window'); Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: // set focus Chris@14: $arg = func_get_arg(0); // window handle or name attribute Chris@14: Chris@14: if (is_array($arg)) { Chris@14: $this->curl('POST', '/window', $arg); Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: // chaining Chris@14: return new Window($this->url . '/window', $arg); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Delete window: /session/:sessionId/window (DELETE) Chris@14: * Chris@14: * @return \WebDriver\Session Chris@14: */ Chris@14: public function deleteWindow() Chris@14: { Chris@14: $this->curl('DELETE', '/window'); Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Set focus to window: /session/:sessionId/window (POST) Chris@14: * Chris@14: * @param mixed $name window handler or name attribute Chris@14: * Chris@14: * @return \WebDriver\Session Chris@14: */ Chris@14: public function focusWindow($name) Chris@14: { Chris@14: $this->curl('POST', '/window', array('name' => $name)); Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: /** Chris@14: * frame methods: /session/:sessionId/frame (POST) Chris@14: * - $session->frame($json) - change focus to another frame on the page Chris@14: * - $session->frame()->method() - chaining Chris@14: * Chris@14: * @return \WebDriver\Session|\WebDriver\Frame Chris@14: */ Chris@14: public function frame() Chris@14: { Chris@14: if (func_num_args() === 1) { Chris@14: $arg = func_get_arg(0); // json Chris@14: Chris@14: $this->curl('POST', '/frame', $arg); Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: // chaining Chris@14: return new Frame($this->url . '/frame'); Chris@14: } Chris@14: Chris@14: /** Chris@14: * timeouts methods: /session/:sessionId/timeouts (POST) Chris@14: * - $session->timeouts($json) - set timeout for an operation Chris@14: * - $session->timeouts()->method() - chaining Chris@14: * Chris@14: * @return \WebDriver\Session|\WebDriver\Timeouts Chris@14: */ Chris@14: public function timeouts() Chris@14: { Chris@14: // set timeouts Chris@14: if (func_num_args() === 1) { Chris@14: $arg = func_get_arg(0); // json Chris@14: Chris@14: $this->curl('POST', '/timeouts', $arg); Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: if (func_num_args() === 2) { Chris@14: $arg = array( Chris@14: 'type' => func_get_arg(0), // 'script' or 'implicit' Chris@14: 'ms' => func_get_arg(1), // timeout in milliseconds Chris@14: ); Chris@14: Chris@14: $this->curl('POST', '/timeouts', $arg); Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: // chaining Chris@14: return new Timeouts($this->url . '/timeouts'); Chris@14: } Chris@14: Chris@14: /** Chris@14: * ime method chaining, e.g., Chris@14: * - $session->ime()->method() Chris@14: * Chris@14: * @return \WebDriver\Ime Chris@14: */ Chris@14: public function ime() Chris@14: { Chris@14: return new Ime($this->url . '/ime'); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Get active element (i.e., has focus): /session/:sessionId/element/active (POST) Chris@14: * - $session->activeElement() Chris@14: * Chris@14: * @return mixed Chris@14: */ Chris@14: public function activeElement() Chris@14: { Chris@14: $result = $this->curl('POST', '/element/active'); Chris@14: Chris@14: return $this->webDriverElement($result['value']); Chris@14: } Chris@14: Chris@14: /** Chris@14: * touch method chaining, e.g., Chris@14: * - $session->touch()->method() Chris@14: * Chris@14: * @return \WebDriver\Touch Chris@14: * Chris@14: */ Chris@14: public function touch() Chris@14: { Chris@14: return new Touch($this->url . '/touch'); Chris@14: } Chris@14: Chris@14: /** Chris@14: * local_storage method chaining, e.g., Chris@14: * - $session->local_storage()->method() Chris@14: * Chris@14: * @return \WebDriver\Storage Chris@14: */ Chris@14: public function local_storage() Chris@14: { Chris@14: return Storage::factory('local', $this->url . '/local_storage'); Chris@14: } Chris@14: Chris@14: /** Chris@14: * session_storage method chaining, e.g., Chris@14: * - $session->session_storage()->method() Chris@14: * Chris@14: * @return \WebDriver\Storage Chris@14: */ Chris@14: public function session_storage() Chris@14: { Chris@14: return Storage::factory('session', $this->url . '/session_storage'); Chris@14: } Chris@14: Chris@14: /** Chris@14: * application cache chaining, e.g., Chris@14: * - $session->application_cache()->status() Chris@14: * Chris@14: * @return \WebDriver\ApplicationCache Chris@14: */ Chris@14: public function application_cache() Chris@14: { Chris@14: return new ApplicationCache($this->url . '/application_cache'); Chris@14: } Chris@14: Chris@14: /** Chris@14: * log methods: /session/:sessionId/log (POST) Chris@14: * - $session->log($type) - get log for given log type Chris@14: * - $session->log()->method() - chaining Chris@14: * Chris@14: * @return mixed Chris@14: */ Chris@14: public function log() Chris@14: { Chris@14: // get log for given log type Chris@14: if (func_num_args() === 1) { Chris@14: $arg = func_get_arg(0); Chris@14: Chris@14: if (is_string($arg)) { Chris@14: $arg = array( Chris@14: 'type' => $arg, Chris@14: ); Chris@14: } Chris@14: Chris@14: $result = $this->curl('POST', '/log', $arg); Chris@14: Chris@14: return $result['value']; Chris@14: } Chris@14: Chris@14: // chaining Chris@14: return new Log($this->url . '/log'); Chris@14: } Chris@14: Chris@14: /** Chris@14: * {@inheritdoc} Chris@14: */ Chris@14: protected function getElementPath($elementId) Chris@14: { Chris@14: return sprintf('%s/element/%s', $this->url, $elementId); Chris@14: } Chris@14: }