Skip to content

Commit 96493a7

Browse files
authored
Merge pull request #45 from douglasdcm/add-functions
Add clear_element, is_element_enabled, get_css_value, is_element_selected, get_window_rectangle, get_window_handles
2 parents ed47a6c + 7217376 commit 96493a7

File tree

8 files changed

+373
-36
lines changed

8 files changed

+373
-36
lines changed

caqui/asynchronous.py

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,67 @@ async def __get(url):
3535
raise WebDriverError("'GET' request failed.") from error
3636

3737

38+
async def clear_element(driver_url, session, element):
39+
"""Clear the element text"""
40+
try:
41+
url = f"{driver_url}/session/{session}/element/{element}/clear"
42+
payload = json.dumps({"id": element})
43+
await __post(url, payload)
44+
return True
45+
except Exception as error:
46+
raise WebDriverError("Failed to clear the element text.") from error
47+
48+
49+
async def is_element_enabled(driver_url, session, element):
50+
"""Check if element is enabled"""
51+
try:
52+
url = f"{driver_url}/session/{session}/element/{element}/enabled"
53+
response = await __get(url)
54+
return response.get("value")
55+
except Exception as error:
56+
raise WebDriverError("Failed to check if element is enabled.") from error
57+
58+
59+
async def get_css_value(driver_url, session, element, property_name):
60+
"""Check if element is selected"""
61+
try:
62+
url = f"{driver_url}/session/{session}/element/{element}/css/{property_name}"
63+
response = await __get(url)
64+
return response.get("value")
65+
except Exception as error:
66+
raise WebDriverError("Failed to check if element is selected.") from error
67+
68+
69+
async def is_element_selected(driver_url, session, element):
70+
"""Check if element is selected"""
71+
try:
72+
url = f"{driver_url}/session/{session}/element/{element}/selected"
73+
response = await __get(url)
74+
return response.get("value")
75+
except Exception as error:
76+
raise WebDriverError("Failed to check if element is selected.") from error
77+
78+
79+
async def get_window_rectangle(driver_url, session):
80+
"""Get window rectangle"""
81+
try:
82+
url = f"{driver_url}/session/{session}/window/rect"
83+
response = await __get(url)
84+
return response.get("value")
85+
except Exception as error:
86+
raise WebDriverError("Failed to get window rectangle.") from error
87+
88+
89+
async def get_window_handles(driver_url, session):
90+
"""Get window handles"""
91+
try:
92+
url = f"{driver_url}/session/{session}/window/handles"
93+
response = await __get(url)
94+
return response.get("value")
95+
except Exception as error:
96+
raise WebDriverError("Failed to get window handles.") from error
97+
98+
3899
async def close_window(driver_url, session):
39100
"""Close active window"""
40101
try:
@@ -46,7 +107,7 @@ async def close_window(driver_url, session):
46107

47108

48109
async def get_window(driver_url, session):
49-
"""Get window handle"""
110+
"""Get window"""
50111
try:
51112
url = f"{driver_url}/session/{session}/window"
52113
response = await __get(url)

caqui/synchronous.py

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,62 @@ def __delete(url):
3232
raise WebDriverError("'DELETE' request failed.") from error
3333

3434

35+
def clear_element(driver_url, session, element):
36+
"""Clear the element text"""
37+
try:
38+
url = f"{driver_url}/session/{session}/element/{element}/clear"
39+
payload = json.dumps({"id": element})
40+
__post(url, payload)
41+
return True
42+
except Exception as error:
43+
raise WebDriverError(f"Failed to clear the element text.") from error
44+
45+
46+
def is_element_enabled(driver_url, session, element):
47+
"""Check if element is enabled"""
48+
try:
49+
url = f"{driver_url}/session/{session}/element/{element}/enabled"
50+
return __get(url).get("value")
51+
except Exception as error:
52+
raise WebDriverError(f"Failed to check if element is enabled.") from error
53+
54+
55+
def get_css_value(driver_url, session, element, property_name):
56+
"""Get the css property value"""
57+
try:
58+
url = f"{driver_url}/session/{session}/element/{element}/css/{property_name}"
59+
return __get(url).get("value")
60+
except Exception as error:
61+
raise WebDriverError(f"Failed to get the css property value.") from error
62+
63+
64+
def is_element_selected(driver_url, session, element):
65+
"""Check if element is selected"""
66+
try:
67+
url = f"{driver_url}/session/{session}/element/{element}/selected"
68+
return __get(url).get("value")
69+
except Exception as error:
70+
raise WebDriverError(f"Failed to check if element is selected.") from error
71+
72+
73+
def get_window_rectangle(driver_url, session):
74+
"""Get window rectangle"""
75+
try:
76+
url = f"{driver_url}/session/{session}/window/rect"
77+
return __get(url).get("value")
78+
except Exception as error:
79+
raise WebDriverError(f"Failed to get window rectangle.") from error
80+
81+
82+
def get_window_handles(driver_url, session):
83+
"""Get window handles"""
84+
try:
85+
url = f"{driver_url}/session/{session}/window/handles"
86+
return __get(url).get("value")
87+
except Exception as error:
88+
raise WebDriverError(f"Failed to get window handles.") from error
89+
90+
3591
def close_window(driver_url, session):
3692
"""Close active window"""
3793
try:
@@ -42,7 +98,7 @@ def close_window(driver_url, session):
4298

4399

44100
def get_window(driver_url, session):
45-
"""Get window handle"""
101+
"""Get window"""
46102
try:
47103
url = f"{driver_url}/session/{session}/window"
48104
return __get(url).get("value")

tests/fake_responses.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,47 @@ def dict_to_json(dictionary):
3030
CLOSE_SESSION = DEFAULT
3131
GO_TO_PAGE = DEFAULT
3232

33+
GET_WINDOW_RECTANGLE = dict_to_json(
34+
{
35+
"sessionId": "79e4bd950a886e0119e3760d201b059e",
36+
"status": 0,
37+
"value": {"height": 600, "width": 800, "x": 0, "y": 0},
38+
}
39+
)
40+
41+
42+
CLEAR_ELEMENT = dict_to_json(
43+
{"sessionId": "486fa32a9876b4519e149b39135edcb5", "status": 0, "value": None}
44+
)
45+
46+
IS_ELEMENT_ENABLED = dict_to_json(
47+
{"sessionId": "e0e43cd1ce532b5aa62b6df0de11e3bd", "status": 0, "value": True}
48+
)
49+
50+
GET_CSS_COLOR_VALUE = dict_to_json(
51+
{
52+
"sessionId": "e7f659e7183778e98ce9357051e40a47",
53+
"status": 0,
54+
"value": "rgba(0, 0, 0, 1)",
55+
}
56+
)
57+
58+
IS_ELEMENT_SELECTED = dict_to_json(
59+
{"sessionId": "341d21063846141d2716d300652ddd81", "status": 0, "value": False}
60+
)
61+
62+
GET_WINDOW_HANDLES = dict_to_json(
63+
{
64+
"sessionId": "b3f92cf70d734ecc6fcddbd88671998a",
65+
"status": 0,
66+
"value": ["2E55CCE389196328988ED244DAA52A5D"],
67+
}
68+
)
69+
3370
CLOSE_WINDOW = dict_to_json(
3471
{"sessionId": "48399161591a0bc1dffaa2ff2d65aa0f", "status": 0, "value": []}
3572
)
73+
3674
GET_WINDOW = dict_to_json(
3775
{
3876
"sessionId": "ce68162d420e9cb2b1617c2d1a800f85",

tests/feature/test_sync_and_async.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,84 @@ def __setup():
2525
synchronous.close_session(driver_url, session)
2626

2727

28+
@mark.asyncio
29+
async def test_clear_element(__setup):
30+
driver_url, session = __setup
31+
locator_type = "xpath"
32+
locator_value = "//input"
33+
text = "any"
34+
35+
element = synchronous.find_element(driver_url, session, locator_type, locator_value)
36+
synchronous.send_keys(driver_url, session, element, text)
37+
assert synchronous.clear_element(driver_url, session, element) is True
38+
39+
synchronous.send_keys(driver_url, session, element, text)
40+
assert await asynchronous.clear_element(driver_url, session, element) is True
41+
42+
43+
@mark.asyncio
44+
async def test_is_element_enabled(__setup):
45+
driver_url, session = __setup
46+
locator_type = "xpath"
47+
locator_value = "//input"
48+
49+
element = synchronous.find_element(driver_url, session, locator_type, locator_value)
50+
51+
assert synchronous.is_element_enabled(driver_url, session, element) is True
52+
assert await asynchronous.is_element_enabled(driver_url, session, element) is True
53+
54+
55+
@mark.asyncio
56+
async def test_get_css_value(__setup):
57+
driver_url, session = __setup
58+
locator_type = "xpath"
59+
locator_value = "//input"
60+
property_name = "color"
61+
expected = "rgba(0, 0, 0, 1)"
62+
63+
element = synchronous.find_element(driver_url, session, locator_type, locator_value)
64+
65+
assert (
66+
synchronous.get_css_value(driver_url, session, element, property_name)
67+
== expected
68+
)
69+
assert (
70+
await asynchronous.get_css_value(driver_url, session, element, property_name)
71+
== expected
72+
)
73+
74+
75+
@mark.asyncio
76+
async def test_is_element_selected(__setup):
77+
driver_url, session = __setup
78+
locator_type = "xpath"
79+
locator_value = "//input"
80+
81+
element = synchronous.find_element(driver_url, session, locator_type, locator_value)
82+
83+
assert synchronous.is_element_selected(driver_url, session, element) is False
84+
assert await asynchronous.is_element_selected(driver_url, session, element) is False
85+
86+
87+
@mark.asyncio
88+
async def test_get_window_rectangle(__setup):
89+
driver_url, session = __setup
90+
expected = "height"
91+
92+
assert expected in synchronous.get_window_rectangle(driver_url, session)
93+
rectangle = await asynchronous.get_window_rectangle(driver_url, session)
94+
assert expected in rectangle
95+
96+
97+
@mark.asyncio
98+
async def test_get_window_handles(__setup):
99+
driver_url, session = __setup
100+
101+
assert isinstance(synchronous.get_window_handles(driver_url, session), list)
102+
handles = await asynchronous.get_window_handles(driver_url, session)
103+
assert isinstance(handles, list)
104+
105+
28106
def test_close_window_sync(__setup):
29107
driver_url, session = __setup
30108
assert isinstance(synchronous.close_window(driver_url, session), list)

tests/integration/test_sync_scenarios.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import json
21
from caqui.synchronous import (
32
find_element,
43
get_session,
@@ -8,6 +7,7 @@
87
close_session,
98
go_to_page,
109
get_property,
10+
clear_element,
1111
)
1212
from tests.constants import PAGE_URL
1313
from pytest import fixture
@@ -18,7 +18,7 @@ def __setup():
1818
driver_url = "http://127.0.0.1:9999"
1919
capabilities = {
2020
"desiredCapabilities": {
21-
"browserName": "firefox",
21+
"browserName": "chrome",
2222
"marionette": True,
2323
"acceptInsecureCerts": True,
2424
"goog:chromeOptions": {"extensions": [], "args": ["--headless"]},
@@ -42,6 +42,8 @@ def test_add_text__click_button_and_get_properties(__setup):
4242
input = find_element(driver_url, session, locator_type, locator_value="//input")
4343
send_keys(driver_url, session, input, "any")
4444
assert get_property(driver_url, session, input, property="value") == "any"
45+
clear_element(driver_url, session, input)
46+
assert get_property(driver_url, session, input, property="value") == ""
4547

4648
anchor = find_element(driver_url, session, locator_type, locator_value="//a")
4749
assert (

tests/test_sniffer.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,13 @@ def setup():
2626
driver.quit()
2727

2828

29+
@mark.skip("used just to discover request data")
30+
def test_clear(setup):
31+
driver = setup
32+
element = driver.find_element("xpath", "//input")
33+
assert element.clear() == "any"
34+
35+
2936
@mark.skip("used just to discover request data")
3037
def test_back(setup):
3138
assert setup.back() == "any"

0 commit comments

Comments
 (0)