foxpuppet/windows/browser/notifications/addons.py (50 lines of code) (raw):

# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this file, # You can obtain one at http://mozilla.org/MPL/2.0/. """Contains all current install notifications Firefox will display.""" from selenium.webdriver.common.by import By from foxpuppet.windows.browser.notifications import BaseNotification from selenium.webdriver.remote.webelement import WebElement class AddOnInstallBlocked(BaseNotification): """Add-on install blocked notification.""" def allow(self) -> None: """Allow the add-on to be installed.""" with self.selenium.context(self.selenium.CONTEXT_CHROME): self.find_primary_button().click() class AddOnInstallConfirmation(BaseNotification): """Add-on install confirmation notification.""" @property def addon_name(self) -> str: """Provide access to the add-on name. Returns: str: Add-on name. """ with self.selenium.context(self.selenium.CONTEXT_CHROME): el: WebElement = self.find_description() return el.find_element(By.CSS_SELECTOR, "b").text def cancel(self) -> None: """Cancel add-on install.""" with self.selenium.context(self.selenium.CONTEXT_CHROME): self.find_secondary_button().click() def install(self) -> None: """Confirm add-on install.""" with self.selenium.context(self.selenium.CONTEXT_CHROME): self.find_primary_button().click() class AddOnInstallComplete(BaseNotification): """Add-on install complete notification.""" def close(self) -> None: """Close the notification.""" with self.selenium.context(self.selenium.CONTEXT_CHROME): if self.window.firefox_version > 63: self.find_primary_button().click() self.window.wait_for_notification(None) else: BaseNotification.close(self) class AddOnInstallFailed(BaseNotification): """Add-on install failed notification.""" @property def error_message(self): """Provide access to the error message. Returns: str: The error message explaining why the installation failed. """ with self.selenium.context(self.selenium.CONTEXT_CHROME): return self.find_description().text def close(self): """Close the failed installation notification.""" with self.selenium.context(self.selenium.CONTEXT_CHROME): self.find_primary_button().click() class AddOnProgress(BaseNotification): """Add-on progress notification.""" @property def is_downloading(self): """Check if the add-on is currently downloading. Returns: bool: True if the download and verification is in progress. """ with self.selenium.context(self.selenium.CONTEXT_CHROME): return "Downloading and verifying add-on…" in self.find_description().text # Clean up of these notifications will happen once Firefox ESR is past version 63 # https://github.com/mozilla/FoxPuppet/issues/212 NOTIFICATIONS = { "addon-install-blocked-notification": AddOnInstallBlocked, "addon-install-confirmation-notification": AddOnInstallConfirmation, "addon-install-complete-notification": AddOnInstallComplete, "appMenu-addon-installed-notification": AddOnInstallComplete, "addon-install-failed-notification": AddOnInstallFailed, "addon-installed-notification": AddOnInstallComplete, "addon-progress-notification": AddOnProgress, "addon-webext-permissions-notification": AddOnInstallConfirmation, }