| Index: chrome/test/chromedriver/chromedriver.py
|
| diff --git a/chrome/test/chromedriver/chromedriver.py b/chrome/test/chromedriver/chromedriver.py
|
| index a801f2c5d02c9240e5de1215ad09d396fd6865d1..8b3766b729ead2d539a8c941168855d6dcb9e467 100644
|
| --- a/chrome/test/chromedriver/chromedriver.py
|
| +++ b/chrome/test/chromedriver/chromedriver.py
|
| @@ -5,12 +5,16 @@
|
| import ctypes
|
| import json
|
|
|
| +from webelement import WebElement
|
| +
|
| class ChromeDriverException(Exception):
|
| pass
|
| class NoSuchElement(ChromeDriverException):
|
| pass
|
| class UnknownCommand(ChromeDriverException):
|
| pass
|
| +class StaleElementReference(ChromeDriverException):
|
| + pass
|
| class UnknownError(ChromeDriverException):
|
| pass
|
| class XPathLookupError(ChromeDriverException):
|
| @@ -26,6 +30,7 @@ def _ExceptionForResponse(response):
|
| exception_class_map = {
|
| 7: NoSuchElement,
|
| 9: UnknownCommand,
|
| + 10: StaleElementReference,
|
| 13: UnknownError,
|
| 19: XPathLookupError,
|
| 32: InvalidSelector,
|
| @@ -53,6 +58,36 @@ class ChromeDriver(object):
|
| }
|
| self._session_id = self._ExecuteCommand('newSession', params)['sessionId']
|
|
|
| + def _WrapValue(self, value):
|
| + """Wrap value from client side for chromedriver side."""
|
| + if isinstance(value, dict):
|
| + converted = {}
|
| + for key, val in value.items():
|
| + converted[key] = self._WrapValue(val)
|
| + return converted
|
| + elif isinstance(value, WebElement):
|
| + return {'ELEMENT': value._id}
|
| + elif isinstance(value, list):
|
| + return list(self._WrapValue(item) for item in value)
|
| + else:
|
| + return value
|
| +
|
| + def _UnwrapValue(self, value):
|
| + """Unwrap value from chromedriver side for client side."""
|
| + if isinstance(value, dict):
|
| + if (len(value) == 1 and 'ELEMENT' in value
|
| + and isinstance(value['ELEMENT'], basestring)):
|
| + return WebElement(self, value['ELEMENT'])
|
| + else:
|
| + unwraped = {}
|
| + for key, val in value.items():
|
| + unwraped[key] = self._UnwrapValue(val)
|
| + return unwraped
|
| + elif isinstance(value, list):
|
| + return list(self._UnwrapValue(item) for item in value)
|
| + else:
|
| + return value
|
| +
|
| def _ExecuteCommand(self, name, params={}, session_id=''):
|
| cmd = {
|
| 'name': name,
|
| @@ -74,18 +109,21 @@ class ChromeDriver(object):
|
| raise _ExceptionForResponse(response)
|
| return response
|
|
|
| - def _ExecuteSessionCommand(self, name, params={}):
|
| - return self._ExecuteCommand(name, params, self._session_id)['value']
|
| + def ExecuteSessionCommand(self, name, params={}):
|
| + params = self._WrapValue(params)
|
| + return self._UnwrapValue(
|
| + self._ExecuteCommand(name, params, self._session_id)['value'])
|
|
|
| def Load(self, url):
|
| - self._ExecuteSessionCommand('get', {'url': url})
|
| + self.ExecuteSessionCommand('get', {'url': url})
|
|
|
| def ExecuteScript(self, script, *args):
|
| - return self._ExecuteSessionCommand(
|
| - 'executeScript', {'script': script, 'args': args})
|
| + converted_args = list(args)
|
| + return self.ExecuteSessionCommand(
|
| + 'executeScript', {'script': script, 'args': converted_args})
|
|
|
| def SwitchToFrame(self, id_or_name):
|
| - self._ExecuteSessionCommand('switchToFrame', {'id': id_or_name})
|
| + self.ExecuteSessionCommand('switchToFrame', {'id': id_or_name})
|
|
|
| def SwitchToFrameByIndex(self, index):
|
| self.SwitchToFrame(index)
|
| @@ -94,32 +132,32 @@ class ChromeDriver(object):
|
| self.SwitchToFrame(None)
|
|
|
| def GetTitle(self):
|
| - return self._ExecuteSessionCommand('getTitle')
|
| + return self.ExecuteSessionCommand('getTitle')
|
|
|
| def FindElement(self, strategy, target):
|
| - return self._ExecuteSessionCommand(
|
| - 'findElement', {'using': strategy, 'value': target})
|
| + return self.ExecuteSessionCommand(
|
| + 'findElement', {'using': strategy, 'value': target})
|
|
|
| def FindElements(self, strategy, target):
|
| - return self._ExecuteSessionCommand(
|
| - 'findElements', {'using': strategy, 'value': target})
|
| + return self.ExecuteSessionCommand(
|
| + 'findElements', {'using': strategy, 'value': target})
|
|
|
| def SetTimeout(self, type, timeout):
|
| - return self._ExecuteSessionCommand(
|
| - 'setTimeout', {'type' : type, 'ms': timeout})
|
| + return self.ExecuteSessionCommand(
|
| + 'setTimeout', {'type' : type, 'ms': timeout})
|
|
|
| def GetCurrentUrl(self):
|
| - return self._ExecuteSessionCommand('getCurrentUrl')
|
| + return self.ExecuteSessionCommand('getCurrentUrl')
|
|
|
| def GoBack(self):
|
| - return self._ExecuteSessionCommand('goBack')
|
| + return self.ExecuteSessionCommand('goBack')
|
|
|
| def GoForward(self):
|
| - return self._ExecuteSessionCommand('goForward')
|
| + return self.ExecuteSessionCommand('goForward')
|
|
|
| def Refresh(self):
|
| - return self._ExecuteSessionCommand('refresh')
|
| + return self.ExecuteSessionCommand('refresh')
|
|
|
| def Quit(self):
|
| """Quits the browser and ends the session."""
|
| - self._ExecuteSessionCommand('quit')
|
| + self.ExecuteSessionCommand('quit')
|
|
|