modules/browser_object_autofill_popup.py (57 lines of code) (raw):

from typing import Union from selenium.webdriver.remote.webelement import WebElement from selenium.webdriver.support import expected_conditions as EC from modules.page_base import BasePage class AutofillPopup(BasePage): """ Page Object Model for the popups that have to do with autofill (related to credit card and addresses) """ URL_TEMPLATE = "" iframe = None # Verification methods def verify_autofill_displayed(self): """Confirms that autofill popup has loaded""" self.element_clickable("autofill-panel") def verify_element_displayed(self, reference: Union[str, tuple, WebElement]): """Confirms that an element exists in popup""" self.element_clickable(reference) @BasePage.context_chrome def ensure_autofill_dropdown_not_visible(self): """ Verifies that the autofill dropdown does NOT appear checks if the parent pop up component have children elements before explicit wait. """ self.element_exists("pop-up-component") popup_component = self.get_element("pop-up-component") if popup_component and len(popup_component.get_attribute("innerHTML")) > 1: self.element_not_visible("select-form-option") return self @BasePage.context_chrome def ensure_autofill_dropdown_visible(self, field_element: WebElement = None): """ Verifies that the autofill dropdown appears checks if the parent pop up component have children elements before explicit wait. Arguments: field_element: if field element is given. check whether it is a select element. pass the check if it is. """ self.element_visible("select-form-option") return self # Interaction with popup elements def click_doorhanger_button(self, button_type: str) -> BasePage: """Presses a button in the doorhanger popup (e.g., save, update, dropdown)""" self.element_visible(f"doorhanger-{button_type}-button") self.click_on(f"doorhanger-{button_type}-button") return self # Interaction with form options @BasePage.context_chrome def click_autofill_form_option(self) -> BasePage: """Clicks the credit card or address selection in the autofill panel""" self.get_element("select-form-option").click() return self def click_clear_form_option(self) -> BasePage: """Clicks to clear the saved form option (address or credit card)""" self.click_on("clear-form-option") return self def get_doorhanger_cc_number(self) -> str: """Retrieves the last 4 digits of the credit card from the doorhanger popup""" return self.get_element("doorhanger-cc-number").text @BasePage.context_chrome def get_cc_doorhanger_data(self, selector: str) -> str: """ get text for the credit card doorhanger data. """ return self.get_element(selector).text # Interaction with autocomplete list elements @BasePage.context_chrome def get_nth_element(self, index: str | int) -> WebElement: """ Get the nth element from the autocomplete list Parameters: index (str): The index of the element to retrieve (1-based) Returns: WebElement: The nth element in the autocomplete list """ self.wait.until( EC.visibility_of( self.get_element("select-form-option-by-index", labels=[str(index)]) ) ) return self.get_element("select-form-option-by-index", labels=[str(index)]) @BasePage.context_chrome def select_nth_element(self, index: int): """ Select the nth element from the autocomplete list Arguments: index (int): The index of the element to retrieve (1-based) """ self.wait.until( EC.element_to_be_clickable( self.get_element("select-form-option-by-index", labels=[str(index)]) ) ) self.get_element("select-form-option-by-index", labels=[str(index)]).click() @BasePage.context_chrome def get_primary_value(self, element: WebElement) -> str: """ Get the primary value from the autocomplete element Parameters: element (WebElement): The autocomplete element from which to retrieve the primary value Returns: str: The primary value extracted from the element's attribute """ return element.get_attribute("ac-value")