Skip to content

Commit be44e4b

Browse files
authored
Merge pull request #72 from douglasdcm/add-rect
Add get_rect
2 parents fc9a44a + fd7b97b commit be44e4b

File tree

8 files changed

+90
-10
lines changed

8 files changed

+90
-10
lines changed

caqui/asynchronous.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,17 @@ async def __get(url):
4747
raise WebDriverError("'GET' request failed.") from error
4848

4949

50-
async def actions(driver_url, session, element, payload):
50+
async def get_rect(driver_url, session, element):
51+
"""Get the element rectangle"""
52+
try:
53+
url = f"{driver_url}/session/{session}/element/{element}/rect"
54+
response = await __get(url)
55+
return response.get("value")
56+
except Exception as error:
57+
raise WebDriverError("Failed to get element rect.") from error
58+
59+
60+
async def actions(driver_url, session, payload):
5161
url = f"{driver_url}/session/{session}/actions"
5262
await __post(url, payload)
5363
return True
@@ -75,7 +85,7 @@ async def actions_scroll_to_element(driver_url, session, element):
7585
}
7686
]
7787
}
78-
return await actions(driver_url, session, element, payload)
88+
return await actions(driver_url, session, payload)
7989
except Exception as error:
8090
raise WebDriverError(f"Failed to scroll to element.") from error
8191

@@ -129,7 +139,7 @@ async def actions_click(driver_url, session, element):
129139
},
130140
]
131141
}
132-
return await actions(driver_url, session, element, payload)
142+
return await actions(driver_url, session, payload)
133143
except Exception as error:
134144
raise WebDriverError(f"Failed to click the element.") from error
135145

caqui/synchronous.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,18 @@ def __delete(url):
4747
raise WebDriverError("'DELETE' request failed.") from error
4848

4949

50+
def get_rect(driver_url, session, element):
51+
"""Get the element rectangle"""
52+
try:
53+
url = f"{driver_url}/session/{session}/element/{element}/rect"
54+
return __get(url).get("value")
55+
except Exception as error:
56+
raise WebDriverError(f"Failed to get the element rect.") from error
57+
58+
5059
def actions_scroll_to_element(driver_url, session, element):
5160
"""Scroll to an element simulating a mouse movement"""
5261
try:
53-
url = f"{driver_url}/session/{session}/actions"
5462
payload = {
5563
"actions": [
5664
{
@@ -70,12 +78,17 @@ def actions_scroll_to_element(driver_url, session, element):
7078
}
7179
]
7280
}
73-
__post(url, payload)
74-
return True
81+
return actions(driver_url, session, payload)
7582
except Exception as error:
7683
raise WebDriverError(f"Failed to scroll to element.") from error
7784

7885

86+
def actions(driver_url, session, payload):
87+
url = f"{driver_url}/session/{session}/actions"
88+
__post(url, payload)
89+
return True
90+
91+
7992
def submit(driver_url, session, element):
8093
"""Submit a form. It is similar to 'submit' funtion in Seleniu
8194
It is not part of W3C WebDriver. Just added for convenience
@@ -96,7 +109,6 @@ def submit(driver_url, session, element):
96109
def actions_click(driver_url, session, element):
97110
"""Click an element simulating a mouse movement"""
98111
try:
99-
url = f"{driver_url}/session/{session}/actions"
100112
payload = {
101113
"actions": [
102114
{
@@ -126,8 +138,7 @@ def actions_click(driver_url, session, element):
126138
},
127139
]
128140
}
129-
__post(url, payload)
130-
return True
141+
return actions(driver_url, session, payload)
131142
except Exception as error:
132143
raise WebDriverError(f"Failed to click the element.") from error
133144

tests/fake_responses.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,14 @@ def json(self):
4343
CLOSE_SESSION = DEFAULT
4444
GO_TO_PAGE = DEFAULT
4545

46+
GET_RECT = dict_to_json(
47+
{
48+
"sessionId": "a9d6e77726f3eda12e92b06b5066dbb4",
49+
"status": 0,
50+
"value": {"height": 23, "width": 183, "x": 10, "y": 9652.12},
51+
}
52+
)
53+
4654
ACTIONS = dict_to_json(
4755
{"sessionId": "449dbd1df001e9a9e13b3bac5babe809", "status": 0, "value": "null"}
4856
)

tests/feature/test_sync_and_async.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,20 @@ def __setup():
2626
synchronous.close_session(driver_url, session)
2727

2828

29+
@mark.asyncio
30+
async def test_get_rect(__setup):
31+
driver_url, session = __setup
32+
locator_type = "xpath"
33+
locator_value = "//input"
34+
expected = {"height": 21, "width": 185, "x": 8, "y": 100.4375}
35+
36+
element = synchronous.find_element(driver_url, session, locator_type, locator_value)
37+
38+
assert synchronous.get_rect(driver_url, session, element) == expected
39+
40+
assert await asynchronous.get_rect(driver_url, session, element) == expected
41+
42+
2943
@mark.asyncio
3044
async def test_actions_scroll_to_element(__setup):
3145
driver_url, session = __setup

tests/html/playground.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ <h1>Basic page</h1>
1616
<a href="http://any4.com" id="a4">any4.com</a><br>
1717
<br>
1818
<button id="alert-button" onclick="openAlert()">alert</button>
19+
<button hidden id="hidden-button" style="display: none;" onclick="openAlert()">hidden</button>
1920
<br>
2021
<p id="end">end</p>
21-
2222
<div class="parent">
2323
any0
2424
<div class="child1">any1</div>

tests/integration/test_sync_scenarios.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
go_to_page,
99
get_property,
1010
clear_element,
11+
get_rect,
12+
get_css_value,
13+
get_attribute,
1114
)
1215
from tests.constants import PAGE_URL
1316
from pytest import fixture
@@ -34,6 +37,23 @@ def __setup():
3437
close_session(driver_url, session)
3538

3639

40+
def test_get_data_from_hidden_button(__setup):
41+
driver_url, session = __setup
42+
locator_type = "xpath"
43+
44+
hidden_button = find_element(
45+
driver_url, session, locator_type, locator_value="//*[@id='hidden-button']"
46+
)
47+
48+
assert "width" in get_rect(driver_url, session, hidden_button)
49+
assert "visible" == get_css_value(driver_url, session, hidden_button, "visibility")
50+
assert True == get_property(driver_url, session, hidden_button, "hidden")
51+
assert ["display"] == get_property(driver_url, session, hidden_button, "style")
52+
assert "display: none;" == get_attribute(
53+
driver_url, session, hidden_button, "style"
54+
)
55+
56+
3757
def test_add_text__click_button_and_get_properties(__setup):
3858
driver_url, session = __setup
3959
expected = "end"

tests/unit/test_async_unit.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,17 @@ async def mock_request(*args):
1111
pass
1212

1313

14+
@mark.asyncio
15+
async def test_get_rect():
16+
expected = {"height": 23, "width": 183, "x": 10, "y": 9652.12}
17+
18+
async def mock_request(*args):
19+
return fake_responses.GET_RECT
20+
21+
with patch("caqui.asynchronous.__get", mock_request):
22+
assert await asynchronous.get_rect("", "", "") == expected
23+
24+
1425
@mark.asyncio
1526
async def test_actions_scroll_to_element():
1627
async def mock_request(*args):

tests/unit/test_sync_unit.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@
33
from tests import fake_responses
44

55

6+
@patch("requests.request", return_value=fake_responses.GET_RECT)
7+
def test_get_rect(*args):
8+
expected = {"height": 23, "width": 183, "x": 10, "y": 9652.12}
9+
assert synchronous.get_rect("", "", "") == expected
10+
11+
612
@patch("requests.request", return_value=fake_responses.ACTIONS)
713
def test_actions_scroll_to_element(*args):
814
assert synchronous.actions_scroll_to_element("", "", "") == True

0 commit comments

Comments
 (0)