mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-27 19:07:31 +09:00
110 lines
4 KiB
Python
110 lines
4 KiB
Python
# 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/.
|
|
|
|
from marionette_driver import By
|
|
from marionette_driver.errors import NoSuchElementException
|
|
|
|
from firefox_puppeteer.base import BaseLib
|
|
from firefox_puppeteer.ui.base import DOMElement
|
|
|
|
|
|
class MenuBar(BaseLib):
|
|
"""Wraps the menubar DOM element inside a browser window."""
|
|
|
|
@property
|
|
def menus(self):
|
|
"""A list of :class:`MenuElement` instances corresponding to
|
|
the top level menus in the menubar.
|
|
|
|
:returns: A list of :class:`MenuElement` instances.
|
|
"""
|
|
menus = (self.marionette.find_element(By.ID, 'main-menubar')
|
|
.find_elements(By.TAG_NAME, 'menu'))
|
|
return [self.MenuElement(menu) for menu in menus]
|
|
|
|
def get_menu(self, label):
|
|
"""Get a :class:`MenuElement` instance corresponding to the specified label.
|
|
|
|
:param label: The label of the menu, e.g., **File** or **View**.
|
|
:returns: A :class:`MenuElement` instance.
|
|
"""
|
|
menu = [m for m in self.menus if m.get_attribute('label') == label]
|
|
|
|
if not menu:
|
|
raise NoSuchElementException('Could not find a menu with '
|
|
'label "{}"'.format(label))
|
|
|
|
return menu[0]
|
|
|
|
def get_menu_by_id(self, menu_id):
|
|
"""Get a :class:`MenuElement` instance corresponding to the specified
|
|
ID.
|
|
|
|
:param menu_id: The ID of the menu, e.g., **file-menu** or **view-menu**.
|
|
:returns: A :class:`MenuElement` instance.
|
|
"""
|
|
menu = [m for m in self.menus if m.get_attribute('id') == menu_id]
|
|
|
|
if not menu:
|
|
raise NoSuchElementException('Could not find a menu with '
|
|
'id "{}"'.format(menu_id))
|
|
|
|
return menu[0]
|
|
|
|
def select(self, label, item):
|
|
"""Select an item in a menu.
|
|
|
|
:param label: The label of the menu, e.g., **File** or **View**.
|
|
:param item: The label of the item in the menu, e.g., **New Tab**.
|
|
"""
|
|
return self.get_menu(label).select(item)
|
|
|
|
def select_by_id(self, menu_id, item_id):
|
|
"""Select an item in a menu.
|
|
|
|
:param menu_id: The ID of the menu, e.g. **file-menu** or **view-menu**.
|
|
:param item_id: The ID of the item in the menu, e.g. **menu_newNavigatorTab**.
|
|
"""
|
|
return self.get_menu_by_id(menu_id).select_by_id(item_id)
|
|
|
|
class MenuElement(DOMElement):
|
|
"""Wraps a menu element DOM element."""
|
|
|
|
@property
|
|
def items(self):
|
|
"""A list of menuitem DOM elements within this :class:`MenuElement` instance.
|
|
|
|
:returns: A list of items in the menu.
|
|
"""
|
|
return (self.find_element(By.TAG_NAME, 'menupopup')
|
|
.find_elements(By.TAG_NAME, 'menuitem'))
|
|
|
|
def select(self, label):
|
|
"""Click on a menu item within this menu.
|
|
|
|
:param label: The label of the menu item, e.g., **New Tab**.
|
|
"""
|
|
item = [l for l in self.items if l.get_attribute('label') == label]
|
|
|
|
if not item:
|
|
message = ("Item labeled '{}' not found in the '{}' menu"
|
|
.format(label, self.get_attribute('label')))
|
|
raise NoSuchElementException(message)
|
|
|
|
return item[0].click()
|
|
|
|
def select_by_id(self, menu_item_id):
|
|
"""Click on a menu item within this menu.
|
|
|
|
:param menu_item_id: The ID of the menu item, e.g. **menu_newNavigatorTab**.
|
|
"""
|
|
item = [l for l in self.items if l.get_attribute('id') ==
|
|
menu_item_id]
|
|
|
|
if not item:
|
|
message = ("Item with ID '{}' not found in the '{}' menu"
|
|
.format(menu_item_id, self.get_attribute('id')))
|
|
raise NoSuchElementException(message)
|
|
|
|
return item[0].click()
|