[Checkins] SVN: zc.testbrowser/trunk/src/zc/testbrowser/real. implement Form.getControl

Justas Sadzevičius justas at pov.lt
Tue Sep 25 14:48:29 EDT 2007


Log message for revision 80038:
  implement Form.getControl
  

Changed:
  U   zc.testbrowser/trunk/src/zc/testbrowser/real.js
  U   zc.testbrowser/trunk/src/zc/testbrowser/real.py

-=-
Modified: zc.testbrowser/trunk/src/zc/testbrowser/real.js
===================================================================
--- zc.testbrowser/trunk/src/zc/testbrowser/real.js	2007-09-25 18:46:57 UTC (rev 80037)
+++ zc.testbrowser/trunk/src/zc/testbrowser/real.js	2007-09-25 18:48:29 UTC (rev 80038)
@@ -12,11 +12,17 @@
         pattern, context, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
 }
 
-function tb_xpath_tokens(pattern, context) {
+function tb_xpath_tokens(pattern, contextToken) {
     var tokens = new Array();
-    var result = tb_xpath(pattern, context)
+    var context = null;
+    if (contextToken != null) {
+        context = tb_tokens[contextToken]
+    }
+    var result = tb_xpath(pattern, context);
+    var debug_tokens = new Array();
     for (var c = 0; c < result.snapshotLength; c++) {
         tb_tokens[tb_next_token] = result.snapshotItem(c);
+        debug_tokens.push(tb_tokens[tb_next_token].tagName);
         tokens.push(tb_next_token++);
     }
     return tokens.toSource();
@@ -154,7 +160,7 @@
 function tb_get_control_by_predicate(
     predicate, index, allowDuplicate, context, xpath) {
     if (xpath == null) {
-        var xpath = '//input | //select | //option | //textarea';
+        var xpath = './/input | .//select | .//option | .//textarea';
     }
     var res = tb_xpath(xpath, context)
     var i=0;
@@ -245,14 +251,22 @@
         }, index, false, context, xpath)
 }
 
-function tb_get_control_by_name(name, index) {
+function tb_get_control_by_name(name, index, contextToken, xpath) {
     return tb_get_control_by_predicate(
         function (control) {
             var controlName = control.getAttribute('name');
             return controlName != null && controlName.indexOf(name) != -1;
-        }, index, true)
+        }, index, true, tb_tokens[contextToken], xpath)
 }
 
+function tb_get_control_by_id(id, index, contextToken, xpath) {
+    return tb_get_control_by_predicate(
+        function (control) {
+            var controlId = control.getAttribute('id');
+            return controlId != null && controlName.indexOf(id) != -1;
+        }, index, true, tb_tokens[contextToken], xpath)
+}
+
 function tb_get_listcontrol_options(token) {
     var elem = tb_tokens[token];
     var tagName = elem.tagName;

Modified: zc.testbrowser/trunk/src/zc/testbrowser/real.py
===================================================================
--- zc.testbrowser/trunk/src/zc/testbrowser/real.py	2007-09-25 18:46:57 UTC (rev 80037)
+++ zc.testbrowser/trunk/src/zc/testbrowser/real.py	2007-09-25 18:48:29 UTC (rev 80038)
@@ -240,33 +240,49 @@
     def _follow_link(self, token):
         self.execute('tb_follow_link(%s)' % token)
 
+    def getControlToken(self, label=None, name=None, index=None,
+                        _token=None, _xpath=None):
+        js_index = simplejson.dumps(index)
+        token = None
+        if label is not None:
+            token = self.execute('tb_get_control_by_label(%s, %s, %s, %s)'
+                 % (simplejson.dumps(label), js_index,
+                    simplejson.dumps(_token),
+                    simplejson.dumps(_xpath)))
+        elif name is not None:
+            token = self.execute('tb_get_control_by_name(%s, %s, %s, %s)'
+                 % (simplejson.dumps(name), js_index,
+                    simplejson.dumps(_token),
+                    simplejson.dumps(_xpath)))
+        elif id is not None:
+            token = self.execute('tb_get_control_by_id(%s, %s, %s, %s)'
+                 % (simplejson.dumps(id), js_index,
+                    simplejson.dumps(_token),
+                    simplejson.dumps(_xpath)))
+        return token
+
     def getControl(self, label=None, name=None, index=None):
         zc.testbrowser.browser.onlyOne([label, name], '"label" and "name"')
-        js_index = simplejson.dumps(index)
-        selectionItem = False
+        token = self.getControlToken(label, name, index)
+
         if label is not None:
             msg = 'label %r' % label
-            token = self.execute('tb_get_control_by_label(%s, %s)'
-                 % (simplejson.dumps(label), js_index))
-            if (token not in ('false', 'ambiguity error')):
-                inputType = self.execute(
-                    'tb_tokens[%s].getAttribute("type")' % token)
-                if inputType and inputType.lower() in ('radio', 'checkbox'):
-                    selectionItem = True
         elif name is not None:
             msg = 'name %r' % name
-            token = self.execute('tb_get_control_by_name(%s, %s)'
-                 % (simplejson.dumps(name), js_index))
         elif id is not None:
             msg = 'id %r' % id
-            token = self.execute('tb_get_control_by_id(%s, %s)'
-                 % (simplejson.dumps(id), js_index))
 
+        selectionItem = False
+        if (token not in ('false', 'ambiguity error')):
+            inputType = self.execute(
+                'tb_tokens[%s].getAttribute("type")' % token)
+            if inputType and inputType.lower() in ('radio', 'checkbox'):
+                setlectionItem = True
+
         if token == 'false':
             raise LookupError(msg)
         elif token == 'ambiguity error':
             raise AmbiguityError(msg)
-
         return controlFactory(token, self, selectionItem)
 
     def getForm(self, id=None, name=None, action=None, index=None):
@@ -486,30 +502,25 @@
     def getControl(self, label=None, value=None, index=None):
         if self._browser_counter != self.browser._counter:
             raise zc.testbrowser.interfaces.ExpiredError
-
         zc.testbrowser.browser.onlyOne([label, value], '"label" and "value"')
 
-        js_index = simplejson.dumps(index)
-        selectionItem = False
         if label is not None:
             msg = 'label %r' % label
-            token = self.browser.execute(
-                'tb_get_control_by_label(%s, %s, %r, ".//input | .//option")'
-                 % (simplejson.dumps(label), js_index, self.token))
-            if (token not in ('false', 'ambiguity error')):
-                inputType = self.browser.execute(
-                    'tb_tokens[%s].getAttribute("type")' % token)
-                if inputType and inputType.lower() in ('radio', 'checkbox'):
-                    selectionItem = True
         elif name is not None:
             msg = 'name %r' % name
-            token = self.browser.execute('tb_get_control_by_name(%s, %s)'
-                 % (simplejson.dumps(name), js_index))
         elif id is not None:
             msg = 'id %r' % id
-            token = self.browser.execute('tb_get_control_by_id(%s, %s)'
-                 % (simplejson.dumps(id), js_index))
 
+        selectionItem = False
+        token = self.browser.getControlToken(
+            label, value, index, self.token, ".//input | .//option")
+
+        if (token not in ('false', 'ambiguity error')):
+            inputType = self.browser.execute(
+                'tb_tokens[%s].getAttribute("type")' % token)
+            if inputType and inputType.lower() in ('radio', 'checkbox'):
+                selectionItem = True
+
         if token == 'false':
             raise LookupError(msg)
         elif token == 'ambiguity error':
@@ -660,4 +671,30 @@
         raise NotImplementedError
 
     def getControl(self, label=None, name=None, index=None):
-        raise NotImplementedError
+        if self._browser_counter != self.browser._counter:
+            raise zc.testbrowser.interfaces.ExpiredError
+        zc.testbrowser.browser.onlyOne([label, name], '"label" and "name"')
+
+        if label is not None:
+            msg = 'label %r' % label
+        elif name is not None:
+            msg = 'name %r' % name
+        elif id is not None:
+            msg = 'id %r' % id
+
+        selectionItem = False
+        token = self.browser.getControlToken(
+            label, name, index, self.token)
+
+        if (token not in ('false', 'ambiguity error')):
+            inputType = self.browser.execute(
+                'tb_tokens[%s].getAttribute("type")' % token)
+            if inputType and inputType.lower() in ('radio', 'checkbox'):
+                selectionItem = True
+
+        if token == 'false':
+            raise LookupError(msg)
+        elif token == 'ambiguity error':
+            raise AmbiguityError(msg)
+
+        return controlFactory(token, self.browser, selectionItem)



More information about the Checkins mailing list