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."""
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 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_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_present(self, **kwds):
return self._has_driver.wait_for_present(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_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}]"