Skip to content

Commit c4ed82c

Browse files
authored
Merge pull request #4 from chavarera/main
manage multiple webdrivers
2 parents 0d47ed1 + e15ecee commit c4ed82c

File tree

7 files changed

+204
-2
lines changed

7 files changed

+204
-2
lines changed

README.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
1-
# selenium-tools
1+
# Stool
2+
3+
stool is an wrapper over selenium to perform various task.
24

3-
## TODO
45

6+
## Features
7+
- [X] Manage multiple webdrivers
8+
9+
## TODO
510
- [ ] Manage multiple webdrivers

requirements.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
certifi==2021.5.30
2+
chardet==4.0.0
3+
colorama==0.4.4
4+
configparser==5.0.2
5+
crayons==0.4.0
6+
idna==2.10
7+
requests==2.25.1
8+
selenium==3.141.0
9+
urllib3==1.26.6
10+
webdriver-manager==3.4.2

stool/driver.py

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
from functools import partial
2+
3+
from selenium import webdriver
4+
from webdriver_manager.chrome import ChromeDriverManager
5+
from webdriver_manager.firefox import GeckoDriverManager
6+
from webdriver_manager.utils import ChromeType
7+
8+
from utils import (SToolException, current_url, get_element, get_session,
9+
page_source, visit)
10+
11+
12+
class SeleniumDriver:
13+
14+
def __init__(self, browser=None, headless=False):
15+
self.browser_list = ['chrome', 'chromium', 'firefox']
16+
self.driver = None
17+
self.browser = browser
18+
self.headless = headless
19+
20+
self._load_driver()
21+
self._load_methods()
22+
23+
def close(self):
24+
"""will stop driver after program execution
25+
"""
26+
if self.driver:
27+
self.driver.quit()
28+
29+
def __exit__(self, type, value, traceback):
30+
"""release the resources occupied with the current session
31+
"""
32+
self.close()
33+
34+
def __enter__(self):
35+
return self._load_driver()
36+
37+
def _load_driver(self):
38+
"""Create Selenium webdriver object
39+
"""
40+
self.close()
41+
browser = self.browser.lower()
42+
if browser not in self.browser_list:
43+
raise SToolException(
44+
f"provided browser {browser} doesn't exists. available brower list:{self.browser_list}")
45+
46+
# add chrome and firefox different options
47+
options = getattr(webdriver, browser if browser !=
48+
'chromium' else 'chrome').options.Options()
49+
if self.headless:
50+
options.add_argument('--headless')
51+
52+
if browser in ['chrome', 'chromium']:
53+
browser_type = ChromeType.CHROMIUM if browser == 'chromium' else ChromeType.GOOGLE
54+
self.driver = webdriver.Chrome(ChromeDriverManager(
55+
chrome_type=browser_type).install(),
56+
options=options)
57+
58+
if browser == "firefox":
59+
self.driver = webdriver.Firefox(
60+
executable_path=GeckoDriverManager().install(),
61+
options=options)
62+
63+
# Maximize window to give normal browser feel
64+
self.driver.maximize_window()
65+
66+
# Load all modules and methods
67+
self._load_methods()
68+
69+
return self
70+
71+
def _load_methods(self):
72+
self.session = partial(get_session, self.driver)
73+
self.visit = partial(visit, self.driver)
74+
self.text = partial(page_source, self.driver)
75+
self.url = partial(current_url, self.driver)
76+
self.element = partial(get_element, self.driver)
77+
78+
79+
if __name__ == '__main__':
80+
81+
# Create A Driver Object
82+
with SeleniumDriver('firefox', headless=False) as obj:
83+
# visit https:example.com
84+
obj.visit(r'https://quotes.toscrape.com/')
85+
86+
# for all quotes obj.element('class_name', 'quote',1)
87+
result = obj.element('class_name', 'quote')
88+
print(result)

stool/parser.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
class Parser(object):
2+
"""Parse data from webdriver
3+
"""
4+
5+
def __init__(self, driver):
6+
self.driver = driver

stool/utils/__init__.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# -*- coding: utf-8 -*-
2+
3+
from utils.driver_exceptions import SToolException
4+
from utils.driver_utils import (current_url, get_element, get_session,
5+
page_source, visit)
6+
7+
__all__ = ["SToolException", "current_url", "get_element", "get_session",
8+
"page_source", "visit"]

stool/utils/driver_exceptions.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
2+
3+
class SToolException(Exception):
4+
"""
5+
Base Class for selenium tools Exceptions
6+
"""
7+
8+
def __init__(self, message):
9+
self.message = message
10+
11+
def __str__(self):
12+
return str(self.message)

stool/utils/driver_utils.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
from selenium.common.exceptions import NoSuchElementException
2+
from selenium.webdriver.common.by import By
3+
4+
from utils.driver_exceptions import SToolException
5+
6+
7+
def get_session(driver):
8+
"""Return Selenium Driver session id
9+
"""
10+
return driver.session_id
11+
12+
13+
def visit(driver, url):
14+
"""visit given url
15+
"""
16+
driver.get(url)
17+
18+
19+
def page_source(driver):
20+
"""Return html page source
21+
"""
22+
return driver.page_source
23+
24+
25+
def current_url(driver):
26+
"""Return current url
27+
"""
28+
return driver.current_url
29+
30+
31+
def get_locator(locator_type, locator_text):
32+
"""Return element locator
33+
34+
Args:
35+
locator_type : provide any attribute type
36+
id,class_name,tag_name
37+
xpath, css_selector
38+
39+
locator_text : attribute value
40+
"""
41+
return getattr(By, locator_type), locator_text
42+
43+
44+
def get_element(driver, locator_type, locator_text, many=None):
45+
"""Get element using locator type and locator text
46+
47+
Args:
48+
locator_type : provide any attribute type
49+
id,class_name,tag_name
50+
xpath, css_selector
51+
52+
locator_text : attribute value
53+
54+
many : optional default None,
55+
1: select multiple element
56+
0: select single element
57+
58+
Returns:
59+
Return an element object if found otherwise
60+
return None
61+
"""
62+
63+
locator_type = locator_type.upper()
64+
if hasattr(By, locator_type):
65+
try:
66+
locator = get_locator(locator_type, locator_text)
67+
is_multiple = 's' if many else ''
68+
func = getattr(driver, f'find_element{is_multiple}')
69+
return func(*locator)
70+
except NoSuchElementException as _:
71+
return None
72+
else:
73+
raise SToolException("INVALID_SELECTOR")

0 commit comments

Comments
 (0)