Skip to content

Commit 3be14eb

Browse files
authored
Merge pull request #73 from douglasdcm/add-gets
Add gets
2 parents be44e4b + 3e3086f commit 3be14eb

File tree

8 files changed

+316
-7
lines changed

8 files changed

+316
-7
lines changed

caqui/asynchronous.py

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

4949

50+
async def take_screenshot_element(
51+
driver_url, session, element, path="/tmp", file_name="caqui"
52+
):
53+
"""Take screenshot of element"""
54+
try:
55+
url = f"{driver_url}/session/{session}/element/{element}/screenshot"
56+
response = await __get(url)
57+
picture = response.get("value")
58+
helper.save_picture(session, path, file_name, picture)
59+
return True
60+
except Exception as error:
61+
raise WebDriverError(f"Failed to take screenshot.") from error
62+
63+
64+
async def take_screenshot(driver_url, session, path="/tmp", file_name="caqui"):
65+
"""Take screenshot"""
66+
try:
67+
url = f"{driver_url}/session/{session}/screenshot"
68+
response = await __get(url)
69+
picture = response.get("value")
70+
helper.save_picture(session, path, file_name, picture)
71+
return True
72+
except Exception as error:
73+
raise WebDriverError(f"Failed to take screenshot.") from error
74+
75+
76+
async def get_named_cookie(driver_url, session, name):
77+
"""Get cookie by name"""
78+
try:
79+
url = f"{driver_url}/session/{session}/cookie/{name}"
80+
response = await __get(url)
81+
return response.get("value")
82+
except Exception as error:
83+
raise WebDriverError(f"Failed to get cookie '{name}'.") from error
84+
85+
86+
async def get_computed_label(driver_url, session, element):
87+
"""Get the element tag computed label. Get the accessibility name"""
88+
try:
89+
url = f"{driver_url}/session/{session}/element/{element}/computedlabel"
90+
response = await __get(url)
91+
return response.get("value")
92+
except Exception as error:
93+
raise WebDriverError("Failed to get element computed label.") from error
94+
95+
96+
async def get_computed_role(driver_url, session, element):
97+
"""Get the element tag computed role (the element role)"""
98+
try:
99+
url = f"{driver_url}/session/{session}/element/{element}/computedrole"
100+
response = await __get(url)
101+
return response.get("value")
102+
except Exception as error:
103+
raise WebDriverError("Failed to get element computed role.") from error
104+
105+
106+
async def get_tag_name(driver_url, session, element):
107+
"""Get the element tag name"""
108+
try:
109+
url = f"{driver_url}/session/{session}/element/{element}/name"
110+
response = await __get(url)
111+
return response.get("value")
112+
except Exception as error:
113+
raise WebDriverError("Failed to get element name.") from error
114+
115+
116+
async def get_shadow_root(driver_url, session, element):
117+
"""Get the shadow root element"""
118+
try:
119+
url = f"{driver_url}/session/{session}/element/{element}/shadow"
120+
response = await __get(url)
121+
return response.get("value")
122+
except Exception as error:
123+
raise WebDriverError("Failed to get element shadow.") from error
124+
125+
50126
async def get_rect(driver_url, session, element):
51127
"""Get the element rectangle"""
52128
try:

caqui/helper.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
import base64
2+
3+
4+
def save_picture(session, path, file_name, response):
5+
with open(f"{path}/{file_name}-{session}.png", "wb") as f:
6+
f.write(base64.b64decode((response)))
7+
8+
19
def get_elements(response):
210
values = response.get("value")
311
return [list(value.values())[0] for value in values]

caqui/synchronous.py

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

4949

50+
# def add_cookie(driver_url, session, name, value):
51+
# """Add cookie by name"""
52+
# try:
53+
# url = f"{driver_url}/session/{session}/cookie"
54+
# payload = {"cookie": {"name": name, "value": value}}
55+
# __post(url, payload)
56+
# return True
57+
# except Exception as error:
58+
# raise WebDriverError(f"Failed to add cookie '{name}'.") from error
59+
60+
61+
def take_screenshot_element(
62+
driver_url, session, element, path="/tmp", file_name="caqui"
63+
):
64+
"""Take screenshot of element."""
65+
try:
66+
url = f"{driver_url}/session/{session}/element/{element}/screenshot"
67+
response = __get(url).get("value")
68+
helper.save_picture(session, path, file_name, response)
69+
return True
70+
except Exception as error:
71+
raise WebDriverError(f"Failed to take screeshot.") from error
72+
73+
74+
def take_screenshot(driver_url, session, path="/tmp", file_name="caqui"):
75+
"""Take screenshot."""
76+
try:
77+
url = f"{driver_url}/session/{session}/screenshot"
78+
response = __get(url).get("value")
79+
helper.save_picture(session, path, file_name, response)
80+
return True
81+
except Exception as error:
82+
raise WebDriverError(f"Failed to take screeshot.") from error
83+
84+
85+
def get_named_cookie(driver_url, session, name):
86+
"""Get cookie by name."""
87+
try:
88+
url = f"{driver_url}/session/{session}/cookie/{name}"
89+
return __get(url).get("value")
90+
except Exception as error:
91+
raise WebDriverError(f"Failed to get the cookie '{name}'.") from error
92+
93+
94+
def get_computed_label(driver_url, session, element):
95+
"""Get the element computed label. Get the accessibility name."""
96+
try:
97+
url = f"{driver_url}/session/{session}/element/{element}/computedlabel"
98+
return __get(url).get("value")
99+
except Exception as error:
100+
raise WebDriverError(f"Failed to get the element computed label.") from error
101+
102+
103+
def get_computed_role(driver_url, session, element):
104+
"""Get the element computed role (the element role)"""
105+
try:
106+
url = f"{driver_url}/session/{session}/element/{element}/computedrole"
107+
return __get(url).get("value")
108+
except Exception as error:
109+
raise WebDriverError(f"Failed to get the element computed role.") from error
110+
111+
112+
def get_tag_name(driver_url, session, element):
113+
"""Get the element tag name"""
114+
try:
115+
url = f"{driver_url}/session/{session}/element/{element}/name"
116+
return __get(url).get("value")
117+
except Exception as error:
118+
raise WebDriverError(f"Failed to get the element name.") from error
119+
120+
121+
def get_shadow_root(driver_url, session, element):
122+
"""Get the shadow root element"""
123+
try:
124+
url = f"{driver_url}/session/{session}/element/{element}/shadow"
125+
return __get(url).get("value")
126+
except Exception as error:
127+
raise WebDriverError(f"Failed to get the element shadow.") from error
128+
129+
50130
def get_rect(driver_url, session, element):
51131
"""Get the element rectangle"""
52132
try:

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ exclude = ["tests*", "utils", ".vscode", ".git*", "dist"]
88

99
[project]
1010
name = "caqui"
11-
version = "1.14.0"
11+
version = "1.15.0"
1212
authors = [
1313
{ name="Douglas Cardoso", email="noemail@noemail.com" },
1414
]

tests/fake_responses.py

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

46+
GET_NAMED_COOKIE = dict_to_json(
47+
{
48+
"value": {
49+
"name": "username",
50+
"value": "John Doe",
51+
"path": "//home/user/fullpath",
52+
"domain": "",
53+
"secure": False,
54+
"httpOnly": False,
55+
"sameSite": "None",
56+
}
57+
}
58+
)
59+
4660
GET_RECT = dict_to_json(
4761
{
4862
"sessionId": "a9d6e77726f3eda12e92b06b5066dbb4",

tests/feature/test_sync_and_async.py

Lines changed: 104 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ def __setup():
1111
"desiredCapabilities": {
1212
"name": "webdriver",
1313
"browserName": "chrome",
14-
"marionette": True,
14+
"marionette": False,
1515
"acceptInsecureCerts": True,
1616
"goog:chromeOptions": {"extensions": [], "args": ["--headless"]},
1717
}
@@ -26,6 +26,106 @@ def __setup():
2626
synchronous.close_session(driver_url, session)
2727

2828

29+
@mark.asyncio
30+
async def test_take_screenshot_element(__setup):
31+
driver_url, session = __setup
32+
locator_type = "css selector"
33+
locator_value = "#alert-button"
34+
35+
element = synchronous.find_element(driver_url, session, locator_type, locator_value)
36+
37+
assert synchronous.take_screenshot_element(driver_url, session, element) is True
38+
assert (
39+
await asynchronous.take_screenshot_element(driver_url, session, element) is True
40+
)
41+
42+
43+
@mark.asyncio
44+
async def test_take_screenshot(__setup):
45+
driver_url, session = __setup
46+
47+
assert synchronous.take_screenshot(driver_url, session) is True
48+
assert await asynchronous.take_screenshot(driver_url, session) is True
49+
50+
51+
@mark.skip(reason="works just with Firefox")
52+
@mark.asyncio
53+
async def test_get_named_cookie(__setup):
54+
driver_url, session = __setup
55+
name = "username" # cookie created on page load
56+
expected = "John Doe"
57+
58+
assert (
59+
synchronous.get_named_cookie(driver_url, session, name).get("value") == expected
60+
)
61+
response = await asynchronous.get_named_cookie(driver_url, session, name)
62+
assert response.get("value") == expected
63+
64+
65+
@mark.asyncio
66+
async def test_get_computed_label(__setup):
67+
driver_url, session = __setup
68+
locator_type = "css selector"
69+
locator_value = "#alert-button"
70+
expected = "alert"
71+
72+
element = synchronous.find_element(driver_url, session, locator_type, locator_value)
73+
74+
assert synchronous.get_computed_label(driver_url, session, element) == expected
75+
76+
assert (
77+
await asynchronous.get_computed_label(driver_url, session, element) == expected
78+
)
79+
80+
81+
@mark.asyncio
82+
async def test_get_computed_role(__setup):
83+
driver_url, session = __setup
84+
locator_type = "xpath"
85+
locator_value = "//input"
86+
expected = "textbox"
87+
88+
element = synchronous.find_element(driver_url, session, locator_type, locator_value)
89+
90+
assert synchronous.get_computed_role(driver_url, session, element) == expected
91+
92+
assert (
93+
await asynchronous.get_computed_role(driver_url, session, element) == expected
94+
)
95+
96+
97+
@mark.asyncio
98+
async def test_get_tag_name(__setup):
99+
driver_url, session = __setup
100+
locator_type = "xpath"
101+
locator_value = "//input"
102+
expected = "input"
103+
104+
element = synchronous.find_element(driver_url, session, locator_type, locator_value)
105+
106+
assert synchronous.get_tag_name(driver_url, session, element) == expected
107+
108+
assert await asynchronous.get_tag_name(driver_url, session, element) == expected
109+
110+
111+
@mark.asyncio
112+
async def test_get_shadow_root(__setup):
113+
driver_url, session = __setup
114+
locator_type = "id"
115+
locator_value = "shadow-root"
116+
root_element = "shadow-6066-11e4-a52e-4f735466cecf"
117+
118+
element = synchronous.find_element(driver_url, session, locator_type, locator_value)
119+
120+
assert (
121+
synchronous.get_shadow_root(driver_url, session, element).get(root_element)
122+
is not None
123+
)
124+
125+
response = await asynchronous.get_shadow_root(driver_url, session, element)
126+
assert response.get(root_element) is not None
127+
128+
29129
@mark.asyncio
30130
async def test_get_rect(__setup):
31131
driver_url, session = __setup
@@ -111,7 +211,7 @@ async def test_set_timeouts(__setup):
111211
@mark.asyncio
112212
async def test_find_children_elements(__setup):
113213
driver_url, session = __setup
114-
expected = 5 # parent inclusive
214+
expected = 1 # parent inclusive
115215
locator_type = "xpath"
116216
locator_value = "//div"
117217

@@ -123,13 +223,13 @@ async def test_find_children_elements(__setup):
123223
driver_url, session, parent_element, locator_type, locator_value
124224
)
125225

126-
assert len(children_elements) == expected
226+
assert len(children_elements) > expected
127227

128228
children_elements = await asynchronous.find_children_elements(
129229
driver_url, session, parent_element, locator_type, locator_value
130230
)
131231

132-
assert len(children_elements) == expected
232+
assert len(children_elements) > expected
133233

134234

135235
@mark.asyncio
@@ -354,7 +454,6 @@ async def test_get_attribute(__setup):
354454
@mark.asyncio
355455
async def test_get_cookies(__setup):
356456
driver_url, session = __setup
357-
358457
assert isinstance(synchronous.get_cookies(driver_url, session), list)
359458
cookies = await asynchronous.get_cookies(driver_url, session)
360459
assert isinstance(cookies, list)

0 commit comments

Comments
 (0)