From 8a99af00638b8bec2e350312c59ac4eaa29d6359 Mon Sep 17 00:00:00 2001
From: Arnaud Fontaine <arnaud.fontaine@nexedi.com>
Date: Thu, 31 Mar 2011 04:55:58 +0000
Subject: [PATCH] When selecting the content of a listbox cell, there may be
 several elements, thus allow to select which one to get

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk/utils@44851 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 erp5/util/test_browser/browser.py | 37 ++++++++++++++++++++++---------
 1 file changed, 26 insertions(+), 11 deletions(-)

diff --git a/erp5/util/test_browser/browser.py b/erp5/util/test_browser/browser.py
index 009a5a36fd..b511621a48 100644
--- a/erp5/util/test_browser/browser.py
+++ b/erp5/util/test_browser/browser.py
@@ -308,14 +308,19 @@ class Browser(ExtendedTestBrowser):
 
   _listbox_table_xpath_str = '//table[contains(@class, "listbox-table")]'
 
-  def getListboxLink(self, line_number, column_number, *args, **kwargs):
+  def getListboxLink(self, line_number, column_number, cell_element_index=1,
+                     *args, **kwargs):
     """
-    Follow the link at the given position.
+    Follow the link at the given position. In case there are several
+    links within a cell, C{cell_element_index} allows to select which
+    one to get (starting from 1).
 
     @param line_number: Line number of the link
     @type line_number: int
     @param column_number: Column number of the link
     @type column_number: int
+    @param cell_element_index: Index of the link to be selected in the cell
+    @type cell_element_index: int
     @param args: positional arguments given to C{getContextLink}
     @type args: list
     @param kwargs: keyword arguments given to C{getContextLink}
@@ -323,10 +328,11 @@ class Browser(ExtendedTestBrowser):
     @return: C{Link} at the given line and column number
     @rtype: L{zope.testbrowser.interfaces.ILink}
     """
-    xpath_str = '%s//tr[%d]//%s[%d]//a[0]' % (self._listbox_table_xpath_str,
-                                              line_number,
-                                              line_number <= 2 and 'th' or 'td',
-                                              column_number)
+    xpath_str = '%s//tr[%d]//%s[%d]//a[%d]' % (self._listbox_table_xpath_str,
+                                               line_number,
+                                               line_number <= 2 and 'th' or 'td',
+                                               column_number,
+                                               cell_element_index)
 
     return self.getContextLink(url=self.etree.xpath(xpath_str).get('href'),
                                *args, **kwargs)
@@ -659,17 +665,24 @@ class ContextMainForm(MainForm):
     """
     self.submit(name='Base_callDialogMethod:method')
 
-  def getListboxControl(self, line_number, column_number, *args, **kwargs):
+  def getListboxControl(self, line_number, column_number, cell_element_index=1,
+                        *args, **kwargs):
     """
     Get the control located at line and column numbers (both starting
     from 1). The position of a cell from a column or line number can
     be obtained through calling
     L{erp5.utils.test_browser.browser.Browser.getListboxPosition}.
 
+    Also, there may be several elements within a cell, thus
+    C{cell_element_index} allows to select which one to get (starting
+    from 1).
+
     @param line_number: Line number of the field
     @type line_number: int
     @param column_number: Column number of the field
     @type column_number: int
+    @param cell_element_index: Index of the control to be selected in the cell
+    @type cell_element_index: int
     @param args: positional arguments given to the parent C{getControl}
     @type args: list
     @param kwargs: keyword arguments given to the parent C{getControl}
@@ -679,10 +692,12 @@ class ContextMainForm(MainForm):
 
     @todo: What if there is more than one field in a cell?
     """
-    xpath_str = '%s//tr[%d]//%s[%d]/input' % (self.browser._listbox_table_xpath_str,
-                                              line_number,
-                                              (line_number <= 2 and u'th' or u'td'),
-                                              column_number)
+    xpath_str = '%s//tr[%d]//%s[%d]/input[%d]' % \
+        (self.browser._listbox_table_xpath_str,
+         line_number,
+         (line_number <= 2 and u'th' or u'td'),
+         column_number,
+         cell_element_index)
 
     input_element = self.browser.etree.xpath(xpath_str)[0]
 
-- 
2.30.9