Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5217)

Unified Diff: chrome/test/chromedriver/chromedriver.py

Issue 11884058: [chromedriver] Implement commands: findChildElement, findChildElements. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase. Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/test/chromedriver/command_executor_impl.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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')
« no previous file with comments | « no previous file | chrome/test/chromedriver/command_executor_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698