Chris@14: Chris@14: * @author Anthon Pang Chris@14: */ Chris@14: Chris@14: namespace WebDriver; Chris@14: Chris@14: /** Chris@14: * WebDriver\Exception class Chris@14: * Chris@14: * @package WebDriver Chris@14: */ Chris@14: abstract class Exception extends \Exception Chris@14: { Chris@14: /** Chris@14: * Response status codes Chris@14: * Chris@14: * @link http://code.google.com/p/selenium/wiki/JsonWireProtocol#Response_Status_Codes Chris@14: */ Chris@14: const SUCCESS = 0; Chris@14: const NO_SUCH_DRIVER = 6; Chris@14: const NO_SUCH_ELEMENT = 7; Chris@14: const NO_SUCH_FRAME = 8; Chris@14: const UNKNOWN_COMMAND = 9; Chris@14: const STALE_ELEMENT_REFERENCE = 10; Chris@14: const ELEMENT_NOT_VISIBLE = 11; Chris@14: const INVALID_ELEMENT_STATE = 12; Chris@14: const UNKNOWN_ERROR = 13; Chris@14: const ELEMENT_IS_NOT_SELECTABLE = 15; Chris@14: const JAVASCRIPT_ERROR = 17; Chris@14: const XPATH_LOOKUP_ERROR = 19; Chris@14: const TIMEOUT = 21; Chris@14: const NO_SUCH_WINDOW = 23; Chris@14: const INVALID_COOKIE_DOMAIN = 24; Chris@14: const UNABLE_TO_SET_COOKIE = 25; Chris@14: const UNEXPECTED_ALERT_OPEN = 26; Chris@14: const NO_ALERT_OPEN_ERROR = 27; Chris@14: const SCRIPT_TIMEOUT = 28; Chris@14: const INVALID_ELEMENT_COORDINATES = 29; Chris@14: const IME_NOT_AVAILABLE = 30; Chris@14: const IME_ENGINE_ACTIVATION_FAILED = 31; Chris@14: const INVALID_SELECTOR = 32; Chris@14: const SESSION_NOT_CREATED = 33; Chris@14: const MOVE_TARGET_OUT_OF_BOUNDS = 34; Chris@14: Chris@14: // obsolete Chris@14: const INDEX_OUT_OF_BOUNDS = 1; Chris@14: const NO_COLLECTION = 2; Chris@14: const NO_STRING = 3; Chris@14: const NO_STRING_LENGTH = 4; Chris@14: const NO_STRING_WRAPPER = 5; Chris@14: const OBSOLETE_ELEMENT = 10; Chris@14: const ELEMENT_NOT_DISPLAYED = 11; Chris@14: const UNHANDLED = 13; Chris@14: const EXPECTED = 14; Chris@14: const ELEMENT_NOT_SELECTABLE = 15; Chris@14: const NO_SUCH_DOCUMENT = 16; Chris@14: const UNEXPECTED_JAVASCRIPT = 17; Chris@14: const NO_SCRIPT_RESULT = 18; Chris@14: const NO_SUCH_COLLECTION = 20; Chris@14: const NULL_POINTER = 22; Chris@14: const NO_MODAL_DIALOG_OPEN_ERROR = 27; Chris@14: Chris@14: // user-defined Chris@14: const CURL_EXEC = -1; Chris@14: const OBSOLETE_COMMAND = -2; Chris@14: const NO_PARAMETERS_EXPECTED = -3; Chris@14: const JSON_PARAMETERS_EXPECTED = -4; Chris@14: const UNEXPECTED_PARAMETERS = -5; Chris@14: const INVALID_REQUEST = -6; Chris@14: const UNKNOWN_LOCATOR_STRATEGY = -7; Chris@14: Chris@14: private static $errs = array( Chris@14: // self::SUCCESS => array('Success', 'This should never be thrown!'), Chris@14: Chris@14: self::NO_SUCH_DRIVER => array('NoSuchDriver', 'A session is either terminated or not started'), Chris@14: self::NO_SUCH_ELEMENT => array('NoSuchElement', 'An element could not be located on the page using the given search parameters.'), Chris@14: self::NO_SUCH_FRAME => array('NoSuchFrame', 'A request to switch to a frame could not be satisfied because the frame could not be found.'), Chris@14: self::UNKNOWN_COMMAND => array('UnknownCommand', 'The requested resource could not be found, or a request was received using an HTTP method that is not supported by the mapped resource.'), Chris@14: self::STALE_ELEMENT_REFERENCE => array('StaleElementReference', 'An element command failed because the referenced element is no longer attached to the DOM.'), Chris@14: self::ELEMENT_NOT_VISIBLE => array('ElementNotVisible', 'An element command could not be completed because the element is not visible on the page.'), Chris@14: self::INVALID_ELEMENT_STATE => array('InvalidElementState', 'An element command could not be completed because the element is in an invalid state (e.g., attempting to click a disabled element).'), Chris@14: self::UNKNOWN_ERROR => array('UnknownError', 'An unknown server-side error occurred while processing the command.'), Chris@14: self::ELEMENT_IS_NOT_SELECTABLE => array('ElementIsNotSelectable', 'An attempt was made to select an element that cannot be selected.'), Chris@14: self::JAVASCRIPT_ERROR => array('JavaScriptError', 'An error occurred while executing user supplied JavaScript.'), Chris@14: self::XPATH_LOOKUP_ERROR => array('XPathLookupError', 'An error occurred while searching for an element by XPath.'), Chris@14: self::TIMEOUT => array('Timeout', 'An operation did not complete before its timeout expired.'), Chris@14: self::NO_SUCH_WINDOW => array('NoSuchWindow', 'A request to switch to a different window could not be satisfied because the window could not be found.'), Chris@14: self::INVALID_COOKIE_DOMAIN => array('InvalidCookieDomain', 'An illegal attempt was made to set a cookie under a different domain than the current page.'), Chris@14: self::UNABLE_TO_SET_COOKIE => array('UnableToSetCookie', 'A request to set a cookie\'s value could not be satisfied.'), Chris@14: self::UNEXPECTED_ALERT_OPEN => array('UnexpectedAlertOpen', 'A modal dialog was open, blocking this operation'), Chris@14: self::NO_ALERT_OPEN_ERROR => array('NoAlertOpenError', 'An attempt was made to operate on a modal dialog when one was not open.'), Chris@14: self::SCRIPT_TIMEOUT => array('ScriptTimeout', 'A script did not complete before its timeout expired.'), Chris@14: self::INVALID_ELEMENT_COORDINATES => array('InvalidElementCoordinates', 'The coordinates provided to an interactions operation are invalid.'), Chris@14: self::IME_NOT_AVAILABLE => array('IMENotAvailable', 'IME was not available.'), Chris@14: self::IME_ENGINE_ACTIVATION_FAILED => array('IMEEngineActivationFailed', 'An IME engine could not be started.'), Chris@14: self::INVALID_SELECTOR => array('InvalidSelector', 'Argument was an invalid selector (e.g., XPath/CSS).'), Chris@14: self::SESSION_NOT_CREATED => array('SessionNotCreated', 'A new session could not be created (e.g., a required capability could not be set).'), Chris@14: self::MOVE_TARGET_OUT_OF_BOUNDS => array('MoveTargetOutOfBounds', 'Target provided for a move action is out of bounds.'), Chris@14: Chris@14: self::CURL_EXEC => array('CurlExec', 'curl_exec() error.'), Chris@14: self::OBSOLETE_COMMAND => array('ObsoleteCommand', 'This WebDriver command is obsolete.'), Chris@14: self::NO_PARAMETERS_EXPECTED => array('NoParametersExpected', 'This HTTP request method expects no parameters.'), Chris@14: self::JSON_PARAMETERS_EXPECTED => array('JsonParameterExpected', 'This POST request expects a JSON parameter (array).'), Chris@14: self::UNEXPECTED_PARAMETERS => array('UnexpectedParameters', 'This command does not expect this number of parameters.'), Chris@14: self::INVALID_REQUEST => array('InvalidRequest', 'This command does not support this HTTP request method.'), Chris@14: self::UNKNOWN_LOCATOR_STRATEGY => array('UnknownLocatorStrategy', 'This locator strategy is not supported.'), Chris@14: ); Chris@14: Chris@14: /** Chris@14: * Factory method to create WebDriver\Exception objects Chris@14: * Chris@14: * @param integer $code Code Chris@14: * @param string $message Message Chris@14: * @param \Exception $previousException Previous exception Chris@14: * Chris@14: * @return \Exception Chris@14: */ Chris@14: public static function factory($code, $message = null, $previousException = null) Chris@14: { Chris@14: // unknown error Chris@14: if (!isset(self::$errs[$code])) { Chris@14: if (trim($message) === '') { Chris@14: $message = 'Unknown Error'; Chris@14: } Chris@14: Chris@14: return new \Exception($message, $code, $previousException); Chris@14: } Chris@14: Chris@14: $errorDefinition = self::$errs[$code]; Chris@14: Chris@14: if (trim($message) === '') { Chris@14: $message = $errorDefinition[1]; Chris@14: } Chris@14: Chris@14: $className = __CLASS__ . '\\' . $errorDefinition[0]; Chris@14: Chris@14: return new $className($message, $code, $previousException); Chris@14: } Chris@14: }