Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add missing methods #79

Merged
merged 1 commit into from
Jul 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 28 additions & 2 deletions caqui/asynchronous.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,27 @@ async def __handle_window(driver_url, session, command):
return True


async def add_cookie(driver_url, session, cookie):
"""Refresh page"""
try:
url = f"{driver_url}/session/{session}/cookie"
payload = {"cookie": cookie}
await __post(url, payload)
return True
except Exception as error:
raise WebDriverError(f"Failed to add cookie.") from error


async def delete_cookie(driver_url, session, name):
"""Delete cookie by name"""
try:
url = f"{driver_url}/session/{session}/cookie/{name}"
await __delete(url)
return True
except Exception as error:
raise WebDriverError(f"Failed to delete cookie '{name}'.") from error


async def refresh_page(driver_url, session):
"""Refresh page"""
try:
Expand Down Expand Up @@ -276,9 +297,10 @@ async def get_tag_name(driver_url, session, element):
async def get_shadow_root(driver_url, session, element):
"""Get the shadow root element"""
try:
root_element = "shadow-6066-11e4-a52e-4f735466cecf"
url = f"{driver_url}/session/{session}/element/{element}/shadow"
response = await __get(url)
return response.get("value")
return response.get("value", {}).get(root_element)
except Exception as error:
raise WebDriverError("Failed to get element shadow.") from error

Expand Down Expand Up @@ -396,7 +418,11 @@ async def set_timeouts(driver_url, session, timeouts):
async def find_children_elements(
driver_url, session, parent_element, locator_type, locator_value
):
"""Find the children elements by 'locator_type'"""
"""Find the children elements by 'locator_type'

If the 'parent_element' is a shadow element, set the 'locator_type' as 'id' or
'css selector'
"""
try:
url = f"{driver_url}/session/{session}/element/{parent_element}/elements"
payload = {"using": locator_type, "value": locator_value, "id": parent_element}
Expand Down
30 changes: 28 additions & 2 deletions caqui/synchronous.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,27 @@ def __handle_window(driver_url, session, command):
return True


def add_cookie(driver_url, session, cookie):
"""Add cookie"""
try:
url = f"{driver_url}/session/{session}/cookie"
payload = {"cookie": cookie}
__post(url, payload)
return True
except Exception as error:
raise WebDriverError(f"Failed to add cookie.") from error


def delete_cookie(driver_url, session, name):
"""Delete cookie by name"""
try:
url = f"{driver_url}/session/{session}/cookie/{name}"
__delete(url)
return True
except Exception as error:
raise WebDriverError(f"Failed to delete cookie '{name}'.") from error


def refresh_page(driver_url, session):
"""Refresh page"""
try:
Expand Down Expand Up @@ -276,8 +297,9 @@ def get_tag_name(driver_url, session, element):
def get_shadow_root(driver_url, session, element):
"""Get the shadow root element"""
try:
root_element = "shadow-6066-11e4-a52e-4f735466cecf"
url = f"{driver_url}/session/{session}/element/{element}/shadow"
return __get(url).get("value")
return __get(url).get("value",{}).get(root_element)
except Exception as error:
raise WebDriverError(f"Failed to get the element shadow.") from error

Expand Down Expand Up @@ -394,7 +416,11 @@ def set_timeouts(driver_url, session, timeouts):
def find_children_elements(
driver_url, session, parent_element, locator_type, locator_value
):
"""Find the children elements by 'locator_type'"""
"""Find the children elements by 'locator_type'

If the 'parent_element' is a shadow element, set the 'locator_type' as 'id' or
'css selector'
"""
try:
url = f"{driver_url}/session/{session}/element/{parent_element}/elements"
payload = {"using": locator_type, "value": locator_value, "id": parent_element}
Expand Down
127 changes: 121 additions & 6 deletions tests/feature/test_sync_and_async.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,60 @@ def __setup():
synchronous.close_session(driver_url, session)


@mark.asyncio
async def test_add_cookie(__setup):
driver_url, session = __setup
# Need to navigate to a web page. If use 'playgound.html' the error
# 'Document is cookie-averse' happens
synchronous.go_to_page(
driver_url,
session,
"http://www.google.com",
)
cookies_before = synchronous.get_cookies(driver_url, session)

cookie = cookies_before[0]
cookie["name"] = "other"

assert synchronous.add_cookie(driver_url, session, cookie) is True
cookies_after = synchronous.get_cookies(driver_url, session)
assert len(cookies_after) > len(cookies_before)

cookies_before = cookies_after
cookie = cookies_before[0]
cookie["name"] = "another"

assert await asynchronous.add_cookie(driver_url, session, cookie) is True
cookies_after = synchronous.get_cookies(driver_url, session)
assert len(cookies_after) > len(cookies_before)


@mark.skip(reason="works just in firefox")
@mark.asyncio
async def test_delete_cookie_asynchronous(__setup):
driver_url, session = __setup
cookies = synchronous.get_cookies(driver_url, session)
name = cookies[0].get("name")
zero = 0

assert await asynchronous.delete_cookie(driver_url, session, name) is True
cookies = synchronous.get_cookies(driver_url, session)
assert len(cookies) == zero


@mark.skip(reason="works just in firefox")
@mark.asyncio
def test_delete_cookie_synchronous(__setup):
driver_url, session = __setup
cookies = synchronous.get_cookies(driver_url, session)
name = cookies[0].get("name")
zero = 0

assert synchronous.delete_cookie(driver_url, session, name) is True
cookies = synchronous.get_cookies(driver_url, session)
assert len(cookies) == zero


@mark.asyncio
async def test_refresh_page(__setup):
driver_url, session = __setup
Expand Down Expand Up @@ -339,20 +393,32 @@ async def test_take_screenshot(__setup):
assert await asynchronous.take_screenshot(driver_url, session) is True


@mark.skip(reason="works just in firefox")
@mark.asyncio
async def test_delete_cookies_asynchronous(__setup):
driver_url, session = __setup

cookies_before = synchronous.get_cookies(driver_url, session)

response = await asynchronous.delete_all_cookies(driver_url, session)
assert response is True

cookies_after = synchronous.get_cookies(driver_url, session)
assert len(cookies_before) != len(cookies_after)


@mark.skip(reason="works just in firefox")
@mark.asyncio
async def test_delete_cookies_synchronous(__setup):
driver_url, session = __setup

cookies_before = synchronous.get_cookies(driver_url, session)

assert synchronous.delete_all_cookies(driver_url, session) is True

cookies_after = synchronous.get_cookies(driver_url, session)
assert len(cookies_before) != len(cookies_after)


@mark.skip(reason="works just with Firefox")
@mark.asyncio
Expand Down Expand Up @@ -414,22 +480,71 @@ async def test_get_tag_name(__setup):
assert await asynchronous.get_tag_name(driver_url, session, element) == expected


@mark.parametrize(
"locator, value", [("id", "shadow-button"), ("css selector", "button")]
)
@mark.asyncio
async def test_get_shadow_root(__setup):
async def test_find_element_from_shadow_root(__setup, locator, value):
driver_url, session = __setup
locator_type = "id"
locator_value = "shadow-root"
root_element = "shadow-6066-11e4-a52e-4f735466cecf"

element = synchronous.find_element(driver_url, session, locator_type, locator_value)

assert (
synchronous.get_shadow_root(driver_url, session, element).get(root_element)
is not None
shadow_root = synchronous.get_shadow_root(driver_url, session, element)

actual = synchronous.find_child_element(
driver_url, session, shadow_root, locator, value
)

assert actual is not None

actual = await asynchronous.find_child_element(
driver_url, session, shadow_root, locator, value
)

assert actual is not None


@mark.parametrize(
"locator, value", [("id", "shadow-button"), ("css selector", "button")]
)
@mark.asyncio
async def test_find_elements_from_shadow_root(__setup, locator, value):
driver_url, session = __setup
locator_type = "id"
locator_value = "shadow-root"
one = 1

element = synchronous.find_element(driver_url, session, locator_type, locator_value)

shadow_root = synchronous.get_shadow_root(driver_url, session, element)

actual = synchronous.find_children_elements(
driver_url, session, shadow_root, locator, value
)

assert len(actual) == one

actual = await asynchronous.find_children_elements(
driver_url, session, shadow_root, locator, value
)

assert len(actual) == one


@mark.asyncio
async def test_get_shadow_root(__setup):
driver_url, session = __setup
locator_type = "id"
locator_value = "shadow-root"

element = synchronous.find_element(driver_url, session, locator_type, locator_value)

assert synchronous.get_shadow_root(driver_url, session, element) is not None

response = await asynchronous.get_shadow_root(driver_url, session, element)
assert response.get(root_element) is not None
assert response is not None


@mark.asyncio
Expand Down
2 changes: 2 additions & 0 deletions tests/html/playground.html
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ <h1>Basic page</h1>
<p>Paragraph</p>
</div>
<div id="shadow-root"></div>
<!---->
<iframe id="my-iframe" src="iframe.html" height="200" width="300" title="Iframe Example"></iframe>

<!-- -->
Expand All @@ -60,6 +61,7 @@ <h1>Basic page</h1>
let shadow = shadowTarget.attachShadow({ mode: "open" });

let shadowButton = document.createElement("button");
shadowButton.setAttribute("id", "shadow-button");
let shadowParagraph = document.createElement("p");
shadowButton.type = "button";
shadowButton.innerHTML = "Click Shadow";
Expand Down