Warning

This document is for an old release of Galaxy. You can alternatively view this page in the latest release if it exists or view the top of the latest release's documentation.

Source code for galaxy.selenium.smart_components

from typing import (
    List,
    Optional,
)

from selenium.webdriver.support.select import Select

from galaxy.navigation.components import (
    Component,
    Target,
)
from .axe_results import (
    AxeResults,
    Impact,
)


[docs]class SmartComponent: """Wrap a Component with driver aware methods. Adapts Galaxy's component locators more tightly to Selenium - including a Selenium runtime. Allows smarter selectors that know how to wait for themselves, test themselves, click themselves, etc.... More "magic", but much cleaner usage. """
[docs] def __init__(self, component, has_driver): self._component = component self._has_driver = has_driver
def __getattr__(self, name): return self._wrap(getattr(self._component, name)) def __getitem__(self, name): return self._wrap(self._component[name]) def _wrap(self, simple_object): if isinstance(simple_object, Component): return SmartComponent(simple_object, self._has_driver) elif isinstance(simple_object, Target): return SmartTarget(simple_object, self._has_driver) else: return simple_object
[docs]class SmartTarget: """Wrap a Target with driver aware methods."""
[docs] def __init__(self, target, has_driver): self._target = target self._has_driver = has_driver
def __call__(self, *args, **kwds): return self._wrap(self._target(*args[:], **kwds.copy())) def __getattr__(self, name): return self._wrap(getattr(self._target, name)) def __getitem__(self, name): return self._wrap(self._target[name]) def _wrap(self, simple_object): if isinstance(simple_object, Target): return SmartTarget(simple_object, self._has_driver) else: return simple_object
[docs] def all(self): return self._has_driver.driver.find_elements(*self._target.element_locator)
[docs] def wait_for_element_count_of_at_least(self, n: int, **kwds): self._has_driver.wait_for_element_count_of_at_least(self._target, n, **kwds)
[docs] def wait_for_and_click(self, **kwds): return self._has_driver.wait_for_and_click(self._target, **kwds)
[docs] def wait_for_visible(self, **kwds): return self._has_driver.wait_for_visible(self._target, **kwds)
[docs] def wait_for_select(self, **kwds): return Select(self.wait_for_visible(**kwds))
[docs] def wait_for_clickable(self, **kwds): return self._has_driver.wait_for_clickable(self._target, **kwds)
[docs] def wait_for_text(self, **kwds): return self._has_driver.wait_for_visible(self._target, **kwds).text
[docs] def wait_for_value(self, **kwds): return self._has_driver.wait_for_visible(self._target, **kwds).get_attribute("value")
@property def is_displayed(self): return self._has_driver.is_displayed(self._target) @property def is_absent(self): return self._has_driver.element_absent(self._target)
[docs] def wait_for_absent_or_hidden(self, **kwds): self._has_driver.wait_for_absent_or_hidden(self._target, **kwds)
[docs] def wait_for_absent(self, **kwds): self._has_driver.wait_for_absent(self._target, **kwds)
[docs] def wait_for_present(self, **kwds): return self._has_driver.wait_for_present(self._target, **kwds)
[docs] def assert_absent(self, **kwds): self._has_driver.assert_absent(self._target, **kwds)
[docs] def assert_absent_or_hidden(self, **kwds): self._has_driver.assert_absent_or_hidden(self._target, **kwds)
[docs] def assert_absent_or_hidden_after_transitions(self, **kwds): self._has_driver.assert_absent_or_hidden_after_transitions(self._target, **kwds)
[docs] def assert_disabled(self, **kwds): self._has_driver.assert_disabled(self._target, **kwds)
[docs] def data_value(self, attribute: str): full_attribute = f"data-{attribute}" attribute_value = ( self._has_driver.driver.find_element(*self._target.element_locator).get_attribute(full_attribute) or "" ) return attribute_value
[docs] def assert_data_value(self, attribute: str, expected_value: str): if (actual_value := self.data_value(attribute)) != expected_value: message = f"Expected data-{attribute} to have value [{expected_value}] but had value [{actual_value}]" raise AssertionError(message)
[docs] def has_class(self, class_name): classes_str = self._has_driver.driver.find_element(*self._target.element_locator).get_attribute("class") or "" return class_name in classes_str.split(" ")
[docs] def wait_for_and_send_keys(self, *text): self.wait_for_visible().send_keys(*text)
[docs] def wait_for_and_clear_and_send_keys(self, *text): dom_element = self.wait_for_visible() dom_element.clear() dom_element.send_keys(*text)
[docs] def axe_eval(self) -> AxeResults: return self._has_driver.axe_eval(context=self._target.element_locator[1])
[docs] def assert_no_axe_violations_with_impact_of_at_least( self, impact: Impact, excludes: Optional[List[str]] = None ) -> None: self.wait_for_visible() self.axe_eval().assert_no_violations_with_impact_of_at_least(impact, excludes=excludes)
def __str__(self): return f"SmartTarget[_target={self._target}]"