import pickle
import os
import time
import allure
from allure_commons.types import AttachmentType
from selenium.webdriver.remote.webdriver import WebDriver
from selenium.webdriver.remote.webdriver import WebElement
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains
class Helper:
def __init__(self, driver):
self.driver: WebDriver = driver
self.wait = WebDriverWait(self.driver, timeout=10, poll_frequency=1)
self.action = ActionChains(self.driver)
#? Allure methods
def screenshot(self, screenshot_name):
allure.attach(
body=self.driver.get_screenshot_as_png(),
name=screenshot_name,
attachment_type=AttachmentType.PNG
)
def find(self, locator):
return self.driver.find_element("xpath", locator)
#? Wait methods
def wait_for_visibility(self, locator: str):
"""
This method waits for visibility of element
:param locator: Takes xpath locator
:return: WebElement
"""
return self.wait.until(EC.visibility_of_element_located(("xpath", locator)))
def wait_for_invisibility(self, locator: str):
"""
This method waits for invisibility of element
:param locator: Takes xpath locator
:return: WebElement
"""
return self.wait.until(EC.invisibility_of_element(("xpath", locator)))
def wait_for_clickable(self, locator: str):
"""
This method waits for clickable of element
:param locator: Takes xpath locator
:return: WebElement
"""
return self.wait.until(EC.element_to_be_clickable(("xpath", locator)))
#? Action method
def save_cookies(self, cookies_name):
pickle.dump(self.driver.get_cookies(), open(f"{os.getcwd()}/temporary/cookies/{cookies_name}.pkl", "wb"))
def load_cookies(self, cookies_name):
cookies = pickle.load(open(f"{os.getcwd()}/temporary/cookies/{cookies_name}.pkl", "rb"))
self.driver.delete_all_cookies()
for cookie in cookies:
self.driver.add_cookie(cookie)
self.driver.refresh()
#? Scrolls
def scroll_by(self, x, y):
self.driver.execute_script(f"window.scrollTo({x}, {y})")
def scroll_to_bottom(self):
self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
def scroll_to_top(self):
self.driver.execute_script("window.scrollTo(0, 0)")
def scroll_to_element(self, locator):
self.action.scroll_to_element(self.find(locator))
self.driver.execute_script("""
window.scrollTo({
top: window.scrollY + 500,
});
""")