如何从css找到的列表中引用特定元素

2024-10-01 11:41:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我的项目是使用Robot框架和selenium2库来测试一个web系统。在

我需要使用css定位器找到的元素列表中的特定元素。例如,.innerTable>;tbody>;tr>;td将找到10个元素,我将需要这些元素中的第二个元素。在我之前的项目中,我可以执行以下操作来引用所需的元素:

specific_cell = driver.find_elements(By.CSS_SELECTOR, ".innerTable>tbody>tr>td")[1]

这意味着它创建了一个元素列表,并且使用index我可以选择一个特定的元素。但是有人知道我是否可以用Robot framework+Selenium2Library做类似的事情吗?在


我想知道是否有办法只使用selenium2库关键字就可以得到结果。显然,这是不可能与现有的关键字。在

为了实现使用由定位器标识的多个元素中的一个特定元素的可能性(在最初的问题中,这些元素是由css选择器找到的表单元格),我们需要深入到selenium2库库并在其中创建新方法。在

在C:\Python27\Lib\site packages\Selenium2Library\keywords中_元素.py可以加上这样一种方法

^{pr2}$

这将返回一个webelements对象的列表,这个列表可以用来指出一个特定的元素,然后对它执行一些操作。但是如果您需要像click、gettext或type这样的操作,那么必须在同一个类中创建其他方法。 好吧,这看起来不是一个最佳的方法,但至少能起到作用。 另一个选择是使用xpath,不必担心上面写的内容,但是一旦您用大量类似的元素对巨大的页面进行成像,并在这里添加了使用internetexplorer的要求,那么xpath可能是您想要避免的


Tags: 项目方法gt元素列表robot关键字css
2条回答

如果找不到前面有许多同级的元素,则可以使用相邻的同级选择器。 在下面的示例中,为第二个排序项选择一个定位器:

css= ol > li:first-child + li

可以考虑创建的一个关键字是Assign Id To Nth Element。 它与Assign Id To Element相同,只是Id被分配给元素集合中使用给定定位器返回的第n个元素。 这将允许您在不修改selenium2库的情况下使用其他关键字。 例如:

^{pr2}$

这将使选择一个有许多兄弟姐妹的孩子更容易。 对于相邻的兄弟选择器,在这种情况下选择器将非常大,因为第n个子对象在CSS3之前不可用。在

下面是Assign Id To Nth Element的实现:

from robot.libraries.BuiltIn import BuiltIn


class S2LExt(object):

    def assign_id_to_nth_element(self, locator, id, n):
        """Assigns a temporary identifier to the Nth element found.

        This is mainly useful if the locator is complicated/slow XPath expression.
        Identifier expires when the page is reloaded. `n` is 1-based index of the
        element in the set found with the given `locator` to assign an ID to.

        Example:
        | Assign ID to Nth Element | xpath=//div[@id="first_div"] | my id | 5 |
        | Page Should Contain Element | my id |
        """
        lib = BuiltIn().get_library_instance('Selenium2Library')
        n = int(n)
        elements = lib._element_find(locator, False, True)
        if len(elements) < n:
            raise IndexError("Only %d elements found using locator '%s'." % (len(elements), locator))
        lib._info("Assigning temporary id '%s' to element '%s'" % (id, locator))
        lib._current_browser().execute_script("arguments[0].id = '%s';" % id, elements[n-1])

我总是建议而不是抓住一个小元素并给它命名。创建一个更大的元素体,让那些使用你的元素的人定义他们想要的。在

class TablePage(object):
    """A page with a table on it."""

    def __init__(self):            
        # I would call super() on the `BasePage` here.
        pass

    @property
    def table_element(self):
        # factored out: '.innerTable td'
        css = '.innerTable > tbody > tr > td'
        return self.driver.find_elements(By.CSS_SELECTOR, css)

    def find_in_table_element(self, table_text):
        for entry in self.table_element:
            # you may want case-sensitive here
            if entry.text.lower == table_text.lower
            return entry
        return [] #  or None...

您可以在这里更流畅地使用它,依赖于您的应用程序代码来完成实际的工作,并有望减少对您的维护。网页总是在变化!在

您可以这样实现:

^{pr2}$

相关问题 更多 >