Skip to content

Commit 033161e

Browse files
author
ravishankar
committed
#10 added type annotation
1 parent dbb5845 commit 033161e

File tree

1 file changed

+187
-0
lines changed

1 file changed

+187
-0
lines changed

s_tool/utils.py

Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
from typing import Union
2+
3+
from selenium import webdriver
4+
from selenium.common.exceptions import NoSuchElementException, TimeoutException
5+
from selenium.webdriver.common.by import By
6+
from selenium.webdriver.support import expected_conditions as EC
7+
from selenium.webdriver.support.ui import WebDriverWait
8+
9+
from s_tool.exceptions import SToolException
10+
11+
12+
def get_session(driver: webdriver) -> str:
13+
"""Return Selenium Driver session id"""
14+
return driver.session_id
15+
16+
17+
def visit(driver: webdriver, url: str) -> None:
18+
"""visit given url"""
19+
driver.get(url)
20+
21+
22+
def page_source(driver: webdriver) -> str:
23+
"""Return html page source"""
24+
return driver.page_source
25+
26+
27+
def current_url(driver: webdriver) -> str:
28+
"""Return current url"""
29+
return driver.current_url
30+
31+
32+
def get_locator(locator_type: str, locator_text: str) -> tuple:
33+
"""Return element locator
34+
35+
Args:
36+
locator_type : provide any attribute type
37+
id,class_name,tag_name
38+
xpath, css_selector
39+
40+
locator_text : attribute value
41+
"""
42+
locator = locator_type.upper()
43+
return getattr(By, locator), locator_text
44+
45+
46+
def get_element(
47+
driver: webdriver, locator_type: str, locator_text: str, many: bool = None
48+
):
49+
"""Get element using locator type and locator text
50+
51+
Args:
52+
locator_type : provide any attribute type
53+
id,class_name,tag_name
54+
xpath, css_selector
55+
56+
locator_text : attribute value
57+
58+
many : optional default None,
59+
1: select multiple element
60+
0: select single element
61+
62+
Returns:
63+
Return an element object if found otherwise
64+
return None
65+
"""
66+
67+
locator_type = locator_type.upper()
68+
if hasattr(By, locator_type):
69+
try:
70+
locator = get_locator(locator_type, locator_text)
71+
is_multiple = "s" if many else ""
72+
func = getattr(driver, f"find_element{is_multiple}")
73+
return func(*locator)
74+
except NoSuchElementException:
75+
return None
76+
else:
77+
raise SToolException("INVALID_SELECTOR")
78+
79+
80+
def click(
81+
driver: webdriver, locator_type: str, locator_text: str, click_time: int = 10
82+
) -> Union[bool, None]:
83+
"""Return True if element clicked otherwise return None
84+
85+
Args:
86+
locator_type : provide any attribute type
87+
id,class_name,tag_name
88+
xpath, css_selector
89+
90+
locator_text : attribute value
91+
92+
Returns:
93+
True : If element clicked
94+
None : Not clicked or Not Found
95+
"""
96+
try:
97+
elem_locator = get_locator(locator_type, locator_text)
98+
element = WebDriverWait(driver, click_time).until(
99+
EC.element_to_be_clickable(elem_locator)
100+
)
101+
element.click()
102+
return True
103+
except TimeoutException:
104+
return None
105+
except Exception as ex:
106+
raise SToolException(ex)
107+
108+
109+
def get_cookies(driver: webdriver) -> dict:
110+
"""Accept driver object and return cookies in dictionary
111+
112+
Args:
113+
driver : A selenium WebDriver
114+
115+
Returns:
116+
cookies_dict : return cookies in dicionary format if
117+
no cookies return an empty dictionary
118+
"""
119+
cookies = driver.get_cookies()
120+
cookies_dict = {cookie["name"]: cookie["value"] for cookie in cookies}
121+
return cookies_dict or {}
122+
123+
124+
def take_screenshot(driver: webdriver, element: tuple = None) -> Union[bytes, None]:
125+
"""take screenshot of given element if element is
126+
not given take a full page screeenshot and return
127+
data in bytes
128+
129+
Args:
130+
driver : selenium Webdriver
131+
element : default None, provide element locator
132+
example : element=('id','element_id')
133+
134+
Returns:
135+
returns byte object,if element not present
136+
it will return None.
137+
138+
full screenshot will work only in headless mode.
139+
"""
140+
if element and isinstance(element, tuple):
141+
locator_type, locator_text = element
142+
ele = get_element(driver, locator_type, locator_text)
143+
if ele:
144+
return ele.screenshot_as_png
145+
return None
146+
else:
147+
width = driver.execute_script("return document.body.offsetWidth")
148+
height = driver.execute_script("return document.body.offsetHeight")
149+
driver.set_window_size(width, height)
150+
return driver.get_screenshot_as_png()
151+
152+
153+
def display_element(driver: webdriver, element, hide=None) -> None:
154+
"""hide or show single element
155+
156+
Args:
157+
driver : selenium webdriver
158+
element : an selenium element
159+
hide : default value is None, to hide element
160+
hide=1 to display hidden element
161+
Returns:
162+
None
163+
"""
164+
165+
hide_or_show = "inline" if hide else "None"
166+
driver.execute_script(f"arguments[0].style.display = '{hide_or_show}';", element)
167+
168+
169+
def hide_show_elements(driver: webdriver, elements: list, hide: bool = None) -> None:
170+
"""hide or show multiple elements
171+
172+
Args:
173+
driver : selenium webdriver
174+
elements : list of tuples,[('locator_type','value')]
175+
example : [('id','id_value')]
176+
hide : default value is None, to hide element
177+
hide=1 to display hidden element
178+
179+
Returns:
180+
None
181+
"""
182+
for element_locator in elements:
183+
locator_type, locator_value = element_locator
184+
element_list = get_element(driver, locator_type, locator_value, many=True)
185+
if element_list:
186+
for element in element_list:
187+
display_element(driver, element, hide)

0 commit comments

Comments
 (0)