modules/browser_object_find_toolbar.py (82 lines of code) (raw):
import json
import logging
from selenium.webdriver import Firefox
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from modules.browser_object_panel_ui import PanelUi
from modules.page_base import BasePage
class FindToolbar(BasePage):
URL_TEMPLATE = ""
def __init__(self, driver: Firefox, **kwargs):
super().__init__(driver, **kwargs)
self.panel_ui = PanelUi(self.driver)
self.match_dict = {}
@BasePage.context_chrome
def open(self) -> BasePage:
"""Use PanelUi to open the Find Toolbar, wait for element to load"""
self.panel_ui.open_panel_menu()
self.panel_ui.select_panel_setting("find-in-page")
self.wait_for_page_to_load()
return self
@BasePage.context_chrome
def open_with_key_combo(self) -> BasePage:
"""Use Cmd/Ctrl + F to open the Find Toolbar, wait for load"""
if self.sys_platform() == "Darwin":
mod_key = Keys.COMMAND
else:
mod_key = Keys.CONTROL
self.perform_key_combo(mod_key, "f")
self.wait_for_page_to_load()
return self
@BasePage.context_chrome
def find(self, term: str) -> BasePage:
"""Use the Find Toolbar to search"""
find_bar = self.get_element("find-toolbar-input")
find_bar.click()
find_bar.clear()
find_bar.send_keys(term + Keys.ENTER)
if find_bar.get_property("status") != "notfound":
self.match_dict = self.get_match_args()
return self
@BasePage.context_chrome
def get_match_args(self) -> dict:
"""Return the status of the find session"""
self.expect(
EC.text_to_be_present_in_element_attribute(
self.get_selector("matches-label"), "data-l10n-args", ":"
)
)
matches = self.get_element("matches-label")
logging.info(matches.get_attribute("outerHTML"))
match_status_str = matches.get_attribute("data-l10n-args")
self.match_dict = json.loads(match_status_str)
return self.match_dict
@BasePage.context_chrome
def next_match(self) -> BasePage:
"""Click the Next Match button"""
self.get_element("next-match-button").click()
if self.match_dict["current"] < self.match_dict["total"]:
self.match_dict["current"] += 1
else:
self.match_dict["current"] = 1
return self
@BasePage.context_chrome
def previous_match(self) -> BasePage:
"""Click the Previous Match button"""
self.get_element("previous-match-button").click()
if self.match_dict["current"] > 1:
self.match_dict["current"] -= 1
else:
self.match_dict["current"] = self.match_dict["total"]
return self
@BasePage.context_chrome
def rewind_to_first_match(self) -> BasePage:
"""Go back to match 1 of n"""
while self.match_dict["current"] != 1:
self.previous_match()
return self
@BasePage.context_chrome
def navigate_matches_by_keys(self, backwards=False) -> BasePage:
"""Use F3 and Shift+F3 to navigate matches"""
if backwards:
self.perform_key_combo(Keys.SHIFT, Keys.F3)
else:
logging.info(f"sending {Keys.F3.encode()}")
self.actions.send_keys(Keys.F3).perform()
return self
@BasePage.context_chrome
def navigate_matches_n_times(self, n: int):
for _ in range(n):
self.next_match()