Source code

Revision control

Copy as Markdown

Other Tools

import asyncio
import pytest
from webdriver.error import WebDriverException
SHADOWROOT_CSS = "#usercentrics-root"
VPN_TEXT = "Access Denied"
COOKIES_CSS = "[data-testid=uc-accept-all-button]"
USERNAME_CSS = "#loginId"
PASSWORD_CSS = "#password"
LOGIN_CSS = "#login-button"
DETECT_CSS = "[data-testid=TestID_autoIdentStartCTA]"
CB_WEBCAM_CSS = "label[for=start-has-webcam]"
CB_DOCUMENTS_CSS = "label[for=start-has-documents]"
CB_AGREE_CSS = "label[for=start-has-agreed]"
PROCEED_CSS = ".btn-proceed"
TRY_DESKTOP_CSS = ".user-transfer-continue-web-desktop-experience"
SUCCESS_CSS = "#readyButton"
FAILURE_CSS = "img[src*=chrome]"
async def start_process(client, credentials):
await client.make_preload_script("delete navigator.__proto__.webdriver")
await client.navigate(URL, wait="none")
shadowRoot, vpn = client.await_first_element_of(
[
client.css(SHADOWROOT_CSS),
client.text(VPN_TEXT),
],
is_displayed=True,
)
if vpn:
pytest.skip("Region-locked, cannot test. Try using a VPN set to Germany.")
return False
def await_css(selector):
return client.execute_async_script(
"""
const [root, selector, done] = arguments;
const i = setInterval(() => {
const v = root.shadowRoot.querySelector(selector);
if (v) {
clearInterval(i);
done(v);
}
}, 100);
""",
shadowRoot,
selector,
)
await_css(COOKIES_CSS).click()
async def click_when_ready(selector):
for _ in range(5):
elem = client.await_css(selector, is_displayed=True)
try:
elem.click()
return elem
except WebDriverException: # element not interactable
await asyncio.sleep(0.5)
(await click_when_ready(USERNAME_CSS)).send_keys(credentials["username"])
(await click_when_ready(PASSWORD_CSS)).send_keys(credentials["password"])
await click_when_ready(LOGIN_CSS)
await click_when_ready(DETECT_CSS)
await click_when_ready(CB_WEBCAM_CSS)
await click_when_ready(CB_DOCUMENTS_CSS)
await click_when_ready(CB_AGREE_CSS)
proceed = client.await_css(PROCEED_CSS, is_displayed=True)
for _ in range(5):
try:
client.soft_click(proceed)
await asyncio.sleep(0.5)
except Exception as e:
print(e)
pass
client.await_css(TRY_DESKTOP_CSS, is_displayed=True).click()
@pytest.mark.only_platforms("linux")
@pytest.mark.asyncio
@pytest.mark.with_interventions
async def test_enabled(client, credentials):
await start_process(client, credentials)
assert client.await_css(SUCCESS_CSS, is_displayed=True)
assert not client.find_css(FAILURE_CSS, is_displayed=True)
@pytest.mark.only_platforms("linux")
@pytest.mark.asyncio
@pytest.mark.without_interventions
async def test_disabled(client, credentials):
await start_process(client, credentials)
assert client.await_css(FAILURE_CSS, is_displayed=True)
assert not client.find_css(SUCCESS_CSS, is_displayed=True)