Skip to content

Commit b40c58c

Browse files
authored
Merge pull request #50 from Python-World/main
v0.0.2 stable version
2 parents efa3b63 + bf9a9cf commit b40c58c

File tree

4 files changed

+110
-31
lines changed

4 files changed

+110
-31
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,15 @@
2323
- Manage multiple web drivers such as chrome,chromium,firefox.
2424
- Different Utilities
2525
- Retrieve elements with 5 different attributes.
26-
- Perform clicks on element,
26+
- Perform clicks on element.
2727
- Take a full page and element screenshot.
2828
- Hide and show elements.
2929
- Information filling on different form elements such as text,radio,checkbox.
3030
- Retrieves current cookies from the browser.
31+
- Injecting new cookies into browser.
3132
- Retrieve url and web page source.
3233
- Add or modify existing cookies.
34+
- Retrieve current user agent.
3335
- Check Existence of an element on the page.
3436
- Element Parser
3537
- table Information.

s_tool/driver.py

Lines changed: 68 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,25 @@
2424
)
2525

2626

27+
class Browser:
28+
"""Available Browser list"""
29+
30+
CHROME = "chrome"
31+
CHROMIUM = "chromium"
32+
FIREFOX = "firefox"
33+
IE = "ie"
34+
35+
2736
class SeleniumDriver:
2837
"""SeleniumDriver class to manage driver object and all utility functions at one place"""
2938

30-
def __init__(self, browser=None, headless=False):
39+
def __init__(self, browser=None, headless=False, executable_path=None):
40+
3141
self.browser_list = ["chrome", "chromium", "firefox", "ie"]
3242
self.driver = None
3343
self.browser = browser
3444
self.headless = headless
45+
self.executable_path = executable_path
3546

3647
self._load_driver()
3748
self._load_methods()
@@ -61,39 +72,69 @@ def __enter__(self):
6172
"""
6273
return self._load_driver()
6374

75+
def _exe_path(self, manager, **params):
76+
"""Return Webdriver path
77+
78+
Args:
79+
manager ([ChromeDriver,GeckoDriver,IEDriver]): WebDriver Manager
80+
81+
Returns:
82+
[str]: return an executable path
83+
"""
84+
if self.executable_path:
85+
return self.executable_path
86+
else:
87+
return manager(**params).install()
88+
89+
def _browser(self, browser):
90+
"""Return if an valid browser passed
91+
92+
Args:
93+
browser ([Browser]): Browser Type
94+
95+
Returns:
96+
[bool]: True if browser is valid
97+
"""
98+
available = False
99+
if self.browser.lower() == browser:
100+
available = True
101+
102+
return available
103+
64104
def _load_driver(self):
65105
"""Create Selenium webdriver object"""
66106
self.close()
67107
browser = self.browser.lower()
68-
if browser not in self.browser_list:
69-
raise SToolException(
70-
f"provided browser {browser} doesn't exists. available brower list:{self.browser_list}"
71-
)
72-
73-
# add chrome and firefox different options
74-
options = getattr(
75-
webdriver, browser if browser != "chromium" else "chrome"
76-
).options.Options()
108+
func = partial(self._exe_path)
109+
110+
# Add Browser Options
111+
browser_options = browser if browser != Browser.CHROMIUM else Browser.CHROME
112+
options = getattr(webdriver, browser_options).options.Options()
113+
77114
if self.headless:
78115
options.add_argument("--headless")
79116

80-
if browser in ["chrome", "chromium"]:
81-
browser_type = (
82-
ChromeType.CHROMIUM if browser == "chromium" else ChromeType.GOOGLE
83-
)
84-
self.driver = webdriver.Chrome(
85-
ChromeDriverManager(chrome_type=browser_type).install(), options=options
86-
)
87-
88-
if browser == "firefox":
89-
self.driver = webdriver.Firefox(
90-
executable_path=GeckoDriverManager().install(), options=options
91-
)
92-
93-
if browser == "ie":
94-
self.driver = webdriver.Ie(
95-
executable_path=IEDriverManager().install(), options=options
96-
)
117+
if self._browser(Browser.CHROME):
118+
exe_path = func(ChromeDriverManager, chrome_type=ChromeType.GOOGLE)
119+
_webdriver = webdriver.Chrome
120+
121+
elif self._browser(Browser.CHROMIUM):
122+
exe_path = func(ChromeDriverManager, chrome_type=ChromeType.CHROMIUM)
123+
_webdriver = webdriver.Chrome
124+
125+
elif self._browser(Browser.FIREFOX):
126+
exe_path = func(GeckoDriverManager)
127+
_webdriver = webdriver.Firefox
128+
129+
elif self._browser(Browser.IE):
130+
exe_path = func(IEDriverManager)()
131+
_webdriver = webdriver.Ie
132+
133+
else:
134+
err = f"browser not implemented. available browers :{self.browser_list}"
135+
raise SToolException(err)
136+
137+
self.driver = _webdriver(executable_path=exe_path, options=options)
97138

98139
# Maximize window to give normal browser feel
99140
self.driver.maximize_window()

s_tool/utils.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,25 @@ def get_session(driver: webdriver) -> str:
2222
return driver.session_id
2323

2424

25+
def is_local(path: str) -> str:
26+
"""Return valid URL path for file
27+
28+
Args:
29+
path (str): normal path or URL
30+
31+
Returns:
32+
str: Modified file path if local file
33+
Returns path as it is if URL
34+
"""
35+
import os
36+
37+
URL = path
38+
if os.path.exists(path) or path.startswith("file"):
39+
if not URL.startswith("file"):
40+
URL = f"file://{URL}"
41+
return URL
42+
43+
2544
def visit(driver: webdriver, url: str) -> None:
2645
"""Visit given url
2746
@@ -32,7 +51,7 @@ def visit(driver: webdriver, url: str) -> None:
3251
Returns:
3352
None
3453
"""
35-
driver.get(url)
54+
driver.get(is_local(url))
3655

3756

3857
def page_source(driver: webdriver) -> str:
@@ -207,8 +226,8 @@ def take_screenshot(driver: webdriver, element: tuple = None) -> Union[bytes, No
207226
return ele.screenshot_as_png
208227
return None
209228
else:
210-
width = driver.execute_script("return document.body.offsetWidth")
211-
height = driver.execute_script("return document.body.offsetHeight")
229+
width = driver.execute_script("return document.body.parentNode.scrollWidth")
230+
height = driver.execute_script("return document.body.parentNode.scrollHeight")
212231
driver.set_window_size(width, height)
213232
return driver.get_screenshot_as_png()
214233

tests/test_utils.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
"""
2+
Test related to utilities
3+
"""
4+
import os
5+
6+
from s_tool.utils import is_local
7+
8+
9+
def test_local_path():
10+
"""test local file path or URL"""
11+
URL_PATH = "http://www.google.com"
12+
URL_PATH1 = "www.google.com"
13+
LOCAL_PATH = "tests/index.html"
14+
15+
assert URL_PATH == is_local(URL_PATH)
16+
assert "file" in is_local(os.path.abspath(LOCAL_PATH))
17+
assert URL_PATH1 == is_local(URL_PATH1)

0 commit comments

Comments
 (0)