modules/page_object_generics.py (139 lines of code) (raw):
from time import sleep
from selenium.webdriver import Firefox
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.remote.webelement import WebElement
from modules.page_base import BasePage
class GenericPage(BasePage):
"""
Generic POM for a page we don't care to map
"""
URL_TEMPLATE = "{url}"
def navigate_dialog_to_location(
self, location: str, filename="test.txt"
) -> BasePage:
sleep(1.5)
from pynput.keyboard import Controller, Key
keyboard = Controller()
if self.sys_platform() == "Darwin":
keyboard.type("/")
sleep(1.5)
keyboard.type(location.lstrip("/"))
sleep(1)
keyboard.press(Key.enter)
sleep(1)
keyboard.press(Key.enter)
elif self.sys_platform().startswith("Win"):
keyboard.press(Key.ctrl)
keyboard.tap("l")
keyboard.release(Key.ctrl)
sleep(1.5)
keyboard.type(location)
sleep(1)
keyboard.tap(Key.enter)
sleep(1)
keyboard.press(Key.alt)
keyboard.tap("s")
keyboard.release(Key.alt)
else:
keyboard.press(Key.ctrl)
keyboard.tap("a")
keyboard.release(Key.ctrl)
sleep(1.5)
keyboard.type(f"{location}/{filename}")
sleep(1)
keyboard.tap(Key.enter)
class GenericPdf(BasePage):
"""
Generic POM for any page with an open PDF in it.
"""
URL_TEMPLATE = "{pdf_url}"
def __init__(self, driver: Firefox, **kwargs):
super().__init__(driver, **kwargs)
self.open()
self.html_body = self.get_element("html-body")
self.pdf_body = self.get_element("pdf-body")
self.max_page = int(self.get_element("page-input").get_attribute("max"))
def get_green_highlighted_text(self) -> str:
return self.get_element("highlighted-text").get_attribute("innerText")
def zoom_in_toolbar(self) -> BasePage:
self.get_element("zoom-in").click()
return self
def zoom_out_toolbar(self) -> BasePage:
self.get_element("zoom-out").click()
return self
def zoom_in_keys(self) -> BasePage:
if self.sys_platform() == "Darwin":
self.perform_key_combo(Keys.COMMAND, "+")
else:
self.perform_key_combo(Keys.CONTROL, "+")
return self
def zoom_out_keys(self) -> BasePage:
if self.sys_platform() == "Darwin":
self.perform_key_combo(Keys.COMMAND, "-")
else:
self.perform_key_combo(Keys.CONTROL, "-")
return self
def jump_to_page(self, page_number: int) -> BasePage:
if page_number > self.max_page or not isinstance(page_number, int):
raise ValueError("Page Number is not valid.")
page_input = self.get_element("page-input")
self.double_click(page_input)
page_input.send_keys(Keys.BACK_SPACE + str(page_number) + Keys.ENTER)
return self
def open_toolbar_menu(self) -> BasePage:
self.get_element("toolbar-toggle").click()
self.element_visible("toolbar-container")
return self
def select_toolbar_option(self, option: str) -> BasePage:
self.open_toolbar_menu()
self.get_element(option).click()
return self
def add_image(self, image_path: str, sys_platform: str) -> BasePage:
"""Add an image to a pdf file"""
self.get_element("toolbar-add-image").click()
self.get_element("toolbar-add-image-confirm").click()
sleep(1.5)
from pynput.keyboard import Controller, Key
keyboard = Controller()
if sys_platform == "Darwin" or sys_platform == "Linux":
keyboard.type("/")
sleep(1.5)
keyboard.type(image_path.lstrip("/"))
else:
sleep(1.5)
keyboard.type(image_path)
sleep(1)
keyboard.press(Key.enter)
keyboard.release(Key.enter)
sleep(1)
keyboard.press(Key.enter)
keyboard.release(Key.enter)
sleep(1.5)
for _ in range(3):
keyboard.tap(Key.tab)
sleep(0.5)
keyboard.tap(Key.enter)
sleep(1)
return self
def fill_element(self, element: str, data: str) -> BasePage:
"""fill in the field at element with data"""
self.get_element(element).send_keys(data)
return self
def click_download_button(self) -> BasePage:
"""click on download button for the pdf"""
self.get_element("download-button").click()
self.wait_for_page_to_load()
return self
def select_and_return_checkbox(self, element: str) -> WebElement:
"""select checkbox located at element"""
checkbox = self.get_element(element)
checkbox.click()
return checkbox
def select_and_return_dropdown_option(
self, element: str, selector: By, value: str
) -> WebElement:
"""click dropdown element and select dropdown option through selector"""
self.get_element(element).click()
dropdown_option = self.find_element(selector, value)
dropdown_option.click()
return dropdown_option
def get_first_text_element(self) -> WebElement:
"""get first text element in pdf"""
return self.pdf_body.find_element(By.TAG_NAME, "span")
def navigate_page_by_keys(self, key: str):
self.html_body.send_keys(key)
return self
def navigate_page_by_scroll_key(self, direction: str) -> BasePage:
if direction not in {"next", "prev"}:
raise ValueError("incorrect scroll value.")
self.get_element(f"scroll-{direction}").click()
return self