modules/browser_object_panel_ui.py (126 lines of code) (raw):
from typing import List
from pypom import Region
from selenium.common.exceptions import NoSuchElementException, TimeoutException
from selenium.webdriver import Firefox
from selenium.webdriver.remote.webelement import WebElement
from selenium.webdriver.support import expected_conditions as EC
from modules.browser_object_navigation import Navigation
from modules.components.dropdown import Dropdown
from modules.page_base import BasePage
from modules.util import BrowserActions, PomUtils
class PanelUi(BasePage):
"""Browser Object Model for nav panel UI menu (hamburger menu, application menu)"""
URL_TEMPLATE = "about:blank"
def __init__(self, driver: Firefox, **kwargs):
super().__init__(driver, **kwargs)
self.navigation = Navigation(self.driver)
class Menu(Region):
"""
PyPOM Region factory for the PanelUi Dropdown menu
"""
def __init__(self, page, **kwargs):
super().__init__(page, **kwargs)
self.utils = PomUtils(self.driver)
@property
def loaded(self):
targeted = [
el
for el in self.page.elements.values()
if "requiredForPage" in el["groups"] and "menuItem" in el["groups"]
]
return all([EC.presence_of_element_located(el) for el in targeted])
@BasePage.context_chrome
def open_panel_menu(self) -> BasePage:
"""
Opens the PanelUi menu.
"""
panel_root = self.get_element("panel-ui-button")
panel_root.click()
self.menu = self.Menu(self, root=panel_root)
return self
def select_panel_setting(self, name: str, *labels) -> BasePage:
"""
Selects a panel setting in PanelUi.
...
Parameters
----------
name: str
Name of setting element
labels: *list[str]
Labels to pass to get_element()
"""
self.click_on(name, labels=labels)
return self
def navigate_to_about_addons(self):
"""
On the hamburger menu > More Tools > Customize Toolbar > Manage Themes
"""
self.select_panel_setting("more-tools")
self.select_panel_setting("customize-toolbar")
with self.driver.context(self.driver.CONTEXT_CHROME):
self.get_element("manage-themes").click()
def navigate_to_customize_toolbar(self):
"""
On the hamburger menu > More Tools > Customize Toolbar
"""
self.select_panel_setting("more-tools")
self.select_panel_setting("customize-toolbar")
def click_sync_sign_in_button(self) -> BasePage:
"""
Click FxA sync button.
"""
with self.driver.context(self.driver.CONTEXT_CHROME):
self.open_panel_menu()
self.select_panel_setting("fxa-sign-in")
return self
def log_out_fxa(self) -> BasePage:
"""
Click FxA signout button.
"""
with self.driver.context(self.driver.CONTEXT_CHROME):
self.click_sync_sign_in_button()
self.get_element("fxa-sign-out-button").click()
return self
def manage_fxa_account(self) -> BasePage:
"""
Open the FxA management flow.
"""
with self.driver.context(self.driver.CONTEXT_CHROME):
self.click_sync_sign_in_button()
self.get_element("fxa-manage-account-button").click()
return self
def confirm_sync_in_progress(self) -> BasePage:
"""
Check that FxA Sync Label is set to "Syncing…"
"""
with self.driver.context(self.driver.CONTEXT_CHROME):
self.click_sync_sign_in_button()
try:
self.instawait.until(
EC.text_to_be_present_in_element(
self.get_selector("fxa-sync-label"), "Sync"
)
)
except (NoSuchElementException, TimeoutException):
self.get_element("panel-ui-button").click()
self.click_sync_sign_in_button()
self.custom_wait(timeout=30, poll_frequency=0.5).until(
EC.text_to_be_present_in_element(
self.get_selector("fxa-sync-label"), "Syncing"
)
)
return self
def start_sync(self) -> BasePage:
"""
Start FxA sync
"""
with self.driver.context(self.driver.CONTEXT_CHROME):
self.click_sync_sign_in_button()
self.element_has_text("fxa-sync-label", "Sync now")
self.get_element("fxa-sync-label").click()
return self
def open_private_window(self) -> BasePage:
"""
Opens a new window in private browsing mode using the panel
"""
self.open_panel_menu()
with self.driver.context(self.driver.CONTEXT_CHROME):
self.get_element("panel-ui-new-private-window").click()
return self
def open_history_menu(self) -> BasePage:
"""
Opens the History menu
"""
self.open_panel_menu()
with self.driver.context(self.driver.CONTEXT_CHROME):
self.get_element("panel-ui-history").click()
return self
def select_clear_history_option(self, option: str) -> BasePage:
"""
Selects the clear history option, assumes the history panel is open.
"""
with self.driver.context(self.driver.CONTEXT_CHROME):
self.get_element("clear-recent-history").click()
iframe = self.get_element("iframe")
BrowserActions(self.driver).switch_to_iframe_context(iframe)
with self.driver.context(self.driver.CONTEXT_CONTENT):
dropdown_root = self.get_element("clear-history-dropdown")
dropdown = Dropdown(page=self, root=dropdown_root, require_shadow=False)
dropdown.select_option(option)
def get_all_history(self) -> List[WebElement]:
"""
Gets all history items
"""
with self.driver.context(self.driver.CONTEXT_CHROME):
history_items = self.get_elements("bookmark-item")
return history_items
@BasePage.context_chrome
def redirect_to_about_logins_page(self) -> BasePage:
"""
Opens the about:logins page by clicking the Password option in Hamburger Menu"
"""
self.open_panel_menu()
self.get_element("password-button").click()
return self
# Bookmarks section
@BasePage.context_chrome
def open_bookmarks_panel_from_hamburger_menu(self) -> BasePage:
"""
Opens the Bookmarks panel from the Hamburger Menu
"""
self.open_panel_menu()
with self.driver.context(self.driver.CONTEXT_CHROME):
self.get_element("panel-ui-bookmarks").click()
return self
@BasePage.context_chrome
def bookmark_current_tab_via_hamburger_menu(self) -> BasePage:
"""
Opens the Bookmarks panel from the Hamburger Menu, selects Bookmarks the current tab.. and clicks
Save button from Add Bookmark in Address bar "
"""
self.get_element("bookmark-current-tab").click()
self.navigation.get_element("save-bookmark-button").click()
return self
@BasePage.context_chrome
def verify_bookmark_exists_in_hamburger_menu(self, bookmark_title: str) -> BasePage:
"""
Verifies that a bookmark with the specified title exists inside Bookmark section from Hamburger menu
Arguments:
bookmark_title (str): The title text to look for in the bookmark
"""
self.element_visible("bookmark-by-title", labels=[bookmark_title])
return self