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")