Source code for splinter.element_list

# Copyright 2012 splinter authors. All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.
from splinter.exceptions import ElementDoesNotExist


[docs] class ElementList: """Collection of elements. Each member of the collection is by default an instance of :class:`ElementAPI <splinter.driver.ElementAPI>`. Beyond the traditional list methods, ``ElementList`` provides some other methods, listed below. There is a peculiar behavior on ElementList: you never get an ``IndexError``. Instead, you get an :class:`ElementDoesNotExist <splinter.exceptions.ElementDoesNotExist>` exception when trying to access a non-existent item: >>> element_list = ElementList([]) >>> element_list[0] # raises ElementDoesNotExist """ def __init__( self, elements: list, driver=None, find_by=None, query=None, ) -> None: self._container = [] self._container.extend(elements) self.driver = driver self.find_by = find_by self.query = query def __getitem__(self, index): if not isinstance(index, int) and not isinstance(index, slice): return self.first[index] try: return self._container[index] except IndexError as err: raise ElementDoesNotExist( f'No elements were found with {self.find_by} "{self.query}"', ) from err @property def first(self): """An alias to the first element of the list. Example: >>> assert element_list[0] == element_list.first """ return self[0] @property def last(self): """An alias to the last element of the list. Example: >>> assert element_list[-1] == element_list.last """ return self[-1]
[docs] def is_empty(self) -> bool: """Check if the ElementList is empty. Returns: bool: True if the list is empty, else False """ return len(self) == 0
def __getattr__(self, name: str): try: return getattr(self.first, name) except AttributeError: try: return getattr(self._container, name) except AttributeError as err: raise AttributeError( f"'{self.__class__.__name__}' object has no attribute '{name}'", ) from err def __iter__(self): yield from self._container def __len__(self) -> int: """__len__ checks the internal container.""" return len(self._container) def __repr__(self) -> str: """Return the repr of the internal container.""" return repr(self._container)