diff --git a/s_tool/driver.py b/s_tool/driver.py index 235b818..e0762c2 100644 --- a/s_tool/driver.py +++ b/s_tool/driver.py @@ -5,8 +5,8 @@ from webdriver_manager.firefox import GeckoDriverManager from webdriver_manager.utils import ChromeType +from s_tool.exceptions import SToolException from s_tool.utils import ( - SToolException, click, current_url, get_cookies, @@ -93,8 +93,4 @@ def _load_methods(self): if __name__ == "__main__": - - # Create A Driver Object - with SeleniumDriver("firefox", headless=False) as obj: - # visit https:example.com - obj.visit(r"https://quotes.toscrape.com/") + pass diff --git a/s_tool/utils/driver_exceptions.py b/s_tool/exceptions.py similarity index 100% rename from s_tool/utils/driver_exceptions.py rename to s_tool/exceptions.py diff --git a/s_tool/parser.py b/s_tool/parser.py index 5a73247..3161e84 100644 --- a/s_tool/parser.py +++ b/s_tool/parser.py @@ -1,5 +1,26 @@ -class Parser(object): - """Parse data from webdriver""" +from s_tool.utils import get_element - def __init__(self, driver): - self.driver = driver + +def select_options(element, swap=None, text_exclude=[]): + """Return dropdown option in key value pair + + Args: + element : An select element + text_exclude : list of values to exclude from result + + Returns: + return dict of values and text of select element, + return empty dict() if element is not valid or not exists + """ + option_dict = dict() + if element and hasattr(element, "tag_name") and element.tag_name == "select": + options = get_element(element, "tag_name", "option", many=True) + for option in options: + func = option.get_attribute + text, value = func("text"), func("value") + if text not in text_exclude: + if swap: + text, value = value, text + option_dict[value] = text + + return option_dict diff --git a/s_tool/utils/driver_utils.py b/s_tool/utils.py similarity index 84% rename from s_tool/utils/driver_utils.py rename to s_tool/utils.py index e216078..9de3492 100644 --- a/s_tool/utils/driver_utils.py +++ b/s_tool/utils.py @@ -1,32 +1,35 @@ +from typing import Union + +from selenium import webdriver from selenium.common.exceptions import NoSuchElementException, TimeoutException from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait -from s_tool.utils.driver_exceptions import SToolException +from s_tool.exceptions import SToolException -def get_session(driver): +def get_session(driver: webdriver) -> str: """Return Selenium Driver session id""" return driver.session_id -def visit(driver, url): +def visit(driver: webdriver, url: str) -> None: """visit given url""" driver.get(url) -def page_source(driver): +def page_source(driver: webdriver) -> str: """Return html page source""" return driver.page_source -def current_url(driver): +def current_url(driver: webdriver) -> str: """Return current url""" return driver.current_url -def get_locator(locator_type, locator_text): +def get_locator(locator_type: str, locator_text: str) -> tuple: """Return element locator Args: @@ -40,7 +43,9 @@ def get_locator(locator_type, locator_text): return getattr(By, locator), locator_text -def get_element(driver, locator_type, locator_text, many=None): +def get_element( + driver: webdriver, locator_type: str, locator_text: str, many: bool = None +): """Get element using locator type and locator text Args: @@ -72,7 +77,9 @@ def get_element(driver, locator_type, locator_text, many=None): raise SToolException("INVALID_SELECTOR") -def click(driver, locator_type, locator_text, click_time=10): +def click( + driver: webdriver, locator_type: str, locator_text: str, click_time: int = 10 +) -> Union[bool, None]: """Return True if element clicked otherwise return None Args: @@ -99,7 +106,7 @@ def click(driver, locator_type, locator_text, click_time=10): raise SToolException(ex) -def get_cookies(driver): +def get_cookies(driver: webdriver) -> dict: """Accept driver object and return cookies in dictionary Args: @@ -114,7 +121,7 @@ def get_cookies(driver): return cookies_dict or {} -def take_screenshot(driver, element=None): +def take_screenshot(driver: webdriver, element: tuple = None) -> Union[bytes, None]: """take screenshot of given element if element is not given take a full page screeenshot and return data in bytes @@ -143,7 +150,7 @@ def take_screenshot(driver, element=None): return driver.get_screenshot_as_png() -def display_element(driver, element, hide=None): +def display_element(driver: webdriver, element, hide=None) -> None: """hide or show single element Args: @@ -159,7 +166,7 @@ def display_element(driver, element, hide=None): driver.execute_script(f"arguments[0].style.display = '{hide_or_show}';", element) -def hide_show_elements(driver, elements, hide=None): +def hide_show_elements(driver: webdriver, elements: list, hide: bool = None) -> None: """hide or show multiple elements Args: @@ -174,7 +181,7 @@ def hide_show_elements(driver, elements, hide=None): """ for element_locator in elements: locator_type, locator_value = element_locator - element_list = get_element(driver, locator_type, locator_value, 1) + element_list = get_element(driver, locator_type, locator_value, many=True) if element_list: for element in element_list: display_element(driver, element, hide) diff --git a/s_tool/utils/__init__.py b/s_tool/utils/__init__.py deleted file mode 100644 index c2687b1..0000000 --- a/s_tool/utils/__init__.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- - -from utils.driver_exceptions import SToolException -from utils.driver_utils import ( - click, - current_url, - get_cookies, - get_element, - get_locator, - get_session, - hide_show_elements, - page_source, - take_screenshot, - visit, -) - -__all__ = [ - "SToolException", - "current_url", - "get_element", - "get_session", - "page_source", - "visit", - "get_locator", - "click", - "get_cookies", - "take_screenshot", - "hide_show_elements", -] diff --git a/tests/test_webdrivers.py b/tests/test_webdrivers.py new file mode 100644 index 0000000..f25e4ef --- /dev/null +++ b/tests/test_webdrivers.py @@ -0,0 +1,7 @@ +from s_tool.driver import SeleniumDriver + + +def test_firefox_driver(): + """Test firefox driver with headless""" + with SeleniumDriver("firefox", headless=True) as obj: + assert "firefox" in obj.browser_list