modules/page_object_about_pages.py (112 lines of code) (raw):

import logging import os import re from pypom import Page from selenium.common.exceptions import ( StaleElementReferenceException, WebDriverException, ) from selenium.webdriver import Firefox from selenium.webdriver.common.keys import Keys from selenium.webdriver.support import expected_conditions as EC from modules.page_base import BasePage from modules.util import BrowserActions class AboutConfig(BasePage): """ The POM for the about:config page Attributes ---------- driver: selenium.webdriver.Firefox WebDriver object under test """ URL_TEMPLATE = "about:config" def search_pref(self, term: str) -> BasePage: self.set_content_context() self.driver.get("about:config") self.expect(EC.title_contains("Advanced Preferences")) searchbar = self.get_element("about-config-search-input") searchbar.clear() searchbar.send_keys(term + Keys.ENTER) return self def toggle_true_false_config(self, term: str) -> BasePage: """ Main method to toggle a true false pref in about:config Note: To use this in a test, use pref_list - ("browser.aboutConfig.showWarning", False), in the test suite's conftest.py or use add_to_prefs_list fixture in the test itself """ self.search_pref(term) toggle_tf_button = self.get_element("value-edit-button") toggle_tf_button.click() return self def change_config_value(self, term: str, value) -> BasePage: """ Main method to change a config's value in about:config Note: To use this in a test, use pref_list - ("browser.aboutConfig.showWarning", False), in the test suite's conftest.py or use add_to_prefs_list fixture in the test itself. """ self.search_pref(term) pref_edit_button = self.get_element("value-edit-button") pref_edit_button.click() pref_edit = self.get_element("value-edit-field") pref_edit.send_keys(value) pref_edit_button.click() return self class AboutDownloads(BasePage): """ The POM for the about:downloads page Attributes ---------- driver: selenium.webdriver.Firefox WebDriver object under test """ URL_TEMPLATE = "about:downloads" def is_empty(self) -> bool: """Checks to see if downloads page is empty""" found = False try: self.element_visible("no-downloads-label") found = True finally: return found def get_downloads(self) -> list: """Get all download targets""" return self.get_elements("download-target") def wait_for_num_downloads(self, num: int) -> BasePage: """Wait for the number of downloads to equal num""" self.expect(lambda _: len(self.get_downloads()) == num) return self class AboutGlean(BasePage): """ Page Object Model for about:glean Attributes ---------- driver: selenium.webdriver.Firefox WebDriver object under test """ URL_TEMPLATE = "about:glean" def change_ping_id(self, ping_id: str) -> Page: """ Change the Glean ping id to the given string. """ ba = BrowserActions(self.driver) self.click_on("manual-testing") ping_input = self.get_element("ping-id-input") ba.clear_and_fill(ping_input, ping_id) self.wait.until( EC.text_to_be_present_in_element( self.get_selector("ping-submit-label"), ping_id ) ) self.get_element("ping-submit-button").click() return self class AboutLogins(BasePage): """ Page Object Model for about:logins, which goes through Shadow DOMs. Attributes ---------- driver: selenium.webdriver.Firefox WebDriver object under test """ URL_TEMPLATE = "about:logins" def __init__(self, driver: Firefox, **kwargs): super().__init__(driver, **kwargs) self.ba = BrowserActions(self.driver) def click_add_login_button(self) -> Page: """Click the Add Login button""" self.get_element("create-login-button").click() logging.info("Clicked add login button") return self def create_new_login(self, form_info: dict) -> Page: """ Given a dict with keys that match the valid item types in the new login dialog, create a new login with those values through UI. """ try: for item_type, value in form_info.items(): logging.info(f"Filling {item_type} with {value}") self.ba.clear_and_fill( self.get_element("login-item-type", labels=[item_type]), value ) logging.info("Clicking submit...") self.get_element("create-login-button") logging.info("Submitted.") except (WebDriverException, StaleElementReferenceException): logging.info("Element not found or stale, pressing 'Save Changes'") self.get_element("save-changes-button").click() logging.info("Pressed.") return self def check_logins_present( self, actual_logins: dict, expected_logins: dict, check_password=False ): """ Checks that all logins expected are present in the list of elements ---- logins: {"username@website": "password"} Example: username: hello, website: mozilla.social, password: pwpwpwpw logins = {"hello@mozilla.social": "pwpwpwpw} """ # Check that all created logins are here if not check_password: for login in expected_logins.keys(): assert login in actual_logins else: assert expected_logins == actual_logins def remove_password_csv(self, downloads_dir): # Delete password.csv, if there is one in the export location passwords_csv = os.path.join(downloads_dir, "passwords.csv") for file in os.listdir(downloads_dir): delete_files_regex = re.compile(r"\bpasswords.csv\b") if delete_files_regex.match(file): os.remove(passwords_csv) class AboutPrivatebrowsing(BasePage): """ POM for about:privatebrowsing page """ URL_TEMPLATE = "about:privatebrowsing" class AboutProfiles(BasePage): """ POM for about:profiles page """ URL_TEMPLATE = "about:profiles" class AboutTelemetry(BasePage): """ The POM for the about:telemetry page """ URL_TEMPLATE = "about:telemetry" class AboutNetworking(BasePage): """ POM for about:networking page """ URL_TEMPLATE = "about:networking" def select_network_category(self, option: str): """ Clicks the corresponding sidebar tab in the about:networking page. """ # Use dynamic ID based on the option name self.get_element("networking-sidebar-category", labels=[option]).click()