# Group Key Features ```{note} Here you will find information on complex or ambiguous functionality. For a comprehensive list of all available methods, please refer to the {doc}`Group Interface <./interface>` documentation. ``` The `Group` class extends the `Element` class to provide a mechanism for grouping related elements together and managing their context within a web page. This grouping facilitates the creation of more organized and reusable Page Component Object Models (PCOM).
## 1. Context Management The primary distinction between `Group` and `Element` is the ability to change the context from which element locators are resolved. By default, elements are located within the entire browser window. However, when an element is defined as an attribute within a `Group` class, its locator is searched within the context of the `Group`'s locator. The `Group` class offers flexibility in defining parent-child relationships. The `parent` arg of `Element` can be set to `False` to opt out of automatic assignment or to any other `Element` to create custom hierarchies. For more details, how `Element` object works refer to {doc}`Element documentation <../element_object/index>`
### Implementation details The `Group` class automatically sets the `parent` argument for all of its element-based attributes during initialization. This `parent` value is used to determine the context within which the element's locator should be searched.
### Code example ```python from mops.base.element import Element from mops.base.group import Group from mops.base.driver_wrapper import DriverWrapper class Section(Group): def __init__(self): super().__init__('.section', name='section') section_button = Element('.button', name='section button') section_footer = Element('.footer', name='section button', parent=False) section_footer_link = Element('.link', name='section button', parent=section_footer) data = 'section data' # pytest usage def test_section_verification(driver_wrapper: DriverWrapper): section = Section() assert section.section_button.is_displayed() assert section.section_footer_link.text == 'www.example.com' ```
**Code Explanation - Section initialization:** * Automatically sets the `parent` argument for the `section_button` attribute to the `Section` instance. * Does not set the `parent` argument for the `section_footer` attribute because its own `parent` argument is `False`. * Does not set the `parent` argument for the `section_footer_link` attribute because its own `parent` argument already is `section_footer`. * Does not set the `parent` argument for the `data` attribute because it is not an instance of the `Element` object.
**Code Explanation - Behavior when methods are called:** * When the `is_displayed()` method of `section_button` is called: * The driver will initially search for the `Section` locator. * Then, it will proceed to locate the `section_button` element within the `Section` context. * When the `text` property of `section_footer_link` is called: * The driver will initially search for the `section_footer` locator. * Then, it will proceed to locate the `section_footer_link` element within the `section_footer` context.