modules/components/dropdown.py (46 lines of code) (raw):
from pypom import Region
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from modules.util import PomUtils
class Dropdown(Region):
"""
PyPOM Region factory for Dropdown menus in about:prefs. See PyPOM docs on Regions.
"""
def __init__(self, page, require_shadow=True, **kwargs):
super().__init__(page, **kwargs)
self.utils = PomUtils(self.page.driver)
if require_shadow:
self.shadow_elements = self.utils.get_shadow_content(self.root)
self.dropmarker = next(
el for el in self.shadow_elements if el.tag_name == "dropmarker"
)
@property
def loaded(self):
return self.root if EC.element_to_be_clickable(self.root) else False
def select_option(
self,
option_name: str,
double_click=False,
wait_for_selection=True,
option_tag="menuitem",
label_name="label",
):
"""Select an option in the dropdown. Does not return self."""
try:
if not self.dropmarker.get_attribute("open") == "true":
self.root.click()
except AttributeError:
self.root.click()
matching_menuitems = [
el
for el in self.root.find_elements(By.CSS_SELECTOR, option_tag)
if el.get_attribute(label_name) == option_name
]
if len(matching_menuitems) == 0:
return False
elif len(matching_menuitems) == 1:
if double_click:
self.page.double_click(reference=matching_menuitems[0])
else:
matching_menuitems[0].click()
if wait_for_selection:
self.wait.until(EC.element_to_be_selected(matching_menuitems[0]))
# self.root.send_keys(Keys.ESCAPE)
return self
else:
raise ValueError("More than one menu item matched search string")